【转】微信公众平台开发 OAuth2.0网页授权认证

一、什么叫OAuth2.0

官方网网站:http://oauth.net/   http://oauth.net/2/

权威性界定:OAuth is An open protocol to allow secure authorization in a ** 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. 微信公众账号得到CODE

8. 微信公众账号根据CODE向网络服务器要求Access Token

9. 缺少对象Access Token和OpenID给微信公众账号

10. 微信公众账号根据Access Token向网络服务器要求用户信息内容(scope为snsapi_base时不存在流程)

11. 网络服务器将用户信息内容回赠给微信公众账号(scope为snsapi_base时不存在流程)

假如用户在微信中(Web手机微信以外)浏览微信公众号的第三方网页,公众号开发者可以根据此插口获取现阶段用户基本信息(包含呢称、性別、大城市、我国)。运用用户信息内容,可以完成感受提升、用户由来统计分析、账号关联、用户真实身份身份验证等作用。一定要注意,“获取用户基本信息插口是在用户和微信公众号造成信息互动时,才可以依据用户OpenID获取用户基本信息,而网页受权的方法获取用户基本信息,则不用信息互动,仅仅用户进到到微信公众号的网页,就可弹出来要求用户受权的页面,用户受权后,就可得到其基本信息(此全过程乃至不用用户早已扫码关注。)”

手机微信OAuth2.0授权登录让微信用户使用微信真实身份安全登录第三方应用或网站,在微信用户授权登录已连接手机微信OAuth2.0的第三方应用后,第三方可以获取到用户的端口启用凭据(access_token),根据access_token可以开展微信开放平台受权关联插口启用,进而可完成获取手机微信用户基本上对外开放数据和协助用户完成基本对外开放作用等。

在微信公众平台要求用户网页受权以前,开发人员必须先去微信公众号网站的我的服务页中配备受权调整域名。一定要注意,这儿填好的域名不必加http://

有关配备受权调整域名的表明:

受权调整域名配备标准为全域名,例如必须网页受权的域名为: ** .qq.com,配备之后此域名下边的网页页面http:// ** .qq.com/music.html 、 http:// ** .qq.com/login.html 都能够开展OAuth2.0身份验证。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com  没法开展OAuth2.0身份验证。

具体来说,网页受权步骤分成四步:

正确引导用户进到受权网页页面允许受权,获取code

根据code获得网页受权access_token(与基本适用中的access_token不一样)

假如必须,开发人员可以更新网页受权access_token,防止到期

根据网页受权access_token和openid获取用户基本信息

文件目录

[掩藏]

1第一步:用户允许受权,获取code

2第二步:根据code获得网页受权access_token

3第三步:刷新access_token(假如必须)

4第四步:获取用户信息内容(需scope为 snsapi_userinfo)

5附:检测受权凭据(access_token)是不是合理

第一步:用户允许受权,获取code

在保证 微信公众账号有着受权修饰符(scope主要参数)的管理权限的条件下(微信服务号得到高級插口后,默认设置含有scope主要参数中的snsapi_base和snsapi_userinfo),引导关注者开启以下网页页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

 若提醒“该连接无法打开”,请查验主要参数是不是填好不正确,是不是有着scope主要参数相对应的受权修饰符管理权限。

参照连接(请在pc版微信中开启此链接感受) Scope为snsapi_base

 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=http://chong.qq.com/php/index.php?d=&c=wxAdapter&m=mobileDeal&showwxpaytitle=1&vb2ctag=4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect Scope为snsapi_userinfo https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http://nba.bluewebgame.com/oauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

主要参数表明

主要参数是不是务必表明

appid是微信公众号的唯一标志

redirect_uri是受权后跳转的调整连接详细地址,请使用urlencode对连接开展解决

response_type是回到种类,请填好code

scope是运用受权修饰符,snsapi_base (不弹出来受权网页页面,立即自动跳转,只有获取用户openid),snsapi_userinfo (弹出来受权网页页面,可根据openid取得呢称、性別、所在城市。而且,即使在未关心的情形下,只需用户受权,也可以获取其信息内容)

state否跳转后会携带state主要参数,开发人员可以填好a-zA-Z0-9的变量值

#wechat_redirect是无论立即开启或是做网页页面302跳转情况下,务必带此参数

下面的图为scope等于snsapi_userinfo时的受权网页页面:

用户允许受权后

假如用户允许受权,网页页面将自动跳转至 

redirect_uri/?code=CODE&state=STATE。

若用户严禁受权,则跳转后不容易携带code主要参数,仅会携带state主要参数redirect_uri?state=STATE

code表明 : code做为获得access_token的单据,每一次用户受权携带的code将不一样,code只有运用一次,5分鐘未被应用全自动到期。

第二步:根据code获得网页受权access_token

最先一定要注意,这儿根据code获得的网页受权access_token,与基本适用中的access_token不一样。微信公众号可根据以下插口来获取网页受权access_token。假如网页受权的修饰符为snsapi_base,则本流程中获取到网页受权access_token的与此同时,也获取到了openid,snsapi_base式的网页受权步骤即到这里。

