对接第三方之微信登陆
由于目前市面上社交软件的使用排行来看,基本上微信一马当先。因此在大多数应用上都会内置微信登陆的场景,这时候我们就非常有必要熟悉微信的登录流程。
微信登陆
微信官方开发文档说明目前移动应用上微信登录仅支持原生登陆方式,需要用户安装微信客户端才能配合使用
特殊说明:
对于 Android 应用,建议总是显示微信登录按钮,当用户手机没有安装微信客户端时,请引导用户下载安装微信客户端。对于 iOS 应用,考虑到 iOS 应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用 sdk 中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。
微信登陆流程图如下:
上述流程只是简述微信对接流程,在真实场景下应增加各种过期逻辑校验以及安全性处理
具体流程如下:
1、安卓或IOS通过内置SDK拉起本地微信应用,微信用户授权后获取授权临时票据(code),
IOS如下:
-(void)sendAuthRequest
{//构造 SendAuthReq 结构体SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];req.appid = "wxd477edab60670232"req.scope = @"snsapi_userinfo";req.state = @"123";//第三方向微信终端发送一个 SendAuthReq 消息结构[WXApi sendReq:req];
}
安卓如下:
{// send oauth requestFinal SendAuth.Req req = new SendAuth.Req();req.appid = "wxd477edab60670232"req.scope = "snsapi_userinfo";req.state = "wechat_sdk_demo_test";api.sendReq(req);
}
2、通过授权临时票据(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": "授权临时票据","grant_type": "authorization_code"}
微信响应:
{"access_token": "接口调用凭证","expires_in": "accessToken超时时间,单位秒","refresh_token": "用户刷新accessToken","openid": "授权用户微信唯一标识","scope": "用户授权的作用域","unionid": "用户userInfo授权"
}
错误响应:
{"errcode": 40029,"errmsg": "invalid code"
}
微信官方accessToken的有效期为2小时(即7200秒。当accessToken失效后,需要调用以下接口进行刷新
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token 拥有较长的有效期(30 天),当 refresh_token 失效的后,需要用户重新授权。
3、获取用户信息
GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
请求参数:
{"access_token": "","openid": "","lang": "zh_CN"
}
正确响应:
{"openid": "OPENID","nickname": "NICKNAME","sex": 1, "province": "PROVINCE","city": "CITY","country": "COUNTRY","headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0","privilege": ["PRIVILEGE1", "PRIVILEGE2"],"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}