Browse Source

feature1.0.0-img: 优化艺术家登录接口

master
penny 4 years ago
parent
commit
e2c7c23053
  1. 2
      bnyer-services/bnyer-img/pom.xml
  2. 2
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
  3. 131
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java
  4. 1
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java
  5. 26
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxSessionInfoVo.java
  6. 36
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxUserInfoVo.java

2
bnyer-services/bnyer-img/pom.xml

@ -96,7 +96,7 @@
<version>2.1.2</version> <version>2.1.2</version>
</dependency> </dependency>
<!-- 微信小程序工具包--> <!--微信小程序工具包-->
<dependency> <dependency>
<groupId>com.github.binarywang</groupId> <groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId> <artifactId>weixin-java-miniapp</artifactId>

2
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java

@ -69,7 +69,7 @@ public class RedisKeyConstant {
public static final String TIKTOK_USER_LOGIN_KEY = "bnyer.img.tiktok.user:"; public static final String TIKTOK_USER_LOGIN_KEY = "bnyer.img.tiktok.user:";
/** /**
* 抖音小程序用户登录键 * 微信小程序用户登录键
*/ */
public static final String WECHAT_USER_LOGIN_KEY = "bnyer.img.wx.user:"; public static final String WECHAT_USER_LOGIN_KEY = "bnyer.img.wx.user:";

131
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java

@ -1,16 +1,15 @@
package com.bnyer.img.service.impl; package com.bnyer.img.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaUserService; import com.alibaba.fastjson.JSON;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import com.alibaba.fastjson.JSONObject;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.Sm4Util; import com.bnyer.common.core.utils.Sm4Util;
import com.bnyer.common.core.utils.StringUtils; import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.common.core.utils.uuid.IdUtils; import com.bnyer.common.core.utils.uuid.IdUtils;
import com.bnyer.common.redis.service.RedisService; import com.bnyer.common.redis.service.RedisService;
import com.bnyer.img.config.WxConfig;
import com.bnyer.img.constants.RedisKeyConstant; import com.bnyer.img.constants.RedisKeyConstant;
import com.bnyer.img.constants.TiktokConstant; import com.bnyer.img.constants.TiktokConstant;
import com.bnyer.img.domain.Creator; import com.bnyer.img.domain.Creator;
@ -26,21 +25,19 @@ import com.bnyer.img.mapper.InviteLogMapper;
import com.bnyer.img.mapper.TiktokImgMapper; import com.bnyer.img.mapper.TiktokImgMapper;
import com.bnyer.img.mapper.VerifyLogMapper; import com.bnyer.img.mapper.VerifyLogMapper;
import com.bnyer.img.service.CreatorService; import com.bnyer.img.service.CreatorService;
import com.bnyer.img.vo.CreatorHotVo; import com.bnyer.img.vo.*;
import com.bnyer.img.vo.CreatorTypeImgsVo;
import com.bnyer.img.vo.CreatorVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -67,7 +64,12 @@ public class CreatorServiceImpl implements CreatorService {
private RedisService redisService; private RedisService redisService;
@Autowired @Autowired
private WxMaUserService wxMaUserService; private RestTemplate restTemplate;
@Autowired
private WxConfig wxConfig;
/** /**
* 检查用户是否绑定过手机号 * 检查用户是否绑定过手机号
@ -266,12 +268,73 @@ public class CreatorServiceImpl implements CreatorService {
return creatorMapper.update(creator,wrapper); return creatorMapper.update(creator,wrapper);
} }
private Creator saveOrUpdate(Creator creator,String openId,String sessionKey,String encryptedData,String iv){ /**
* 获取用户openId及sessionKey
* @param code 登录凭证code
* @return -
*/
private WxSessionInfoVo getSessionInfo(String code) {
String url = wxConfig.getSessionInfoUrl()+"?appid="+wxConfig.getAppId()+"&secret="+wxConfig.getSecret()+"&js_code="+code+"&grant_type=authorization_code";
String forObject = restTemplate.getForObject(url, String.class);
JSONObject sessionInfo = JSONObject.parseObject(forObject);
if(StringUtils.isNotBlank(sessionInfo.getString("errcode"))){
if(!sessionInfo.getString("errcode").equals(TiktokConstant.SUCCESS)){
log.error("微信授权session接口调用失败,错误状态码为:【{}】,错误信息为:【{}】",sessionInfo.getString("errcode"),sessionInfo.getString("errmsg"));
throw new ServiceException("微信授权session接口调用失败!",TiktokConstant.CALL_WECHAT_FAIL);
}
}
//调用成功,组装返回数据
WxSessionInfoVo result = new WxSessionInfoVo();
result.setSessionKey(sessionInfo.getString("session_key"));
result.setOpenId(sessionInfo.getString("openid"));
return result;
}
/**
* 获取用户敏感信息
* @param sessionKey -
* @param encryptedData 敏感数据
* @param iv 加密向量
* @return -
*/
private WxUserInfoVo getUserInfo(String sessionKey, String encryptedData, String iv){
Base64.Decoder decoder = Base64.getDecoder();
byte[] sessionKeyBytes = decoder.decode(sessionKey);
byte[] ivBytes = decoder.decode(iv);
byte[] encryptedBytes = decoder.decode(encryptedData);
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] ret = cipher.doFinal(encryptedBytes);
if (null != ret && ret.length > 0) {
String result = new String(ret, "UTF-8");
return JSONObject.parseObject(result,WxUserInfoVo.class);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 保存用户
* @param creator 艺术家信息
* @param openId 微信id
* @param sessionKey -
* @param encryptedData 敏感信息数据
* @param iv 加密向量
* @return -
*/
private Creator saveUserInfo(Creator creator,String openId, String sessionKey, String encryptedData, String iv){
if (ObjectUtils.isEmpty(creator)) { if (ObjectUtils.isEmpty(creator)) {
//创建用户 //创建用户
creator = new Creator(); creator = new Creator();
//获取用户昵称和头像 //获取用户昵称和头像
WxMaUserInfo userInfo = wxMaUserService.getUserInfo(sessionKey, encryptedData, iv); WxUserInfoVo userInfo = this.getUserInfo(sessionKey, encryptedData, iv);
creator.setImg(userInfo.getAvatarUrl()); creator.setImg(userInfo.getAvatarUrl());
creator.setName(userInfo.getNickName()); creator.setName(userInfo.getNickName());
creator.setOpenId(Sm4Util.sm4Encryption(openId)); creator.setOpenId(Sm4Util.sm4Encryption(openId));
@ -290,34 +353,32 @@ public class CreatorServiceImpl implements CreatorService {
} }
@Override @Override
public Map<String, Object> login(WxLoginDto param) { public Map<String, Object> login(WxLoginDto dto) {
try{ WxSessionInfoVo sessionInfo = this.getSessionInfo(dto.getCode());
//code换openId等相关信息 //检查数据库中是否存在该openId,存在则直接设置会话状态登录;不存在则新增
WxMaJscode2SessionResult sessionInfo = wxMaUserService.getSessionInfo(param.getCode()); LambdaQueryWrapper<Creator> wrapper = new LambdaQueryWrapper<>();
//插入或更新艺术家到数据库 wrapper.eq(sessionInfo.getOpenId() != null,Creator::getOpenId,Sm4Util.sm4Encryption(sessionInfo.getOpenId()));
QueryWrapper<Creator> qw = new QueryWrapper<>(); Creator creator = creatorMapper.selectOne(wrapper);
qw.eq("open_id", sessionInfo.getOpenid()); if(creator == null){
Creator creator = creatorMapper.selectOne(qw); //新用户,新增
//检查数据库是否存在该艺术家,不存在则新增,存在更新昵称和头像 creator = this.saveUserInfo(creator,sessionInfo.getOpenId(), sessionInfo.getSessionKey(), dto.getEncryptedData(), dto.getIv());
creator = saveOrUpdate(creator, sessionInfo.getOpenid(), sessionInfo.getSessionKey(), param.getEncryptedData(), param.getIv()); }
//检查登录态是否能在,存在则删除创建新的登录态 //设置会话状态
String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+sessionInfo.getOpenid(); String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+Sm4Util.sm4Encryption(sessionInfo.getOpenId());
//存在该登录态则删除刷新
if(redisService.hasKey(redisKey)){ if(redisService.hasKey(redisKey)){
redisService.deleteObject(redisKey); redisService.deleteObject(redisKey);
} }
//缓存到redis
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
String randomId = IdUtils.fastSimpleUUID(); String randomId = IdUtils.fastSimpleUUID();
sb.append(randomId).append("#").append(sessionInfo.getOpenid()); sb.append(randomId).append("#").append(sessionInfo.getOpenId());
//设置登录会话 //设置登录会话
redisService.setCacheObject(redisKey,sb.toString(), 10L, TimeUnit.DAYS); Map<String, Object> map = new HashMap<>(2);
Map<String, Object> map = new HashMap<>(16);
map.put("token", sb.toString()); map.put("token", sb.toString());
map.put("creator",creator); map.put("sessionKey", sessionInfo.getSessionKey());
map.put("userInfo",creator);
redisService.setCacheObject(redisKey,map, 30L, TimeUnit.DAYS);
return map; return map;
}catch (WxErrorException e){
throw new ServiceException(e.getMessage(), TiktokConstant.CALL_WECHAT_FAIL);
}
} }
@Override @Override

1
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java

@ -50,7 +50,6 @@ public class WxUserServiceImpl implements WxUserService {
@Autowired @Autowired
private TiktokCollectionMapper tiktokCollectionMapper; private TiktokCollectionMapper tiktokCollectionMapper;
@Autowired
private WxMaUserService wxMaUserService; private WxMaUserService wxMaUserService;
@Override @Override

26
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxSessionInfoVo.java

@ -0,0 +1,26 @@
package com.bnyer.img.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@ApiModel("微信sessionInfo响应类")
public class WxSessionInfoVo implements Serializable {
@ApiModelProperty(value="sessionKey")
private String sessionKey;
@ApiModelProperty(value="openId")
private String openId;
// @ApiModelProperty(value="unionId")
// private String unionId;
private static final long serialVersionUID = 1L;
}

36
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxUserInfoVo.java

@ -0,0 +1,36 @@
package com.bnyer.img.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@ApiModel("微信平台用户响应类")
public class WxUserInfoVo implements Serializable {
@ApiModelProperty(value="用户昵称")
private String nickName;
@ApiModelProperty(value="用户头像网络地址")
private String avatarUrl;
@ApiModelProperty(value="用户性别,0: 未知;1:男性;2:女性")
private String gender;
@ApiModelProperty(value="用户所在城市")
private String city;
@ApiModelProperty(value="用户所在省份")
private String province;
@ApiModelProperty(value="用户所在国家")
private String country;
@ApiModelProperty(value="用户openId")
private String openId;
}
Loading…
Cancel
Save