package com.dy.pipIrrWechat.client; 
 | 
  
 | 
import com.alibaba.fastjson2.JSONObject; 
 | 
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; 
 | 
import com.aliyuncs.exceptions.ClientException; 
 | 
import com.dy.common.webUtil.BaseResponse; 
 | 
import com.dy.common.webUtil.BaseResponseUtils; 
 | 
import com.dy.pipIrrGlobal.pojoSe.SeCodeVerify; 
 | 
import com.dy.pipIrrGlobal.pojoSe.SeOpenId; 
 | 
import com.dy.pipIrrGlobal.voSe.VoClientWechat; 
 | 
import com.dy.pipIrrWechat.client.dto.CodeLoginDTO; 
 | 
import com.dy.pipIrrWechat.client.dto.CodeVerifyDTO; 
 | 
import com.dy.pipIrrWechat.result.WechatResultCode; 
 | 
import com.dy.pipIrrWechat.sms.AliyunSmsSv; 
 | 
import com.dy.pipIrrWechat.sms.RandomCode; 
 | 
import com.dy.pipIrrWechat.util.RestTemplateUtil; 
 | 
import com.dy.pipIrrWechat.wechatpay.PayInfo; 
 | 
import io.swagger.v3.oas.annotations.tags.Tag; 
 | 
import jakarta.validation.Valid; 
 | 
import lombok.RequiredArgsConstructor; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.http.MediaType; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.validation.BindingResult; 
 | 
import org.springframework.web.bind.annotation.*; 
 | 
  
 | 
import java.io.IOException; 
 | 
import java.util.*; 
 | 
  
 | 
/** 
 | 
 * @author ZhuBaoMin 
 | 
 * @date 2024-06-19 14:21 
 | 
 * @LastEditTime 2024-06-19 14:21 
 | 
 * @Description 
 | 
 */ 
 | 
  
 | 
@Slf4j 
 | 
@Tag(name = "农户数据操作", description = "农户数据操作") 
 | 
@RestController 
 | 
@RequestMapping(path="client") 
 | 
@RequiredArgsConstructor 
 | 
public class ClientCtrl { 
 | 
    private final ClientSv clientSv; 
 | 
    private final AliyunSmsSv aliyunSmsSv; 
 | 
    private final RestTemplateUtil restTemplateUtil; 
 | 
    //private final String appid = PayInfo.appid; 
 | 
    //private final String secret = PayInfo.secret; 
 | 
    private final String mchid = PayInfo.mchid; 
 | 
    private final String schema = PayInfo.schema; 
 | 
    private final String signType = PayInfo.signType; 
 | 
    private final String description = PayInfo.description; 
 | 
    private final String loginUrl = PayInfo.loginUrl; 
 | 
    private final String notifyUrl = PayInfo.notifyUrl; 
 | 
    private final String grantType = PayInfo.grantType; 
 | 
  
 | 
    /** 
 | 
     * 登录凭证登录 
 | 
     * @param po 
 | 
     * @param bindingResult 
 | 
     * @return 
 | 
     * @throws IOException 
 | 
     */ 
 | 
    @PostMapping(path = "code_login", consumes = MediaType.APPLICATION_JSON_VALUE) 
 | 
    public BaseResponse<JSONObject> codeLogin(@RequestBody @Valid CodeLoginDTO po, BindingResult bindingResult) throws IOException { 
 | 
        if(bindingResult != null && bindingResult.hasErrors()){ 
 | 
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); 
 | 
        } 
 | 
        String code = po.getCode(); 
 | 
  
 | 
        // 登录凭证校验 
 | 
        Map<String, Object> queryParams = new HashMap<>(); 
 | 
        queryParams.put("appid", PayInfo.appid); 
 | 
        queryParams.put("secret", PayInfo.secret); 
 | 
        queryParams.put("js_code", code); 
 | 
        queryParams.put("grant_type", grantType); 
 | 
        Map<String, String> headerParams = new HashMap<>(); 
 | 
        JSONObject job = restTemplateUtil.get(loginUrl, queryParams, headerParams); 
 | 
  
