持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
写在前面
最近公司要开发小程序端产品,提前做一些前置工作。
比如小程序的登录集成,与原有系统的用户绑定逻辑等等。
登录
官方文档!官方文档!官方文档!
重要的事情说三遍!
涉及国内产品的集成和使用,一定要去看一下官方的文档。
官方给出了一个登录流程图。
我大概是拆分成前端、后端两部来梳理的。
前端开发人员(也就是小程序)
一、通过调用wx.login方法获取到一个code值。
注意: 这里的code值不是当前微信用户的openid,而是一个中间验证码。
二、将此code值传入后端指定接口,等待返回openid等相关信息。
后端开发人员
一、开发一个获取openid的接口,供前端调用。
比如我这里是直接集成到登录接口中了。
代码经过删减,只留下相关核心代码,大家凑合着看。
@PostMapping("/token")
public ResultInfo<AuthInfo> token(@RequestParam(defaultValue = "password", required = false) String grantType,
@RequestParam(required = false) String refreshToken,
@RequestParam(required = false) String account,
@RequestParam(required = false) String wxcode,
@RequestParam(required = false) String password) {
Map<String,String> map = new HashMap<>(16);
map.put("account", account);
map.put("password", password);
map.put("wxcode", wxcode);
map.put("grantType", grantType);
map.put("refreshToken", refreshToken);
map.put("userType", userType);
//登录 / 调用微信api方法
......
//返回信息,如果已绑定了用户,则直接生成固定token。
return toekn;
}
// 开放平台授权码
String openid = null;
JsonNode jsonNode = HttpRequest.get(wx_url.replace("{jsCode}", map.get("wxcode")))
.useSlf4jLog()
.execute()
.asJsonNode();
// 获取开放平台授权数据
if (jsonNode != null && jsonNode.get("errcode") != null && jsonNode.get("errcode").intValue() == AUTH_SUCCESS_CODE) {
switch (jsonNode.get("errcode").intValue()){
case -1:
throw new ServiceException("微信系统繁忙,此时请开发者稍候再试");
case 0:
openid = jsonNode.get("openid").textValue();
break;
case 40029:
throw new ServiceException("code无效");
case 45011:
throw new ServiceException("登录过于频繁。");
case 40226:
throw new ServiceException("高风险等级用户,小程序登录遭遇微信拦截");
default:
break;
}
} else if(jsonNode != null && jsonNode.get("openid") != null) {
openid = jsonNode.get("openid").textValue();
}else{
throw new ServiceException("微信登录失败!");
}
用户绑定
用户绑定逻辑就相应的简单了。
在认证的方法中,如果获取到openid已经绑定了数据库中用户,则直接返回有效token。
如果没有,则只返回openid。
前端发现token为空,或者token无法使用,则将openid和用户名、密码一同发送到后端的绑定接口中。
通过这样的逻辑,实现用户绑定的效果。