From c6e9715b6e593738abf1a35e49c1bbac0966f3a4 Mon Sep 17 00:00:00 2001
From: 陶杰 <1378534974@qq.com>
Date: 星期四, 26 十二月 2024 16:23:34 +0800
Subject: [PATCH] 1.微信登录:未注册的用户自动注册
---
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