微信开放平台开发第三方受权登录(三):Android客户端web
微信开放平台开发第三方受权登录(五):微信小程序spring
目录数据库
1、需求apache
2、开发流程json
3、开发使用的技术及工具微信小程序
4)经过access_token调用接口获取用户我的信息(UnionID机制)
微信开放平台第三方受权登录开发文档(PC网页端)
当微信开放平台开发第三方受权登录(一):开发前期准备完成后,已经获取到应用的AppID和AppSecret、且已经成功申请到微信登录功能。能够进行第三方登录受权开发。
网站应用微信登陆是基于OAuth2.0协议标准构建的微信OAuth2.0受权登陆系统。
根据需求,须要拥有第三方微信登陆功能,并获取到用户信息。
1)第三方发起微信受权登陆请求,微信用户容许受权第三方应用后,微信会拉起应用或重定向到第三方网站,而且带上受权临时票据code参数;
2)经过code参数加上AppID和AppSecret等,经过API换取access_token;
3)经过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操做。
网站应用第三方受权登录获取用户信息
一、使用IDEA2017.2进行开发
二、使用SpringBoot进行快速开发
三、使用redis进行缓存。
四、使用fastJson对json数据进行处理
五、使用Maven对项目进行管理
建立工程
打开IDEA,新建一个工程,选择Spring Initializr,Next。而后填写工程基本信息
选择SpringBoot的版本已经须要添加的依赖,也能够直接跳过,手动添加依赖。因为是web工程,须要添加web相关依赖。模板引擎采用springboot推荐的thymeleaf。最后点击确认,进入工程。
添加相关依赖:
添加配置文件
SpringBoot默认会将resources下的application名字开头的properties做为配置文件。因此只须要添加application.properties就能够了
因为是使用thymeleaf做为模板引擎。能够添加相应的配置:
为了让系统更具备通用性,分别建立application-dev.properties、application-prod.properties对不一样的环境进行配置。
在application.properties中,使用spring.profiles.active进行配置环境的选择。
如:spring.profiles.active = prod
如:application-prod.properties
新建javaBean:WeChatUserInfo.java
新建WeChatOpenLoginController.java实现微信开放平台第三方登陆的主要逻辑。
根据文档进行编写代码。
前提:应用已经获取相应的网页受权做用域(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。
用户容许受权后,将会重定向到redirect_uri的网址上,而且带上code和state参数
redirect_uri?code=CODE&state=STATE
若用户禁止受权,则不会重定向到咱们提供的回调地址中
成功受权后,将得到Code,经过Code能够获取access_token
经过上述方法获取的code获取access_token.
Http Get请求
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"}
失败可能缘由: 暂时不明
前提:
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、4六、6四、9六、132数值可选,0表明640*640正方形头像),用户没有头像时该项为空
"privilege":[ //用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" //用户统一标识。针对一个微信开放平台账号下的应用,同一用户的unionid是惟一的
}
失败JSON样例:
{"errcode":40003,"errmsg":"invalid openid"}
注意:在用户修改微信头像后,旧的微信头像URL将会失效,所以开发者应该本身在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常状况
最好保存用户unionID信息,以便之后在不一样应用中进行用户信息互通。
因为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"}
注意:
一、Appsecret 是应用接口使用密钥,泄漏后将可能致使应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
二、access_token 为用户受权第三方应用发起接口调用的凭证(至关于用户登陆态),存储在客户端,可能出现恶意获取access_token 后致使的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
三、refresh_token 为用户受权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后至关于access_token 泄漏,风险同上。
建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。
首先开启redis。而后运行代码。因为SpringBoot会使用内置的Tomcat容器进行管理,直接运行就能够了,而后点击微信登陆。弹出扫码登陆窗口,手机扫码赞成登陆后就能够获取到用户信息了.
APPID和APPSecret以及回调地址位置,注:须要修改受权回调域,即回调地址