From e2c7c23053c3b7807c89bcd86f5cf601ff9f0b56 Mon Sep 17 00:00:00 2001
From: penny <2500338766@qq.com>
Date: Mon, 4 Jul 2022 23:41:18 +0800
Subject: [PATCH] =?UTF-8?q?feature1.0.0-img:=20=E4=BC=98=E5=8C=96=E8=89=BA?=
=?UTF-8?q?=E6=9C=AF=E5=AE=B6=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bnyer-services/bnyer-img/pom.xml | 2 +-
.../bnyer/img/constants/RedisKeyConstant.java | 2 +-
.../img/service/impl/CreatorServiceImpl.java | 145 +++++++++++++-----
.../img/service/impl/WxUserServiceImpl.java | 1 -
.../com/bnyer/img/vo/WxSessionInfoVo.java | 26 ++++
.../java/com/bnyer/img/vo/WxUserInfoVo.java | 36 +++++
6 files changed, 167 insertions(+), 45 deletions(-)
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxSessionInfoVo.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxUserInfoVo.java
diff --git a/bnyer-services/bnyer-img/pom.xml b/bnyer-services/bnyer-img/pom.xml
index 1811aec..970d1b9 100644
--- a/bnyer-services/bnyer-img/pom.xml
+++ b/bnyer-services/bnyer-img/pom.xml
@@ -96,7 +96,7 @@
2.1.2
-
+
com.github.binarywang
weixin-java-miniapp
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
index 3d4d4cf..e17c430 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
+++ b/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 WECHAT_USER_LOGIN_KEY = "bnyer.img.wx.user:";
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java
index 0a2e96d..aa1291d 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java
@@ -1,16 +1,15 @@
package com.bnyer.img.service.impl;
-import cn.binarywang.wx.miniapp.api.WxMaUserService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
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.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.Sm4Util;
import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.common.core.utils.uuid.IdUtils;
import com.bnyer.common.redis.service.RedisService;
+import com.bnyer.img.config.WxConfig;
import com.bnyer.img.constants.RedisKeyConstant;
import com.bnyer.img.constants.TiktokConstant;
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.VerifyLogMapper;
import com.bnyer.img.service.CreatorService;
-import com.bnyer.img.vo.CreatorHotVo;
-import com.bnyer.img.vo.CreatorTypeImgsVo;
-import com.bnyer.img.vo.CreatorVo;
+import com.bnyer.img.vo.*;
import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.TimeUnit;
/**
@@ -67,7 +64,12 @@ public class CreatorServiceImpl implements CreatorService {
private RedisService redisService;
@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);
}
- 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)) {
//创建用户
creator = new Creator();
//获取用户昵称和头像
- WxMaUserInfo userInfo = wxMaUserService.getUserInfo(sessionKey, encryptedData, iv);
+ WxUserInfoVo userInfo = this.getUserInfo(sessionKey, encryptedData, iv);
creator.setImg(userInfo.getAvatarUrl());
creator.setName(userInfo.getNickName());
creator.setOpenId(Sm4Util.sm4Encryption(openId));
@@ -290,34 +353,32 @@ public class CreatorServiceImpl implements CreatorService {
}
@Override
- public Map login(WxLoginDto param) {
- try{
- //code换openId等相关信息
- WxMaJscode2SessionResult sessionInfo = wxMaUserService.getSessionInfo(param.getCode());
- //插入或更新艺术家到数据库
- QueryWrapper qw = new QueryWrapper<>();
- qw.eq("open_id", sessionInfo.getOpenid());
- Creator creator = creatorMapper.selectOne(qw);
- //检查数据库是否存在该艺术家,不存在则新增,存在更新昵称和头像
- creator = saveOrUpdate(creator, sessionInfo.getOpenid(), sessionInfo.getSessionKey(), param.getEncryptedData(), param.getIv());
- //检查登录态是否能在,存在则删除创建新的登录态
- String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+sessionInfo.getOpenid();
- if(redisService.hasKey(redisKey)){
- redisService.deleteObject(redisKey);
- }
- //缓存到redis
- StringBuffer sb = new StringBuffer();
- String randomId = IdUtils.fastSimpleUUID();
- sb.append(randomId).append("#").append(sessionInfo.getOpenid());
- //设置登录会话
- redisService.setCacheObject(redisKey,sb.toString(), 10L, TimeUnit.DAYS);
- Map map = new HashMap<>(16);
- map.put("token", sb.toString());
- map.put("creator",creator);
- return map;
- }catch (WxErrorException e){
- throw new ServiceException(e.getMessage(), TiktokConstant.CALL_WECHAT_FAIL);
+ public Map login(WxLoginDto dto) {
+ WxSessionInfoVo sessionInfo = this.getSessionInfo(dto.getCode());
+ //检查数据库中是否存在该openId,存在则直接设置会话状态登录;不存在则新增
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(sessionInfo.getOpenId() != null,Creator::getOpenId,Sm4Util.sm4Encryption(sessionInfo.getOpenId()));
+ Creator creator = creatorMapper.selectOne(wrapper);
+ if(creator == null){
+ //新用户,新增
+ creator = this.saveUserInfo(creator,sessionInfo.getOpenId(), sessionInfo.getSessionKey(), dto.getEncryptedData(), dto.getIv());
+ }
+ //设置会话状态
+ String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+Sm4Util.sm4Encryption(sessionInfo.getOpenId());
+ //存在该登录态则删除刷新
+ if(redisService.hasKey(redisKey)){
+ redisService.deleteObject(redisKey);
}
+ StringBuffer sb = new StringBuffer();
+ String randomId = IdUtils.fastSimpleUUID();
+ sb.append(randomId).append("#").append(sessionInfo.getOpenId());
+ //设置登录会话
+ Map map = new HashMap<>(2);
+ map.put("token", sb.toString());
+ map.put("sessionKey", sessionInfo.getSessionKey());
+ map.put("userInfo",creator);
+ redisService.setCacheObject(redisKey,map, 30L, TimeUnit.DAYS);
+ return map;
}
@Override
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java
index e2286b7..37333ea 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/WxUserServiceImpl.java
@@ -50,7 +50,6 @@ public class WxUserServiceImpl implements WxUserService {
@Autowired
private TiktokCollectionMapper tiktokCollectionMapper;
- @Autowired
private WxMaUserService wxMaUserService;
@Override
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxSessionInfoVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxSessionInfoVo.java
new file mode 100644
index 0000000..a02834a
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxUserInfoVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/WxUserInfoVo.java
new file mode 100644
index 0000000..3e9c3f1
--- /dev/null
+++ b/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;
+}