第一步,配置授权回调页面域名
进入微信公众平台后台后,依次进入开发者中心-权限表,找到网页授权获取用户基本信息,
授权回调域名配置规范为全域名并且不带http,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权。
第二步,用户同意授权,获取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参数对应的授权作用域权限。
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。
参数说明:
示例代码:
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } var code = GetQueryString("code");//这里会拿到code if (!code) { location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=你配置的回调域名&response_type=code&scope=snsapi_base&state=#wechat_redirect";
//应用授权作用域:snsapi_base(用户不可感知)只能获取到openid,snsapi_userinfo(用户可感知的授权方式)弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 }
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
第三步:通过code换取网页授权access_token或者openId(这里其实之获取到openId就可以进行下面的操作:具体操作还要看后端接口怎么处理)
首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
请求方法:
获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
这里使用jquery来演示使用code获取openid的过程和获取订单号
// 判断是否获取到了openId try { if (typeof window.sessionStorage.getItem('openId') == 'undefiened') { var openId = null; } else { var openId = JSON.parse(window.sessionStorage.getItem('openId')); } } catch (err) { var openId = null; } if (openId) { addOrder(); } else { $.ajax({ type: 'get', dataType: "json", url: "换取openid的接口地址?code=" + code, success: function (data) { if (data.code == 0) { openId = data.data.openid; window.sessionStorage.setItem('openId', JSON.stringify(openId));
//这里是用来获取后台返回的订单号的,具体根据实际项目来 addOrder(); } else { // alert(data.msg) } } }) }
第四步:刷新access_token(如果需要)
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当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
第五步:拉取用户信息(需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)是否有效
请求方法:
http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID