|  |  | 
 |  |  | import com.dy.common.webUtil.BaseResponse; | 
 |  |  | import com.dy.common.webUtil.BaseResponseUtils; | 
 |  |  | import com.dy.common.webUtil.ResultCodeMsg; | 
 |  |  | import com.dy.pipIrrGlobal.cert.WxCertUtil; | 
 |  |  | import com.dy.pipIrrGlobal.pojoSe.*; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.VoClient; | 
 |  |  | import com.dy.pipIrrSell.client.ClientSv; | 
 |  |  | 
 |  |  | import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM; | 
 |  |  | import com.dy.pipIrrSell.virtualCard.enums.RefundItemStateENUM; | 
 |  |  | import com.dy.pipIrrSell.wallet.enums.RefundStatusENUM; | 
 |  |  | import com.dy.pipIrrSell.wechatpay.dto.Code2Session; | 
 |  |  | import com.dy.pipIrrSell.wechatpay.dto.DtoOrder; | 
 |  |  | import com.dy.pipIrrSell.wechatpay.dto.NotifyResource; | 
 |  |  | import com.dy.pipIrrSell.wechatpay.dto.OrderNotify; | 
 |  |  | 
 |  |  | import jakarta.validation.Valid; | 
 |  |  | import lombok.RequiredArgsConstructor; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.core.io.ResourceLoader; | 
 |  |  | import org.springframework.http.HttpHeaders; | 
 |  |  | import org.springframework.http.MediaType; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | 
 |  |  | @RequestMapping(path="payment") | 
 |  |  | @RequiredArgsConstructor | 
 |  |  | public class PaymentCtrl { | 
 |  |  |     private final ResourceLoader resourceLoader; | 
 |  |  |  | 
 |  |  |     private final PaymentSv paymentSv; | 
 |  |  |     private final RestTemplateUtil restTemplateUtil; | 
 |  |  |     private final PayHelper payHelper; | 
 |  |  |     private final VirtualCardSv virtualCardSv; | 
 |  |  |     private final ClientSv clientSv; | 
 |  |  |  | 
 |  |  |     private final String privateCertFileName = PayInfo.privateCertFileName; | 
 |  |  |     //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 Map CERTIFICATE_MAP = new HashMap(); | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 登录凭证校验,农户绑定账号逻辑包含登录凭证校验,此接口作废 | 
 |  |  |      * @param code2Session 登录凭证校验传入对象 | 
 |  |  |      * @param bindingResult | 
 |  |  |      * @return | 
 |  |  |      * @throws Exception | 
 |  |  |      */ | 
 |  |  |     @Operation(summary = "登录凭证校验", description = "登录凭证校验") | 
 |  |  |     @ApiResponses(value = { | 
 |  |  |             @ApiResponse( | 
 |  |  |                     responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, | 
 |  |  |                     description = "操作结果:true:成功,false:失败(BaseResponse.content)", | 
 |  |  |                     content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, | 
 |  |  |                             schema = @Schema(implementation = Boolean.class))} | 
 |  |  |             ) | 
 |  |  |     }) | 
 |  |  |     @PostMapping(path = "getSessionId") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     @SsoAop() | 
 |  |  |     public BaseResponse<Boolean> getSessionId(@RequestBody @Valid Code2Session code2Session, BindingResult bindingResult) throws Exception { | 
 |  |  |         if(bindingResult != null && bindingResult.hasErrors()){ | 
 |  |  |             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String phoneNumber = code2Session.getPhoneNumber(); | 
 |  |  |         String jsCode = code2Session.getJs_code(); | 
 |  |  |  | 
 |  |  |         Map<String, Object> queryParams = new HashMap<>(); | 
 |  |  |         queryParams.put("appid", appid); | 
 |  |  |         queryParams.put("secret", secret); | 
 |  |  |         queryParams.put("js_code", jsCode); | 
 |  |  |         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.buildFail("登录凭证校验失败"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         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 rec = clientSv.addOpenId(seOpenId); | 
 |  |  |             if(rec != null) { | 
 |  |  |                 SessionId = String.valueOf(rec); | 
 |  |  |             } | 
 |  |  |             return BaseResponseUtils.buildSuccess(SessionId); | 
 |  |  |  | 
 |  |  |         } else { | 
 |  |  |             return BaseResponseUtils.buildError(SellResultCode.PHONE_NUMBER_IS_ERROR.getMessage()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 下载微信支付平台证书 测试完废除 | 
 |  |  | 
 |  |  |         String nonceStr = payHelper.generateRandomString(); | 
 |  |  |         Long timestamp = System.currentTimeMillis() / 1000; | 
 |  |  |  | 
 |  |  |         String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName); | 
 |  |  |         byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; | 
 |  |  |         String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, keyPemBs); | 
 |  |  |  | 
 |  |  |         Map<String, String> headers = new HashMap<>(); | 
 |  |  |         headers.put("Authorization", header); | 
 |  |  | 
 |  |  |         // 构造验签名串 | 
 |  |  |         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString()); | 
 |  |  |         // 验证签名 | 
 |  |  |         Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature); | 
 |  |  |         Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs); | 
 |  |  |  | 
 |  |  |         return BaseResponseUtils.buildSuccess(); | 
 |  |  |     } | 
 |  |  | 
 |  |  |     @PostMapping(path = "placeOrder") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     @SsoAop() | 
 |  |  |     public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException { | 
 |  |  |     public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception { | 
 |  |  |         if(bindingResult != null && bindingResult.hasErrors()){ | 
 |  |  |             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); | 
 |  |  |         } | 
 |  |  | 
 |  |  |         String httpUrl = "/v3/pay/transactions/jsapi"; | 
 |  |  |  | 
 |  |  |         String body = job_body.toJSONString(); | 
 |  |  |         String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName); | 
 |  |  |         String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, WxCertUtil.getKey_pemBytes(resourceLoader)); | 
 |  |  |  | 
 |  |  |         Map<String, String> headers = new HashMap<>(); | 
 |  |  |         headers.put("Authorization", header); | 
 |  |  | 
 |  |  |         if(job_result == null) { | 
 |  |  |             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return BaseResponseUtils.buildSuccess(job_result) ; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         String nonceStr = payHelper.generateRandomString(); | 
 |  |  |         String pkg = "prepay_id=" + prepayId; | 
 |  |  |         String message = payHelper.buildMessage_signAgain(appid, timeStamp, nonceStr, pkg); | 
 |  |  |         String paySign = payHelper.sign(message.getBytes("utf-8"), privateCertFileName); | 
 |  |  |         String paySign = payHelper.sign(message.getBytes("utf-8"), WxCertUtil.getKey_pemBytes(resourceLoader)); | 
 |  |  |  | 
 |  |  |         JSONObject job_result = new JSONObject(); | 
 |  |  |         job_result.put("timeStamp", timeStamp); | 
 |  |  | 
 |  |  |     @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE) | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     @SsoAop() | 
 |  |  |     public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException { | 
 |  |  |     public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException, Exception { | 
 |  |  |         JSONObject result = new JSONObject(); | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  | 
 |  |  |  | 
 |  |  |         // 构造验签名串 | 
 |  |  |         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr); | 
 |  |  |         byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; | 
 |  |  |         // 验证签名 | 
 |  |  |         Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature); | 
 |  |  |         Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs); | 
 |  |  |         if(!valid) { | 
 |  |  |             response.setStatus(500); | 
 |  |  |             result.put("code", "FAIL"); |