From 6d2ec1b3b6979bce9c8f9244c8a17f5ccfa67063 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期四, 26 十二月 2024 17:21:36 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v4' into master-v4 --- src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java | 21 +++++ src/main/java/com/mzl/flower/config/ResourceServerConfig.java | 2 src/main/java/com/mzl/flower/service/system/WeChatService.java | 47 +++++++++++ src/main/java/com/mzl/flower/web/login/CustomerLoginController.java | 32 ++++++++ src/main/java/com/mzl/flower/service/system/UserService.java | 77 +++++++++++++++++++ src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java | 18 ++++ 6 files changed, 196 insertions(+), 1 deletions(-) diff --git a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java index 566cc62..ac8a6c5 100644 --- a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java +++ b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java @@ -37,7 +37,9 @@ httpSecurity .authorizeRequests() .antMatchers("/api/login/**").permitAll() + .antMatchers("/api/wx/getuserphonenumber").permitAll() .antMatchers("/api/wx/jscode2session").permitAll() + .antMatchers("/api/wx/getExistUserByOpenId").permitAll() .antMatchers("/api/pub/**").permitAll() .antMatchers("/api/advertisement/**").permitAll() .antMatchers("/api/ua/**").permitAll() diff --git a/src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java b/src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java index 1ec3b55..db1478b 100644 --- a/src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java @@ -13,4 +13,22 @@ private String imgUrl; private String nickname; + + private String userType; + + /** + * 不带区号的电话号码 + */ + private String purePhoneNumber; + + /** + * 带区号的电话号码 + */ + private String phoneNumber; + + private String openId; + + private String sessionKey; + + private String unionId; } diff --git a/src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java b/src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java new file mode 100644 index 0000000..1af56b2 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java @@ -0,0 +1,21 @@ +package com.mzl.flower.dto.response.wx; + +import com.mzl.flower.entity.system.User; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WxUserVO { + + private String openId; + + private String sessionKey; + + private String unionId; + + private User user; + +} diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java index e5286b5..fafa505 100644 --- a/src/main/java/com/mzl/flower/service/system/UserService.java +++ b/src/main/java/com/mzl/flower/service/system/UserService.java @@ -7,6 +7,8 @@ import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.request.BindWechatDTO; +import com.mzl.flower.dto.request.CreateWechatUserDTO; +import com.mzl.flower.dto.request.customer.UpdateCustomerDTO; import com.mzl.flower.dto.request.system.*; import com.mzl.flower.dto.response.current.CurrentUserDTO; import com.mzl.flower.dto.response.system.EmployeeDTO; @@ -20,6 +22,7 @@ import com.mzl.flower.mapper.system.*; import com.mzl.flower.service.customer.CustomerService; import com.mzl.flower.service.partner.PartnerService; +import com.mzl.flower.service.payment.RedisLockService; import com.mzl.flower.service.point.CustomerPointService; import com.mzl.flower.service.supplier.StationService; import com.mzl.flower.service.supplier.SupplierService; @@ -27,15 +30,21 @@ import com.mzl.flower.utils.UUIDGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.validation.constraints.NotBlank; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; @Service @Transactional @@ -83,6 +92,8 @@ @Autowired private StationService stationService; + @Autowired + RedissonClient redissonClient; public User findUserByOpenId(String openId, String sessionKey, String unionId , String imgUrl, String nickname,String userType){ @@ -483,4 +494,70 @@ .eq(User::getVipGrade,getVipGrade); return userMapper.selectList(queryWrapper); } + + /** + * 查看微信是否已经存在用户 + * @param openId + * @param sessionKey + * @param unionId + * @param userType + * @return + */ + public User getExistUserByOpenId(String openId, String sessionKey, String unionId, String userType) { + List<String> userTypes = new ArrayList<>(); + userTypes.add(userType); + User user = userMapper.getByOpenID(openId,userTypes); + return user; + } + + public void registWxUser(CreateWechatUserDTO dto) { + String RETISTER_KEY = "%s_%s"; + RLock lock = redissonClient.getLock(String.format(RETISTER_KEY,dto.getPurePhoneNumber(),dto.getUserType())); + try { + // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒 + if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { + try{ + // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在 + if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) { + throw new ValidationException("微信获取的电话号码为空!无法注册"); + } + // 1:查看用户存在不存在 + List<String> userTypes = new ArrayList<>(); + userTypes.add(dto.getUserType()); + User user = findByLoginName(dto.getPurePhoneNumber(), userTypes); + if (ObjectUtils.isEmpty(user)) { + // 是新用户,需要注册 + user = new User(); + user.setId(UUIDGenerator.getUUID()); + user.setLoginName(dto.getPurePhoneNumber()); + user.setTel(dto.getPurePhoneNumber()); + user.setNickName(dto.getPurePhoneNumber()); + user.setPassword(passwordEncoder.encode("12345678")); + user.setType(dto.getUserType()); + user.setStatus(Constants.STATUS_ACTIVE); + user.setIsSys(Constants.N); + user.create(); + userMapper.insert(user); + + // 注册商户信息 + UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO(); + updateCustomerDTO.setUserId(user.getId()); + if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) { + updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4)); + } + customerService.addOrUpdateCustomer(updateCustomerDTO); + } + + BindWechatDTO wechatDTO = new BindWechatDTO(); + wechatDTO.setRealName(dto.getPurePhoneNumber()); + bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO); + }finally { + lock.unlock(); + } + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } diff --git a/src/main/java/com/mzl/flower/service/system/WeChatService.java b/src/main/java/com/mzl/flower/service/system/WeChatService.java index b47e88e..51c39d0 100644 --- a/src/main/java/com/mzl/flower/service/system/WeChatService.java +++ b/src/main/java/com/mzl/flower/service/system/WeChatService.java @@ -4,10 +4,13 @@ import cn.binarywang.wx.miniapp.api.WxMaUserService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.hutool.http.HttpUtil; +import com.google.gson.Gson; import com.mzl.flower.base.cache.StringCacheClient; import com.mzl.flower.config.WxMiniappProperties; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.constant.Constants; +import com.mzl.flower.dto.request.CreateWechatUserDTO; import com.mzl.flower.service.BaseService; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; @@ -22,6 +25,7 @@ import java.io.File; import java.io.IOException; +import java.util.HashMap; import java.util.Map; @Service @@ -41,6 +45,9 @@ @Autowired private WxMiniappProperties wxMiniappProperties; + @Autowired + private Gson gson; + /** * 小程序获取会话信息-花店端 * @param code @@ -49,7 +56,6 @@ */ public WxMaJscode2SessionResult getWxMaSessionInfo(String code) throws WxErrorException { WxMaJscode2SessionResult result = maService.jsCode2SessionInfo(code); - return result; } @@ -155,5 +161,44 @@ throw new ValidationException(e.getMessage()); } } + public Map<String,Object> getuserphonenumber(CreateWechatUserDTO dto) { + if (StringUtils.isEmpty(dto.getCode())) { + throw new ValidationException("微信code为空"); + } + String accessToken=""; + try { + accessToken=maService.getAccessToken(); + } catch (WxErrorException e) { + throw new RuntimeException(e); + } + + if(StringUtils.isEmpty(accessToken)){ + accessToken=getAccessToken( + wxMiniappProperties.getCustomer().getAppid(), + wxMiniappProperties.getCustomer().getSecret()); + if(StringUtils.isEmpty(accessToken)){ + throw new ValidationException("获取微信AccessToken失败"); + } + } + + + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="+ accessToken; + try{ + Map<String,Object> params=new HashMap<String,Object>(); + params.put("code",dto.getCode()); + String result = HttpUtil.post(url, gson.toJson(params)); + System.out.println(result); + Map<String,Object> resultMap=gson.fromJson(result,Map.class); + if(!resultMap.get("errmsg").equals("ok")){ + String errmsg = (String)resultMap.get("errmsg"); + log.error(resultMap.get("errcode") + ":" + errmsg); + throw new ValidationException(errmsg); + } + return resultMap; + }catch (Exception e){ + log.error(e.getMessage(), e); + throw new ValidationException(e.getMessage()); + } + } } diff --git a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java index a249fe9..f0b1510 100644 --- a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java +++ b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java @@ -15,9 +15,11 @@ import com.mzl.flower.dto.request.CreateWechatUserDTO; import com.mzl.flower.dto.request.UserLoginDTO; import com.mzl.flower.dto.response.customer.CustomerDTO; +import com.mzl.flower.dto.response.wx.WxUserVO; import com.mzl.flower.entity.system.User; import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.service.customer.CustomerService; +import com.mzl.flower.service.impl.WechatUserDetailsService; import com.mzl.flower.service.login.LoginService; import com.mzl.flower.service.system.UserService; import com.mzl.flower.service.system.WeChatService; @@ -41,6 +43,7 @@ import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotBlank; +import java.util.Map; @Slf4j @RestController @@ -76,6 +79,7 @@ public static final String SEPARATOR = ":"; + @PostMapping("/login/wechat") @ApiOperation(value = "微信小程序登录", notes = "微信小程序登录") public ResponseEntity<ReturnDataDTO<OAuth2AccessToken>> loginWeChat( @@ -84,6 +88,17 @@ String openId = session.getOpenid(); String sessionKey = session.getSessionKey(); String unionId = session.getUnionid(); + // 判断当前用户账号是否存在 + dto.setOpenId(openId); + dto.setSessionKey(sessionKey); + dto.setUnionId(unionId); + dto.setUserType(Constants.USER_TYPE.customer.name()); + + User existUserByOpenId = userService.getExistUserByOpenId(openId, sessionKey, unionId, Constants.USER_TYPE.customer.name()); + if(ObjectUtils.isEmpty(existUserByOpenId)){ + userService.registWxUser(dto); + } + User user = userService.findUserByOpenId(openId, sessionKey, unionId , dto.getImgUrl(), dto.getNickname(),Constants.USER_TYPE.customer.name()); String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId()); @@ -108,6 +123,23 @@ } } + @PostMapping("/wx/getuserphonenumber") + @ApiOperation(value = "获取当前授权的手机号") + public ResponseEntity<ReturnDataDTO> getuserphonenumber(@RequestBody CreateWechatUserDTO dto) throws Exception{ + return returnData(R.SUCCESS.getCode(), weChatService.getuserphonenumber(dto)); + } + + @PostMapping("/wx/getExistUserByOpenId") + @ApiOperation(value = "查看当前微信号是否已经绑定了用户") + public ResponseEntity<ReturnDataDTO> getExistUserByOpenId(@RequestBody CreateWechatUserDTO dto) throws Exception{ + WxMaJscode2SessionResult session = weChatService.getWxMaSessionInfo(dto.getCode()); + String openId = session.getOpenid(); + String sessionKey = session.getSessionKey(); + String unionId = session.getUnionid(); + User user=userService.getExistUserByOpenId(openId, sessionKey, unionId,dto.getUserType()); + return returnData(R.SUCCESS.getCode(), new WxUserVO(openId,sessionKey,unionId,user)); + } + @GetMapping("/wx/jscode2session") @ApiOperation(value = "微信小程序授权") public ResponseEntity<ReturnDataDTO> jscode2session(@NotBlank(message = "授权码不能为空") String jsCode,String userType) throws Exception{ -- Gitblit v1.9.3