From b65cbfb8452a95575f0dc637b55ed49f058597fe Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期二, 20 八月 2024 21:02:21 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java |   87 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
index 2d237fa..ce1fb29 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
@@ -6,6 +6,7 @@
 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;
@@ -18,6 +19,7 @@
 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;
@@ -32,6 +34,7 @@
 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;
@@ -65,14 +68,17 @@
 @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;
@@ -83,6 +89,68 @@
 
     // 骞冲彴璇佷功鍏挜
     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 = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝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());
+        }
+    }
 
     /**
      * 涓嬭浇寰俊鏀粯骞冲彴璇佷功 娴嬭瘯瀹屽簾闄�
@@ -107,7 +175,8 @@
         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);
@@ -125,7 +194,7 @@
         // 鏋勯�犻獙绛惧悕涓�
         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();
     }
@@ -148,7 +217,7 @@
     @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());
         }
@@ -209,7 +278,7 @@
         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);
@@ -221,6 +290,7 @@
         if(job_result == null) {
             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage());
         }
+
         return BaseResponseUtils.buildSuccess(job_result) ;
     }
 
@@ -250,7 +320,7 @@
         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);
@@ -283,7 +353,7 @@
     @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();
 
         /**
@@ -321,8 +391,9 @@
 
         // 鏋勯�犻獙绛惧悕涓�
         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");

--
Gitblit v1.8.0