JAVA SpringBoot微信小程序登录
前言
微信小程序同时集成了APP store的功能,特别是对于传统企业来说APP的开成本较高,而且使用频率也比较低,就算有下载使用但是卸载频率也比较高,而且小程序的出台正好可以弥补这样的缺点.
登录逻辑
用户凭证可以使用jwt,openId可以作为用户唯一标识,这样后端可以通过openId判断是否新用户,具体登录流程如下:
1.小程序调用wx.login() 获取jscode
2.调用后端登录的接口,将jscode作为参数传给后端
3.后端通过jscode及对应的小程序ID,小程序密钥调用微信后端登录接口换取openId
4.后端通过openId查询对应数据据,如果查询到用户数据则返回登录流程,反之,则走注册流程,新增一条客户数据完成后再返回用户数据.
控制层代码
@Data
@ApiModel(value = "客户登录信息", description = "")
public class ConsumerLoginRequest {
/** 微信js_code */
@ApiModelProperty(value = "微信js_code",notes = "")
@NotBlank(message = "jsCode:jsCode不能穿空")
private String jsCode;
}
/**
* consumerLogin:客户登录
* @param baseRequest:
* @return BaseResponse
**/
@ApiOperation(value = "客户登录")
@PostMapping(value = "/consumerLogin")
@ResponseBody
public BaseResponse consumerLogin(@RequestBody ConsumerLoginRequest baseRequest) {
try {
return loginService.consumerLogin(baseRequest);
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
}
ServiceImpl代码(微信appId,对应的密钥,后端调用微信官方登录接口在yml中进行配置)
@Value("${wechat.secret}")
private String secret;
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.url}")
private String url;
private static final Integer WECHATSTATUS = 0;
@Override
@Transactional
public BaseResponse consumerLogin(ConsumerLoginRequest baseRequest) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("appid", appid);
jsonObject.put("secret", secret);
jsonObject.put("js_code", baseRequest.getJsCode());
jsonObject.put("grant_type", "authorization_code");
String response = HttpUtils.doGet(url, jsonObject, null);
JSONObject responseJson = JSONObject.parseObject(response);
int errcode = responseJson.getIntValue("errcode");
String openId = null;
if(WECHATSTATUS==errcode){
openId = responseJson.getString("openid");
}else{
String errmsg = responseJson.getString("errmsg");
throw new BusinessException(errmsg);
}
QueryWrapper<Consumer> queryWrapper = new QueryWrapper<>();
LambdaQueryWrapper<Consumer> lambda = queryWrapper.lambda();
lambda.eq(Consumer::getOpenId,openId);
lambda.eq(Consumer::getStatus,GlobalConst.DataStatus.ACTIVE.getStatus());
Consumer consumer = getOne(queryWrapper);
if(consumer == null){
//把用户信息存储在对应表中
}
BaseResponse baseResponse = BaseResponse.getSuccess();
ConsumerLoginResponse loginResponse = new ConsumerLoginResponse();
String token = jwtUtils.createUserToken(consumer.getId(), consumer.getName(), GlobalConst.PermissionCode.CONSUMER.getCode());
loginResponse.setToken(token);
JSONObject loginJson = new JSONObject();
loginJson.put("consumerId", consumer.getId());
loginJson.put("openId", consumer.getOpenId());
loginResponse.setConsumerInfo(loginJson);
baseResponse.setData(loginResponse);
return baseResponse;
}
小结
openId在每一个微信小程序中都是唯一的,所以可以直接使用它作为是否同一用户的标识.