微信公众平台开发 OAuth2.0网页授权认证
- 格式:docx
- 大小:87.10 KB
- 文档页数:11
微信公众平台开发OAuth2.0网页授权认证一、什么是OAuth2.0官方网站:/ /2/权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。
OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。
每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。
这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。
新浪微博API目前也使用OAuth 2.0。
二、微信公众平台OAuth2.0授权微信公众平台OAuth2.0授权详细步骤如下:1. 用户关注微信公众账号。
2. 微信公众账号提供用户请求授权页面URL。
3. 用户点击授权页面URL,将向服务器发起请求4. 服务器询问用户是否同意授权给微信公众账号(scope为snsapi_base时无此步骤)5. 用户同意(scope为snsapi_base时无此步骤)6. 服务器将CODE通过回调传给微信公众账号7. 微信公众账号获得CODE8. 微信公众账号通过CODE向服务器请求Access Token9. 服务器返回Access Token和OpenID给微信公众账号10. 微信公众账号通过Access Token向服务器请求用户信息(scope为snsapi_base时无此步骤)11. 服务器将用户信息回送给微信公众账号(scope为snsapi_base时无此步骤)如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。
利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。
请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。
)”微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调域名。
请注意,这里填写的域名不要加http://关于配置授权回调域名的说明:具体而言,网页授权流程分为四步:1.引导用户进入授权页面同意授权,获取code2.通过code换取网页授权access_token(与基础支持中的access_token不同)3.如果需要,开发者可以刷新网页授权access_token,避免过期4.通过网页授权access_token和openid获取用户基本信息在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:下图为scope等于snsapi_userinfo时的授权页面:用户同意授权后如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE第二步:通过code换取网页授权access_token首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。
公众号可通过下述接口来获取网页授权access_token。
如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
请求方法全局返回码说明第三步:刷新access_token(如果需要)由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
请求方法正确时返回的JSON数据包如下:全局返回码说明第四步:拉取用户信息(需scope为snsapi_userinfo)如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法全局返回码说明附:检验授权凭证(access_token)是否有效请求方法错误时的Json返回示例:案例代码:请求授权页面的构造方式url在线编码工具:/encode?type=4前端代码<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""/TR/html4/strict.dtd";><html><head><meta http-equiv="Content -Type" content="text/html; charset=UTF-8" /><meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-s cale=1.0,user-scalable=no;"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="format-detection"content="telephone=no"><title>会员注册</title><script type="text/javascript" src="jquery.js"></script><script type="text/javascript">function callback(result) {alert('cucess');alert(result); //输出openid}function getQueryString(name) {varreg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");var r = window.location.search.substr(1).match(reg);if (r != null) return unescape(r[2]); return null;}var code = getQueryString("code");$.ajax({async: false, url: "/oauth2.php", //这是我的服务端处理文件php的type: "GET", //下面几行是jsoup,如果去掉下面几行的注释,后端对应的返回结果也要去掉注释// dataType: 'jsonp',// jsonp: 'callback', //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象.// jsonpCallback:'callback',data: {code:code}, //传递本页面获取的code到后台,以便后台获取openidtimeout: 5000,success: function (result) {callback(result);},error: function (jqXHR, textStatus, errorThrown) {alert(textStatus); }});</script></head><body></body>后端代码<?php$code = $_GET['code'];//前端传来的code值$appid = "wx468622291a1e99d6";$appsecret = "98566dc38863aa4395fabebb0de6ecc1";//获取openid$url ="https:///sns/oauth2/access_token?appid=$appid&secret=$appsecret &code=$code&grant_type=authorization_code";$result = https_request($url);$jsoninfo = json_decode($result, true);$openid = $jsoninfo["openid"];//从返回json结果中读出openid$access_token = $jsoninfo["access_token"];//从返回json结果中读出openid $callback=$_GET['callback']; // echo $callback."({result:'".$openid."'})";$url1 ="https:///sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";$result1 = https_request($url1);$jsoninfo1 = json_decode($result1, true);$nickname=$jsoninfo1["nickname"];echo $openid.":".$access_token.":".$nickname; //把openid 送回前端 function https_request($url,$data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;}?>。