要求方式获取code后,要求下列连接获取access_token: 

 https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

主要参数表明

主要参数是不是务必表明

appid是微信公众号的唯一标志

secret是微信公众号的appsecret

code是填好第一步获取的code主要参数

grant_type是填好为authorization_code

回到表明

恰当时回到的JSON数据如下所示:

{    "access_token":"ACCESS_TOKEN",    "expires_in":7200,    "refresh_token":"REFRESH_TOKEN",    "openid":"OPENID",    "scope":"SCOPE" }

主要参数叙述

access_token网页受权插口启用凭据,留意:此access_token与基本支撑的access_token不一样

expires_inaccess_token插口启用凭据请求超时時间,企业(秒)

refresh_token用户刷新access_token

openid用户唯一标志,一定要注意,在未扫码关注时,用户浏览微信公众号的网页,也会形成一个用户和微信公众号唯一的OpenID

scope用户受权的修饰符,应用分号(,)隔开

不正确时手机微信会回到JSON数据如下所示(实例为Code失效不正确):

{"errcode":40029,"errmsg":"invalid code"}

全局性回到码表明

第三步:刷新access_token(假如必须)

因为access_token有着较短的有效期限,当access_token请求超时后,可以应用refresh_token开展更新,refresh_token有着较长的有效期限(7天、30天、60天、90天),当refresh_token无效的后,必须用户再次受权。

要求方式

获取第二步的refresh_token后,要求下列连接获取access_token:  https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

主要参数是不是务必表明

appid是微信公众号的唯一标志

grant_type是填好为refresh_token

refresh_token是填写根据access_token获取到的refresh_token主要参数

回到表明

恰当时回到的JSON数据如下所示:

{    "access_token":"ACCESS_TOKEN",    "expires_in":7200,    "refresh_token":"REFRESH_TOKEN",    "openid":"OPENID",    "scope":"SCOPE" }

主要参数叙述

access_token网页受权插口启用凭据,留意:此access_token与基本支撑的access_token不一样

expires_inaccess_token插口启用凭据请求超时時间,企业(秒)

refresh_token用户刷新access_token

openid用户唯一标志

scope用户受权的修饰符,应用分号(,)隔开

不正确时手机微信会回到JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

全局返回码说明

第四步:拉取用户信息(需scope为 snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法

http:GET(请使用https协议)

 https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

参数描述

access_token网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

openid用户的唯一标识

lang返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

返回说明

正确时返回的JSON数据包如下:

{    "openid":" OPENID",    " nickname": NICKNAME,    " ** ":"1",    "province":"PROVINCE"    "city":"CITY",    "country":"COUNTRY",     "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",  "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ] }

参数描述

openid用户的唯一标识

nickname用户昵称

** 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知

province用户个人资料填写的省份

city普通用户个人资料填写的城市

country国家,如中国为CN

headimgurl用户头像,最后一个数值代表正方形头像大小(有0、46、 ** 、96、132数值可选,0代表 ** 0* ** 0正方形头像),用户没有头像时该项为空

privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

错误时微信会返回JSON数据包如下(示例为openid无效):

{"errcode":40003,"errmsg":" invalid openid "}

全局返回码说明

附:检验授权凭证(access_token)是否有效

请求方法

http:GET(请使用https协议)

 https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

参数说明

参数描述

access_token网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

openid用户的唯一标识

返回说明

正确的Json返回结果:

{ "errcode":0,"errmsg":"ok"}

错误时的Json返回示例:

{ "errcode":40003,"errmsg":"invalid openid"}

案例代码:

请求授权页面的构造方式

url在线编码工具:http://tool.oschina.net/encode?type=4

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

前端代码

http:// ** .w3.org/TR/html4/strict.dtd";>http-equiv="Content-Type" content="text/html; charset=UTF-8" />会员注册

function callback(result) {

alert(cucess);

alert(result);  //输出openid

}

function getQueryString(name) {

var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");

var r = window.location.search.substr(1). ** tch(reg);

if (r != null) return unescape(r[2]); return null;

}

var code = getQueryString("code");

$.ajax({

async: false,       url: "http://atest.sinaapp.com/oauth2.php", //这是我的服务端处理文件php的

type: "GET",       //下面几行是jsoup,如果去掉下面几行的注释,后端对应的返回结果也要去掉注释

// dataType: jsonp,

// jsonp: callback, //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象.

// jsonpCallback:callback,

data: {code:code}, //传递本页面获取的code到后台,以便后台获取openid

timeout: 5000,

success: function (result) {

callback(result);

},

error: function (jqXHR, textStatus, errorThrown) {

alert(textStatus);       }

});

后端代码

$code = $_GET[code];//前端传来的code值

$appid = "wx468622291a1e99d6";

$appsecret = "98566dc38863aa4395fabebb0de6ecc1";//获取openid

$url = "https://api.weixin.qq.com/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://api.weixin.qq.com/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;

}

?>

扫码免费用

源码支持二开

申请免费使用

在线咨询