首先知道两个最基本的属性:code和openId,这两个是做什么的呢?
code和openId
openId是永久的,是微信对该用户该小程序的唯一标识,也就是微信小程序官方数据库里存的userId code就是前端由前端获取的一个一次性的,有时限的用来获取openId的东西;
设计思路: 首先由前端工作人员将这个code发到后端, 后端再根据这个一次性的code,调用微信的api获取该小程序的openId。每个小程序的openId是不一样的。 然后获得了openId后,从本地库里查询用户数据,如果有就返回token
前置准备
了解完后,由于openId是该小程序唯一标识,所以我们本地的数据库也得加个字段openId(这里我写成了wechatId),用来装官方库里的openId。匹配成功后才证明本地这个用户已经有数据了
然后因为要用到微信官方的接口,所以pom文件要引入依赖
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.3.0</version>
</dependency>
代码书写
接下来就是写接口,前端发送code,后端根据code获取openId,然后生成token返回给前端,这里的token生成用的是sa-token的技术
@PostMapping("/xcxLogin")
public R<Map<String, Object>> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
Map<String, Object> ajax = new HashMap<>();
String token = sysLoginService.xcxLogin(xcxCode);
ajax.put(Constants.TOKEN, token);
return R.ok(ajax);
}
public String xcxLogin(String xcxCode) {
String openid = "";
openid = remoteUserService.getOpenIdByXCXCode(xcxCode);
XcxLoginUser userInfo = remoteUserService.getUserInfoByOpenid(openid);
LoginHelper.loginByDevice(userInfo, DeviceType.XCX);
recordLogininfor(userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
return StpUtil.getTokenValue();
}
根据code获取openId代码
@Override
public String getOpenIdByXCXCode(String code) {
try{
WxMaJscode2SessionResult session = WxMaConfiguration.getMaService().getUserService().getSessionInfo(code);
if(session != null && session.getOpenid() != null && "".equals(session.getOpenid())){
return session.getOpenid();
}
}catch (WxErrorException e) {
log.error("微信登录异常:"+e.toString());
return "";
}
return "";
}
后续会添加注册绑定功能
|