现在我们APP的登录、特殊事件提醒,验证码之类的都是短信通知用户。现在这个短信运维成本也越来越高, 一条短信的成本基本达到了4分钱左右,我们APP才2万的注册用户短信的费用每个月都要几千块,为了减低我们的运维成本,我们要对接微信生态,从微信登录,再到通知走微信公众号推送,这样预计每个月可以节省几千块。
时序图登录时序图
移动应用微信登录是基于OAuth2.0 协议标准构建的微信 OAuth2.0 授权登录系统。
登录流程1、移动应用微信授权登录获取code
开发人员需要配合微信开放平台的SDK进行授权登录请求。正确接入 SDK 后并拥有相关授权域(scope)权限后,开发者移动应用会在终端本地拉起微信应用进行授权登录,微信用户确认后微信将拉起开发者移动应用,并带上授权临时票据(code)。
iOS 平台应用授权登录接入代码示例(请参考 iOS 接入指南):
-(void)sendAuthRequest
{
//构造 SendAuthReq 结构体
SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];
req.scope = @"snsapi_userinfo";
req.state = @"123";
//第三方向微信终端发送一个 SendAuthReq 消息结构
[WXApi sendReq:req];
}
android 平台应用授权登录接入代码示例(请参考 Android 接入指南):
{
// send oauth request
Final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
参数说明
参数 | 是否必须 | 说明 |
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
scope | 是 | 应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验。在 state 传递的过程中会将该参数作为 url 的一部分进行处理,因此建议对该参数进行url encode操作,防止其中含有影响 url 解析的特殊字符(如'#'、'&'等)导致该参数无法正确回传。 |
2、云端根据微信登录的code进行业务关联
@Slf4j
@Service
public class WeixinServiceImpl implements WeixinService {
/**
* 获取登录tokenurl
*/
final public static String ACCESS_TOKEN_URL =
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8713050991911d16&secret=54f57519a5e6b74b5bdcbc40a85e1354&code=${code}&grant_type=authorization_code";
/**
* 微信获取用户信息url
*/
final public static String USER_INFO_URL =
"https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}";
@Autowired
private RestTemplateClient restTemplateClient;
//通过移动端微信登录的code获取openid及accessToken
@Override
public AccessTokenResp codeAuthAccessToken(String code) {
//返回的是text/plain格式,需要转
String accessTokenRespText = restTemplateClient.doPostForJSON_UTF8(ACCESS_TOKEN_URL
.replace("${code}" ,code ),
String.class
);
return JSON.parseObject(accessTokenRespText , AccessTokenResp.class);
}
//根据access_token与openid获取用户的头像、用户名、unionid等信息
@Override
public UserInfoResp getWeixinUserInfo(String token, String openid) {
//返回的是text/plain格式,需要转
String accessTokenRespText = restTemplateClient.doPostForJSON_UTF8(USER_INFO_URL
.replace("${access_token}" ,token ) .replace("${openid}" ,openid ),
String.class
);
return JSON.parseObject(accessTokenRespText , UserInfoResp.class);
}
}
总结
整个微信登录的流程还是挺简洁的,我们的目标是方便用户的使用,比如一方面对接微信登录后将头像、用户昵称直接可以同步过来,另一方面减少短信,甚至达到不发送短信的目的,达到降低我们的运维成本的目的。
,Copyright © 2008-2022 秒下下载站
m.down10s.com .All Rights Reserved