src/main/java/com/mzl/flower/config/ResourceServerConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/service/system/UserService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/service/system/WeChatService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/web/login/CustomerLoginController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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() 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; } 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; } 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); } } } 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()); } } } 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{