UNIAPP统一注册登录架构
注:此架构针对uniapp有效,不影响原程序。
总体思路
要求运营者把小程序、公众号、app都绑定到同一个微信开放平台,以实现unionid一致
1、获取微信unionid实现自动注册和登录
2、微信小程序、微信H5不提供手动注册和登录
3、pc、h5、app提供手动注册登录
4、登录后点击绑定手机号,进行手机号绑定
关于token的有效期
1、h5和pc有效期不变
2、小程序/app固定为3个月
通过unionid的自动注册、登录流程
小程序自动登录
一、用户点击登录,开始调用wx.login获取到code
二、通过code请求自动登录API
1、首先通过微信api拿到 session_key和openid
2、将openid和sessioin_key绑定,存储在redis中。
三、如果上述操作成功,则开始调用wx.getUserinfo获取unionid
1、wx.getUserinfo获取到加密数据
2、讲加密数据传递到api进行解密
3、解密出unionid后用unionid进行自动登录
相关文档
小程序登录
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
小程序获取unioid
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
小程序获取手机号
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
微信H5自动登录
一、点击登录,向javashop api请求获取微信授权跳转链接
因为前段没有appid,所以由后端拼接链接
二、授权后前段得到微信code
三、前端用code请求javashop api自动登录
1、后端api通过code拿到openid和微信token
2、通过微信token 拿到微信unionid
3、通过unionid注册登录,生成javashop token
相关文档
微信授权
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
获取access_token及unionid:
公用模块
通过unionid自动登录应该是一个公用的方法:
调用伪代码:
String unionId="xxxx";
MemberVo member = loginByUnionId(unionId);
实现伪代码:
MemberVo loginByUnionId(String unionId){
//通过unionid查找会员(es_connect表)
Integer memberId= findMemberByUnionId(unionId)
MemberVo member=null;
if(memberId==null){ //没找到注册一个
member= registerBy(UnionId);
}else{
member= findMemberById(unionid);
}
}
会员的填充规则要求用户名保持唯一性,其他的随机生成即可
APP自动登录
因为采用uniapp的统一Login api,所以和小程序一样
相关文档
登录授权
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html
unionid获取
相关表结构
es_connect表
此表为已存在的表
列名 | 类型 | 说明 |
---|---|---|
id | bigint | 主键 |
member_id | bigint | 会员id |
union_id | varchar | unionid |
union_type | varchar | 联合登录类型 |
unbound_time | bigint | 解绑时间 |
union_type规则
值 | 说明 |
---|---|
微信unionid | |
WECHAT_OPENID | 微信openid |
WECHAT_MINI | 微信小程序openid |
qq联合登录凭证id | |
微博联合登录凭证id | |
ALIPAY | 支付宝联合登录凭证id |
uniapp相应文档
https://uniapp.dcloud.io/api/plugins/login?id=login
相关配置