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.pipIrrSell.wechatpay.PayInfo; 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 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 privateCertFileName = PayInfo.privateCertFileName; 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 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 queryParams = new HashMap<>(); queryParams.put("appid", appid); queryParams.put("secret", secret); queryParams.put("js_code", code); queryParams.put("grant_type", grantType); Map 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 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()); } // 生成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 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 queryParams = new HashMap<>(); queryParams.put("appid", appid); queryParams.put("secret", secret); queryParams.put("js_code", code); queryParams.put("grant_type", grantType); Map 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); } return BaseResponseUtils.buildSuccess(SessionId); } else { return BaseResponseUtils.buildErrorMsg(WechatResultCode.PHONE_NUMBER_IS_ERROR.getMessage()); } } /** * 获取农户基本信息,小程序首页使用 * @param sessionId * @return */ @GetMapping(path = "/simple_info") public BaseResponse 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()) ; } } }