微信开放平台:https://open.weixin.qq.com
1
2
3
|
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 2. 通过code参数加上AppID和AppSecret等,通过API换取access_token; 3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。 |
1
2
3
4
|
第一步:请求CODE 第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接: https: //open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。 |
1
2
3
4
5
6
7
|
参数说明 参数是否必须说明 appid 是 应用唯一标识 redirect_uri 是 重定向地址,需要进行UrlEncode response_type 是 填code scope 是 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 state 否 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |
1
2
3
4
5
|
返回说明 用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数 redirect_uri?code=CODE&state=STATE 若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数 redirect_uri?state=STATE |
1
2
3
4
5
6
7
|
请求示例 登录一号店网站应用 https: //passport.yhd.com/wechat/login.do
打开后,一号店会生成state参数,跳转到 https: //open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到 https: //passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e
|
1
2
|
为了满足网站更定制化的需求,我们还提供了第二种获取code的方式,支持网站将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过JS将code返回给网站。 JS微信登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到微信域下登录后再返回,提升微信登录的流畅性与成功率。 网站内嵌二维码微信登录JS实现办法: |
步骤1:在页面中先引入如下JS文件(支持https):
1
|
<script src= "http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js" ></script>
|
步骤2:在需要使用微信登录的地方实例以下JS对象:
1
|
var obj = new WxLogin({
|
id:"login_container",
1
2
3
4
5
6
7
|
appid: "" ,
scope: "" ,
redirect_uri: "" ,
state: "" ,
style: "" ,
href: ""
});
|
1
2
3
4
5
6
7
8
9
|
参数说明 参数是否必须说明 id 是 第三方页面显示二维码的容器id appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得 scope 是 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 redirect_uri 是 重定向地址,需要进行UrlEncode state 否 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 style 否 提供 "black" 、 "white" 可选,默认为黑色文字描述。详见文档底部FAQ
href 否 自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ |
第二步:通过code获取access_token
1
2
|
通过code获取access_token https: //api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
|
1
2
3
4
5
6
|
参数说明 参数是否必须说明 appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得 secret 是 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 code 是 填写第一步获取的code参数 grant_type 是 填authorization_code |
1
2
3
4
5
6
7
8
|
返回说明 正确的返回: { "access_token" : "ACCESS_TOKEN" ,
"expires_in" :7200,
"refresh_token" : "REFRESH_TOKEN" ,
"openid" : "OPENID" ,
"scope" : "SCOPE" , "unionid" : "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
|
1
2
3
4
5
6
7
|
参数说明 access_token 接口调用凭证 expires_in access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid 授权用户唯一标识 scope 用户授权的作用域,使用逗号(,)分隔 unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
|
1
2
3
4
|
错误返回样例: { "errcode" :40029, "errmsg" : "invalid code" }
刷新access_token有效期 |
1
2
3
|
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种: 1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间; 2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。 |
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
请求方法
获取第一步的code后,请求以下链接进行refresh_token:
1
|
https: //api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
|
1
2
3
4
5
|
参数说明 参数是否必须说明 appid 是 应用唯一标识 grant_type 是 填refresh_token refresh_token 是 填写通过access_token获取到的refresh_token参数 |
1
2
3
4
5
6
7
8
9
|
返回说明 正确的返回: { "access_token" : "ACCESS_TOKEN" ,
"expires_in" :7200,
"refresh_token" : "REFRESH_TOKEN" ,
"openid" : "OPENID" ,
"scope" : "SCOPE" } |
1
2
3
4
5
6
|
参数说明 access_token 接口调用凭证 expires_in access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid 授权用户唯一标识 scope 用户授权的作用域,使用逗号(,)分隔 |
1
2
|
错误返回样例: { "errcode" :40030, "errmsg" : "invalid refresh_token" }
|
1
2
3
4
5
6
|
注意: 1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret); 2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为; 3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。 建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。 |