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; +}