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