微信开放平台:https://open.weixin.qq.com

1
2
3
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

  wKioL1ZWylejZQpRAABcM58PmXo488.png


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云端服务器,由云端中转接口调用请求。