微信开放平台开发第三方授权登陆(二):第三方登陆授权开发(PC网页端)

版权声明:本文为博主原创文章,转载添加原文链接 https://blog.csdn.net/qq_34190023/article/details/81185143

 当前期准备完成后,已经获取到应用的AppID和AppSecret、且已经成功申请到微信登陆功能。可以进行第三方登陆授权开发。

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。

 

一、开发流程

1.网站应用:(微信客户端扫码授权登陆)

1)第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

2)通过code参数加上AppID和AppSecret等,通过API换取access_token;

3)通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

网站应用第三方授权登陆获取用户信息

2.移动应用:(App唤醒微信客户端授权登陆)

暂时略

3.小程序:

暂时略

二、具体实现步骤

1、网站应用

1)请求Code

前提:应用已经获取相应的网页授权作用域(scope=snsapi_login)

开发:第三方网站引导用户打开链接

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

参数说明:

参数

必须

说明

appid

应用唯一标识

redirect_uri

请使用urlEncode对链接进行处理

response_type

填code

scope

应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可

state

用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

 

注意:若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

 

2)用户同意授权与否

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数

redirect_uri?code=CODE&state=STATE

若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数

redirect_uri?state=STATE

 

成功授权后,将获得Code,通过Code可以获取access_token

 

3)获取access_token

通过上述方法获取的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,                      // access_token接口调用凭证超时时间,单位(秒)
"refresh_token":"REFRESH_TOKEN",       //用户刷新access_token
"openid":"OPENID",                                  //授权用户唯一标识
"scope":"SCOPE",                                     //用户授权的作用域,使用逗号(,)分隔
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"  //当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段
}

失败返回的样例:

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

失败可能原因:  暂时不明

 

4)通过access_token调用接口获取用户个人信息(UnionID机制)

前提:

1. access_token有效且未超时;

2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

Http Get请求:

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

参数

是否必须

说明

access_token

调用凭证

openid

普通用户的标识,对当前开发者帐号唯一

lang

国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN

 

返回成功的json结果(样例):

{
"openid":"OPENID",        //普通用户的标识,对当前开发者帐号唯一
"nickname":"NICKNAME",   //普通用户昵称
"sex":1,                                //普通用户性别,1为男性,2为女性
"province":"PROVINCE",      //普通用户个人资料填写的省份
"city":"CITY",                        //普通用户个人资料填写的城市
"country":"COUNTRY",         //国家,如中国为CN
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",       //用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
"privilege":[   //用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"   //用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的
}

 

失败JSON样例:

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

 

注意:在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况

最好保存用户unionID信息,以便以后在不同应用中进行用户信息互通。

 

 

 

5)刷新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:

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参数

 

成功返回的结果:

{
"access_token":"ACCESS_TOKEN",    //接口调用凭证
"expires_in":7200,                             // access_token接口调用凭证超时时间,单位(秒)
"refresh_token":"REFRESH_TOKEN",   //用户刷新access_token
"openid":"OPENID",                          //授权用户唯一标识
"scope":"SCOPE"                              //用户授权的作用域,使用逗号(,)分隔
}

失败样例:

{"errcode":40030,"errmsg":"invalid refresh_token"}

 

注意:

1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。

建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

 

 

2、移动应用

 

 

 

3、小程序

 

三、注意事项

 

 

四.主要提供材料

 

五、特殊情况处理方案

猜你喜欢

转载自blog.csdn.net/qq_34190023/article/details/81185143