@PostMapping("/minapp/login")
@ApiOperation(value = "微信小程序登录(包括第一次登录)")
@ApiImplicitParams({
@ApiImplicitParam(name = "code", value = "用户code",required = true, paramType = "body"),
@ApiImplicitParam(name = "phoneCode", value = "手机code",required = true, paramType = "body"),
})
public R mpLogin(@ApiIgnore @RequestBody MpRequestPojo mpRequestPojo) throws HttpRequestMethodNotSupportedException {
String code = mpRequestPojo.getCode();
if(StringUtils.isBlank(code)){
return R.error("微信小程序用户code不能为空");
}
String phoneCode = mpRequestPojo.getPhoneCode();
if(StringUtils.isBlank(phoneCode)){
return R.error("微信小程序手机code不能为空");
}
//获取access_token
String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxMiniappsAppId +
"&secret="+wxMiniappsSecret;
String jsonData = restTemplate.getForObject(accessTokenUrl, String.class);
log.info("accessToken返回:"+jsonData);
JSONObject jsonObject = null;
if(StringUtils.isBlank(jsonData)){
return R.error("获取小程序AccessToken信息失败");
}
if (StringUtils.contains(jsonData, "errcode")) {
return R.error("获取小程序AccessToken失败");
}
try {
jsonObject = JSONObject.parseObject(jsonData);
}catch (Exception e){
return R.error("获取小程序AccessToken失败");
}
String accessToken = jsonObject.getString("access_token");
//获取手机信息
String baseUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
log.info(baseUrl);
HttpHeaders headers = new HttpHeaders();
Map<String,Object> requestMap = new HashMap<>();
// 手机号调用凭证
requestMap.put("code", phoneCode);
HttpEntity<Map> entity = new HttpEntity<>(requestMap, headers);
jsonData = restTemplate.postForObject(baseUrl,entity, String.class);
log.info("userphonenumber返回:"+ jsonData);
if(StringUtils.isBlank(jsonData)){
return R.error("获取小程序手机信息失败");
}
try {
jsonObject = JSONObject.parseObject(jsonData);
}catch (Exception e){
return R.error("获取小程序手机信息失败");
}
if(jsonObject.getInteger("errcode")!=0){
return R.error("获取小程序手机信息失败");
}
JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
String phoneNumber = phoneInfo.getString("phoneNumber");
//获取openid
String url = "https://api.weixin.qq.com/sns/jscode2session?" +
"appid=" + wxMiniappsAppId +
"&secret=" + wxMiniappsSecret +
"&js_code=" + code +
"&grant_type=authorization_code";
jsonData = restTemplate.getForObject(url, String.class);
log.info(jsonData);
if(StringUtils.isBlank(jsonData)){
return R.error("获取小程序openid信息失败");
}
if (StringUtils.contains(jsonData, "errcode")) {
return R.error("获取小程序openid信息失败");
}
try {
jsonObject = JSONObject.parseObject(jsonData);
}catch (Exception e){
return R.error("获取小程序openid信息失败");
}
if(null==jsonObject){
return R.error("获取小程序openid信息失败");
}
String minappOpenid = jsonObject.getString("openid");
if(StringUtils.isBlank(minappOpenid)){
return R.error("获取小程序openid信息失败");
}
minappOpenid = StringUtils.trim(minappOpenid);
if(StringUtils.isNotBlank(phoneNumber)) {
UserdetailmetaEntity userdetailmetaEntityOne = userdetailmetaService.getInfoByCellphone(phoneNumber);
if (null != userdetailmetaEntityOne) {
Long id = userdetailmetaEntityOne.getId();
String minappOpenidOne = userdetailmetaEntityOne.getMinappOpenid();
//绑定openid
if (StringUtils.isBlank(minappOpenidOne)) {
QueryWrapper<UserdetailmetaEntity> userdetailmetaEntityQueryWrapper1 = new QueryWrapper<>();
userdetailmetaEntityQueryWrapper1.lambda().ne(UserdetailmetaEntity::getId, id)
.eq(UserdetailmetaEntity::getMinappOpenid, minappOpenid).select(UserdetailmetaEntity::getId);
userdetailmetaEntityQueryWrapper1.last("LIMIT 1");
UserdetailmetaEntity userdetailmetaEntity1 = userdetailmetaService.getOne(userdetailmetaEntityQueryWrapper1);
if (null == userdetailmetaEntity1) {
UserdetailmetaEntity userdetailmetaEntityNew = new UserdetailmetaEntity();
userdetailmetaEntityNew.setId(id);
userdetailmetaEntityNew.setMinappOpenid(minappOpenid);
userdetailmetaService.updateById(userdetailmetaEntityNew);
}else{
return R.error("小程序绑定了其他手机号");
}
}else{
if(!minappOpenidOne.equals(minappOpenid)){
return R.error("小程序绑定了其他手机号");
}
}
//有查询到则返回jwt token
Map<String, String> parameters = new HashMap<>();
Map<String, Object> map = new HashMap<>();
Long userId = userdetailmetaEntityOne.getUserId();
map.put("cellphone", phoneNumber);
String redisMd5Password = "123456";
redisTemplate.opsForValue().set(PASSWORD_MD5_USERID_KEY + phoneNumber, redisMd5Password, 3, TimeUnit.MINUTES);
//封装成一个UserPassword方式的参数体
parameters.put("username", JSON.toJSONString(map));
//放入用户ID做密码
parameters.put("password", redisMd5Password);
//授权模式
parameters.put("grant_type", AdminPwdGranter.GRANT_TYPE);
User clientUser = new User("all", "secret", new ArrayList<>());
//生成已经认证的client
AccountLoginToken token = new AccountLoginToken(clientUser, new ArrayList<>());
//调用自带的获取token方法。
OAuth2AccessToken oAuth2AccessToken = tokenEndpoint.postAccessToken(token, parameters).getBody();
Map<String, Object> additionInfo = oAuth2AccessToken.getAdditionalInformation();
Date expiration = oAuth2AccessToken.getExpiration();
String tokenGroupId = (String) additionInfo.get("tokenGroupId");
String accessTokenStr = oAuth2AccessToken.getValue();
long betweenDay = DateUtil.between(new Date(), expiration, DateUnit.SECOND);
Map<String, Object> objectMap = new HashMap<>();
objectMap.put("tokenGroupId", tokenGroupId);
redisTemplate.opsForValue().set(JWT_TOKEN_USERID_KEY + userId + "_" + tokenGroupId, objectMap, betweenDay, TimeUnit.SECONDS);
Map<String, Object> data = new HashMap<>();
data.put("accessToken", accessTokenStr);
data.put("cellphone", phoneNumber);
data.put("realname", userdetailmetaEntityOne.getRealname());
data.put("faceImageUrl", userdetailmetaEntityOne.getFaceImageUrl());
return R.ok(data);
} else {
String md5key = DigestUtils.md5Hex(jsonData + "MINAPP_LOGIN");
String redisKey = "MINAPP_LOGIN_" + md5key;
redisTemplate.opsForValue().set(redisKey, jsonData, Duration.ofDays(1));
Map<String, String> map = new HashMap<>();
map.put("minappTempKey", redisKey);
map.put("cellphone", phoneNumber);
return R.ok().put(map);
}
}else{
String md5key = DigestUtils.md5Hex(jsonData + "MINAPP_LOGIN");
String redisKey = "MINAPP_LOGIN_" + md5key;
redisTemplate.opsForValue().set(redisKey, jsonData, Duration.ofDays(1));
Map<String, String> map = new HashMap<>();
map.put("minappTempKey", redisKey);
return R.ok().put(map);
}
}
微信小程序登录源码片断,建议读懂即可用,不建议复制
于 2022-09-20 18:20:03 首次发布