 | 
        if(job.containsKey("errmsg ")) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.INVALID_CODE.getMessage()); 
 | 
        } 
 | 
  
 | 
        String openId = job.getString("openid"); 
 | 
        if(openId == null) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.LOGIN_FAIL.getMessage()); 
 | 
        } 
 | 
  
 | 
        try { 
 | 
            JSONObject job_client = new JSONObject(); 
 | 
            VoClientWechat res = clientSv.getSimpleClientInfo(null, openId); 
 | 
            if(res != null) { 
 | 
                job_client.put("client", res); 
 | 
            } else { 
 | 
                VoClientWechat voClientWechat = new VoClientWechat(); 
 | 
                job_client.put("client", voClientWechat); 
 | 
            } 
 | 
            return BaseResponseUtils.buildSuccess(job_client); 
 | 
        } catch (Exception e) { 
 | 
            log.error("查询农户异常", e); 
 | 
            return BaseResponseUtils.buildException(e.getMessage()) ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 发送验证码 
 | 
     * @param phoneNumber 
 | 
     * @return 
 | 
     */ 
 | 
    @PostMapping(path = "send_sms") 
 | 
    public BaseResponse<Boolean> sendSms(@RequestParam(name = "phoneNumber", required = true) String phoneNumber) throws ClientException { 
 | 
        if(phoneNumber == null || phoneNumber.length() <= 0) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PHONE_NUMBER_CANNOT_BE_NULL.getMessage()); 
 | 
        } 
 | 
  
 | 
        Long clientId = clientSv.getClientIdByPhone(phoneNumber); 
 | 
        if(clientId == null) { 
 | 
            return BaseResponseUtils.buildErrorMsg("该手机号对应的农户不存在"); 
 | 
        } 
 | 
  
 | 
  
 | 
        // 生成6位验证码并转为Json格式 
 | 
        String securityCode = String.valueOf(RandomCode.genCode()); 
 | 
        JSONObject param = new JSONObject(); 
 | 
        param.put("code", securityCode); 
 | 
        String templateParam = param.toJSONString(); 
 | 
  
 | 
        //redisUtils.set(phoneNumber, securityCode, 60); 
 | 
  
 | 
        // 获取当前时间戳并延后3分钟 
 | 
        Long timestamp = System.currentTimeMillis(); 
 | 
        Calendar calendar = Calendar.getInstance(); 
 | 
        calendar.setTimeInMillis(timestamp); 
 | 
        calendar.add(Calendar.SECOND, 180); 
 | 
        Long expires = calendar.getTimeInMillis(); 
 | 
  
 | 
        SeCodeVerify codeVerify = new SeCodeVerify(); 
 | 
        codeVerify.setPhoneNumber(phoneNumber); 
 | 
        codeVerify.setSecurityCode(securityCode); 
 | 
        codeVerify.setExpires(expires); 
 | 
        clientSv.addCodeVerify(codeVerify); 
 | 
  
 | 
        SendSmsResponse response = aliyunSmsSv.sendSms(phoneNumber, templateParam); 
 | 
        if (response.getCode().equals("OK")) { 
 | 
            // 发送成功处理逻辑 
 | 
            return BaseResponseUtils.buildSuccess(true) ; 
 | 
        } else { 
 | 
            // 发送失败处理逻辑 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.SECURITY_CODE_SEND_FAIL.getMessage()) ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 校验验证码 
 | 
     * @param po 
 | 
     * @param bindingResult 
 | 
     * @return 
 | 
     * @throws IOException 
 | 
     */ 
 | 
    @PostMapping(path = "verify", consumes = MediaType.APPLICATION_JSON_VALUE) 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public BaseResponse<Boolean> verify(@RequestBody @Valid CodeVerifyDTO po, BindingResult bindingResult) throws IOException { 
 | 
        if(bindingResult != null && bindingResult.hasErrors()){ 
 | 
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); 
 | 
        } 
 | 
  
 | 
        String phoneNumber = po.getPhoneNumber(); 
 | 
        String securityCode = po.getSecurityCode(); 
 | 
        String code = po.getCode(); 
 | 
  
 | 
        // 进行手机号、验证码、过期时间校验 
 | 
        SeCodeVerify codeVerify = clientSv.getCodeVerify(phoneNumber); 
 | 
        if(codeVerify == null) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_SECURITY_CODE_FOR_PHONE.getMessage()); 
 | 
        } 
 | 
  
 | 
        if(!codeVerify.getSecurityCode().equals(securityCode)) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.SECURITY_CODE_ERROR.getMessage()); 
 | 
        } 
 | 
  
 | 
        Long currentTimestamp = System.currentTimeMillis(); 
 | 
        if(currentTimestamp > codeVerify.getExpires() ) { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.VALIDATION_TIMEOUT.getMessage()); 
 | 
        } 
 | 
  
 | 
        // 校验通过,进行登录凭证校验 
 | 
        Map<String, Object> queryParams = new HashMap<>(); 
 | 
        queryParams.put("appid", PayInfo.appid); 
 | 
        queryParams.put("secret", PayInfo.secret); 
 | 
        queryParams.put("js_code", code); 
 | 
        queryParams.put("grant_type", grantType); 
 | 
        Map<String, String> headerParams = new HashMap<>(); 
 | 
        JSONObject job = restTemplateUtil.get(loginUrl, queryParams, headerParams); 
 | 
  
 | 
        if(job.getLong("errcode") != null && job.getLong("errcode") >= -1) { 
 | 
            return BaseResponseUtils.buildErrorMsg("登录凭证校验失败"); 
 | 
        } 
 | 
        String openid = job.getString("openid"); 
 | 
        String sessionKey = job.getString("session_key"); 
 | 
  
 | 
        Long clientId = clientSv.getClientIdByPhone(phoneNumber); 
 | 
        String sessionId = ""; 
 | 
        if(clientId != null) { 
 | 
            // 添加微信用户账户记录 
 | 
            SeOpenId seOpenId = new SeOpenId(); 
 | 
            seOpenId.setClientId(clientId); 
 | 
            seOpenId.setOpenId(openid); 
 | 
            seOpenId.setSessionKey(sessionKey); 
 | 
            seOpenId.setCreateTime(new Date()); 
 | 
            //Long SessionId = clientSv.addOpenId(seOpenId); 
 | 
            Long rec = clientSv.addOpenId(seOpenId); 
 | 
            if(rec != null) { 
 | 
                sessionId = String.valueOf(rec); 
 | 
            } 
 | 
  
 | 
            JSONObject job_result = new JSONObject(); 
 | 
            job_result.put("clientId", String.valueOf(clientId)); 
 | 
            job_result.put("sessionId", sessionId); 
 | 
            return BaseResponseUtils.buildSuccess(job_result); 
 | 
  
 | 
        } else { 
 | 
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PHONE_NUMBER_IS_ERROR.getMessage()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解绑农户与微信的绑定,根据sessionId删除绑定记录 
 | 
     * @param sessionId 
 | 
     * @return 
 | 
     */ 
 | 
    @PostMapping(path = "unbind") 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public BaseResponse<Boolean> unbindWechat(@RequestParam("sessionId")Long sessionId) { 
 | 
        if(sessionId == null || sessionId <=0) { 
 | 
            return BaseResponseUtils.buildErrorMsg("sessionId无效"); 
 | 
        } 
 | 
  
 | 
        Integer rec = clientSv.unbindWechat(sessionId); 
 | 
        if(rec == null || rec == 0) { 
 | 
            return BaseResponseUtils.buildErrorMsg("sessionId错误"); 
 | 
        } 
 | 
  
 | 
        return BaseResponseUtils.buildSuccess(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取农户基本信息,小程序首页使用 
 | 
     * @param sessionId 
 | 
     * @return 
 | 
     */ 
 | 
    @GetMapping(path = "/simple_info") 
 | 
    public BaseResponse<VoClientWechat> getSimpleClientInfo(@RequestParam Long sessionId){ 
 | 
        try { 
 | 
            VoClientWechat res = clientSv.getSimpleClientInfo(sessionId, null); 
 | 
            return BaseResponseUtils.buildSuccess(res); 
 | 
        } catch (Exception e) { 
 | 
            log.error("查询农户异常", e); 
 | 
            return BaseResponseUtils.buildException(e.getMessage()) ; 
 | 
        } 
 | 
    } 
 | 
} 
 |