cloudroam
2024-12-26 6d2ec1b3b6979bce9c8f9244c8a17f5ccfa67063
Merge remote-tracking branch 'origin/master-v4' into master-v4
已修改5个文件
已添加1个文件
197 ■■■■■ 文件已修改
src/main/java/com/mzl/flower/config/ResourceServerConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/CreateWechatUserDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/response/wx/WxUserVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/system/UserService.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/system/WeChatService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/login/CustomerLoginController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | 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{