From e6a7ffa64a71b9419b7178b0c8bed43097e5d352 Mon Sep 17 00:00:00 2001
From: zhubaomin <zhubaomin>
Date: 星期四, 24 十月 2024 16:28:57 +0800
Subject: [PATCH] 2024-10-24 朱宝民 微信小程序中使用的物理卡开关阀记录、虚拟卡开关阀记录

---
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java |   92 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 73 insertions(+), 19 deletions(-)

diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
index 0e8d641..a0132be 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
@@ -2,9 +2,12 @@
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.multiDataSource.DataSourceContext;
+import com.dy.common.util.AES;
 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.pipIrrWechat.result.WechatResultCode;
@@ -15,10 +18,7 @@
 import com.dy.pipIrrWechat.virtualCard.dto.DtoVirtualCard;
 import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM;
 import com.dy.pipIrrWechat.virtualCard.enums.RefundItemStateENUM;
-import com.dy.pipIrrWechat.wechatpay.dto.Code2Session;
-import com.dy.pipIrrWechat.wechatpay.dto.DtoOrder;
-import com.dy.pipIrrWechat.wechatpay.dto.NotifyResource;
-import com.dy.pipIrrWechat.wechatpay.dto.OrderNotify;
+import com.dy.pipIrrWechat.wechatpay.dto.*;
 import com.dy.pipIrrWechat.wechatpay.enums.RefundStatusENUM;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -31,13 +31,13 @@
 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;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
-import javax.crypto.NoSuchPaddingException;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.security.GeneralSecurityException;
@@ -46,10 +46,7 @@
 import java.security.SignatureException;
 import java.security.spec.InvalidKeySpecException;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @author ZhuBaoMin
@@ -64,11 +61,11 @@
 @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 String privateCertFileName = com.dy.pipIrrWechat.wechatpay.PayInfo.privateCertFileName;
     private final String appid = com.dy.pipIrrWechat.wechatpay.PayInfo.appid;
     private final String secret = com.dy.pipIrrWechat.wechatpay.PayInfo.secret;
     private final String mchid = com.dy.pipIrrWechat.wechatpay.PayInfo.mchid;
@@ -165,7 +162,8 @@
         String nonceStr = payHelper.generateRandomString();
         Long timestamp = System.currentTimeMillis() / 1000;
 
-        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -183,7 +181,7 @@
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString());
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs);
 
         return BaseResponseUtils.buildSuccess();
     }
@@ -196,7 +194,7 @@
      */
     @PostMapping(path = "placeOrder")
     @Transactional(rollbackFor = Exception.class)
-    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 NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
         if(bindingResult != null && bindingResult.hasErrors()){
             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
@@ -236,8 +234,26 @@
         virtualCard.setClientId(clientId);
         virtualCard.setOrderNumber(orderNumber);
         virtualCard.setRechargeAmount(rechargeAmount);
-        BaseResponse result = virtualCardSv.insertVCRecharge(virtualCard);
-        if(!result.getCode().equals("0001")) {
+
+        // -1锛氳櫄鎷熷崱涓嶅瓨鍦紝0锛氭坊鍔犲厖鍊艰褰曞け璐�
+        Long rechargeId = virtualCardSv.insertVCRecharge(virtualCard);
+        if(rechargeId.equals(-1)) {
+            return BaseResponseUtils.buildFail(WechatResultCode.NO_ACCOUNT.getMessage());
+        }
+        if(rechargeId.equals(0)) {
+            return BaseResponseUtils.buildFail(WechatResultCode.RECHARGE_FAIL.getMessage());
+        }
+
+        // 鐢熸垚鍏呭�兼搷浣滆褰曪紝鍏呭�兼搷浣滀汉涓哄啘鎴�
+        SeVcOperate seVcOperate = new SeVcOperate();
+        seVcOperate.setVcId(virtualId);
+        seVcOperate.setClientId(clientId);
+        seVcOperate.setOperateType(LastOperateENUM.RECHARGE.getCode());
+        seVcOperate.setRechargeId(rechargeId);
+        seVcOperate.setOperator(clientId);
+        seVcOperate.setOperateTime(new Date());
+        Long vcOperateId = virtualCardSv.insertVcOperate(seVcOperate);
+        if(vcOperateId == null) {
             return BaseResponseUtils.buildErrorMsg(WechatResultCode.RECHARGE_ADD_FAIL.getMessage());
         }
 
@@ -246,6 +262,7 @@
         job_body.put("mchid", mchid);
         job_body.put("description", description);
         job_body.put("out_trade_no", orderNumber);
+        job_body.put("attach", DataSourceContext.get());
         job_body.put("notify_url", notifyUrl);
 
         //璁㈠崟閲戦
@@ -267,7 +284,8 @@
         String httpUrl = "/v3/pay/transactions/jsapi";
 
         String body = job_body.toJSONString();
-        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -308,7 +326,8 @@
         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);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String paySign = payHelper.sign(message.getBytes("utf-8"), certFileBs);
 
         JSONObject job_result = new JSONObject();
         job_result.put("timeStamp", timeStamp);
@@ -340,7 +359,7 @@
     })
     @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
-    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();
 
         /**
@@ -378,8 +397,9 @@
 
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs);
         if(!valid) {
             response.setStatus(500);
             result.put("code", "FAIL");
@@ -420,6 +440,8 @@
             JSONObject job_resource = JSONObject.parseObject(resource);
 
             // 瑙e瘑鍚庡彇鍑猴細鍟嗘埛璁㈠崟鍙枫�佸井淇℃敮浠樿鍗曞彿銆佷氦鏄撶姸鎬併�佹敮浠樺畬鎴愭椂闂�
+            String attach = job_resource.getString("attach");
+            DataSourceContext.set(attach);
             String out_trade_no = job_resource.getString("out_trade_no");
             String transaction_id = job_resource.getString("transaction_id");
             String trade_state = job_resource.getString("trade_state");
@@ -508,4 +530,36 @@
         result.put("message", "鎴愬姛");
         return  result;
     }
+
+    /**
+     * 娣诲姞寰俊鏀粯淇℃伅
+     * @param po
+     * @param bindingResult
+     * @return
+     */
+    @PostMapping(path = "add_wechatpay", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public BaseResponse<Boolean> addWechatpay(@RequestBody @Valid Wechatpay po, BindingResult bindingResult) throws Exception {
+        if(bindingResult != null && bindingResult.hasErrors()){
+            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+
+        if(paymentSv.getWechatpayByAppId(po.getAppId()) != null) {
+            return BaseResponseUtils.buildErrorMsg("璇ュ井淇℃敮浠樹俊鎭凡缁忓瓨鍦�");
+        }
+
+        SeWechatpay seWechatpay = new SeWechatpay();
+        seWechatpay.setAppId(AES.encrypt(po.getAppId()));
+        seWechatpay.setAppSecret(AES.encrypt(po.getAppSecret()));
+        seWechatpay.setMchId(AES.encrypt(po.getMchId()));
+        seWechatpay.setMchKey(AES.encrypt(po.getMchKey()));
+        seWechatpay.setSerialNo((AES.encrypt(po.getSerialNo())));
+        seWechatpay.setNotifyUrl(AES.encrypt(po.getNotifyUrl()));
+        seWechatpay.setRemarks(po.getRemarks());
+
+        Long rec = Optional.ofNullable(paymentSv.addWechatpay(seWechatpay)).orElse(0L);
+        if(rec == 0) {
+            return BaseResponseUtils.buildFail("娣诲姞寰俊鏀粯淇℃伅澶辫触");
+        }
+        return BaseResponseUtils.buildSuccess(true) ;
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0