diff --git a/bnyer-services/bnyer-img/pom.xml b/bnyer-services/bnyer-img/pom.xml index 47d63c9..28c0cfe 100644 --- a/bnyer-services/bnyer-img/pom.xml +++ b/bnyer-services/bnyer-img/pom.xml @@ -95,6 +95,20 @@ xxl-job-core 2.1.2 + + + + com.github.binarywang + weixin-java-miniapp + 4.2.0 + + + + + com.github.binarywang + weixin-java-pay + 4.2.0 + diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java index b69909e..66c3871 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java @@ -45,4 +45,9 @@ public class TiktokConstant { * 艺术家可提现余额不足 */ public static final Integer CREATOR_AMT_NOT_ENOUGH = 105007; + + /** + * 微信获取session调用失败 + */ + public static final Integer CALL_WECHAT_FAIL = 105008; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java index 56ebc06..50e281f 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java @@ -240,4 +240,13 @@ public class CreatorMiniController extends BaseController { public AjaxResult queryFrontEndProfitAmt(@Validated @RequestBody @ApiParam("转入钱包对象") ProfitStatusDto params){ return AjaxResult.success(creatorProfitService.queryFrontEndProfitAmt(params.getCreatorId(),params.getType())); } + + //@TokenCheck + @PostMapping("/login") + @ApiOperation("小程序艺术家登录") + public AjaxResult login(@Validated @ApiParam("艺术家数据") @RequestBody WxLoginDto param) + { + log.info("小程序艺术家数据参数为:{}", JSON.toJSON(param)); + return AjaxResult.success(creatorService.login(param)); + } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WxLoginDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WxLoginDto.java new file mode 100644 index 0000000..c92e63a --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/WxLoginDto.java @@ -0,0 +1,28 @@ +package com.bnyer.img.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Getter +@Setter +@ApiModel("微信登录入参") +public class WxLoginDto implements Serializable { + + @NotBlank(message = "微信code不能为空!") + @ApiModelProperty(value = "微信code") + private String code; + + @NotBlank(message = "加密数据不能为空!") + @ApiModelProperty(value = "加密数据") + private String encryptedData; + + @NotBlank(message = "加密算法向量不能为空!") + @ApiModelProperty(value = "加密算法向量") + private String iv; +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java index 85bff1f..8c944aa 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java @@ -1,13 +1,11 @@ package com.bnyer.img.service; import com.bnyer.img.domain.Creator; -import com.bnyer.img.dto.CreatorDto; -import com.bnyer.img.dto.CreatorPageDto; -import com.bnyer.img.dto.CreatorUpdateDto; -import com.bnyer.img.dto.VerifyDto; +import com.bnyer.img.dto.*; import com.bnyer.img.vo.CreatorVo; import java.util.List; +import java.util.Map; /** * @author chengkun @@ -92,5 +90,10 @@ public interface CreatorService { */ int reVerify(Long id); - //TODO 微信登录 + /** + * 小程序用户登录 + * @param param 前端传来的参数 + * @return - + */ + Map login(WxLoginDto param); } 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 f2871d2..678e2b6 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,7 +1,12 @@ 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.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; 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; @@ -17,6 +22,7 @@ import com.bnyer.img.domain.VerifyLog; import com.bnyer.img.dto.CreatorDto; import com.bnyer.img.dto.CreatorPageDto; import com.bnyer.img.dto.VerifyDto; +import com.bnyer.img.dto.WxLoginDto; import com.bnyer.img.mapper.CreatorMapper; import com.bnyer.img.mapper.InviteLogMapper; import com.bnyer.img.mapper.TiktokImgMapper; @@ -24,12 +30,16 @@ import com.bnyer.img.mapper.VerifyLogMapper; import com.bnyer.img.service.CreatorService; import com.bnyer.img.vo.CreatorVo; 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 java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -55,6 +65,8 @@ public class CreatorServiceImpl implements CreatorService { @Autowired private RedisService redisService; + private WxMaUserService wxMaUserService; + /** * 检查用户是否绑定过手机号 * @param phone 手机号 @@ -258,4 +270,55 @@ public class CreatorServiceImpl implements CreatorService { creator.setStatus("0"); return creatorMapper.update(creator,wrapper); } + + private Creator saveOrUpdate(Creator creator,String openId,String sessionKey,String encryptedData,String iv){ + if (ObjectUtils.isEmpty(creator)) { + //创建用户 + creator = new Creator(); + //获取用户昵称和头像 + WxMaUserInfo userInfo = wxMaUserService.getUserInfo(sessionKey, encryptedData, iv); + creator.setImg(userInfo.getAvatarUrl()); + creator.setName(userInfo.getNickName()); + creator.setOpenId(Sm4Util.sm4Encryption(openId)); + creator.setCreateTime(new Date()); + creator.setUpdateTime(new Date()); + int insert = creatorMapper.insert(creator); + log.info("艺术家【{}】创建成功!", openId); + return creator; + }else{ + log.info("该艺术家【{}】已存在!",openId); + return creator; + } + } + + @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); + } + } }