微信登录sdk接入方式请见,移动应用微信登录开发指南。
公司官网android国内版sdk,其中第三方登录选择微信登录,其实微信登录已经接入了一段时间了,测试也都通过。新需求是登录完微信sdk后需要保存在本地(就是在本地保存一份微信的登录token,下次登录不用再跳转到微信进行授权),见下图:
刚开始觉得挺简单的,但是做的过程中发现了许多坑(主要还是自己当时太心急),记录一下:
1.微信登录之后有个access_token,需要服务器端sdk进行验证,我在本地保存的就是这个token,但是这个token的有效期限为2个小时。(需要把微信开放平台的说明贴一下),
2.微信登录后还有一个refresh_token,sdk的说法是在access_token未失效的情况下,刷新refresh_token会重新设定之前的acess_token(access_token的有效期还是2个小时,相当于延长了之前的有效期),当access_token已经失效的情况下,刷新refresh_token会重新获取一个新的access_token。需要在本地保存一个refresh_token,refresh_token的有效期限是30天,refresh_token失效后,需要用户再次授权登录,以下是移动应用微信登录开发指南里关于刷新access_token有效期的说明:
刷新access_token有效期
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,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数说明
access_token接口调用凭证
expires_inaccess_token接口调用凭证超时时间,单位(秒)
refresh_token用户刷新access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔
错误返回样例:
{"errcode":40030,"errmsg":"invalid refresh_token"}
注意:
1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。
建议将Appsecret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。
3.需要保存一个微信sdk登录后返回的一个用户的唯一标识openid,我是根据openid来进行保存相对应账户的refresh_token.