From d1c4d003f62a7bd4bc762f2fc62b97726e247e0c Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期五, 19 九月 2025 18:20:54 +0800
Subject: [PATCH] AI对接,微信小程序支付

---
 ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java |  108 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 66 insertions(+), 42 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
index ff256ae..2ba770d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
@@ -1,29 +1,21 @@
 package com.ruoyi.system.wxPay.utils;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.system.utils.wx.tools.WxUtils;
 import com.ruoyi.system.wxPay.model.WeixinPayProperties;
 import com.ruoyi.system.wxPay.model.WxCloseOrderModel;
-import com.ruoyi.system.wxPay.model.WxPaymentInfoModel;
 import com.ruoyi.system.wxPay.model.WxPaymentRefundModel;
 import com.ruoyi.system.wxPay.resp.NotifyV3PayDecodeRespBody;
 import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
 import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
 import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
-import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
 import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
-import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
 import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.impl.client.CloseableHttpClient;
 
 import javax.servlet.http.HttpServletRequest;
-import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 import java.util.Map;
 
@@ -62,13 +54,6 @@
             checkWxConfig();
             this.privateKey = PemUtil.loadPrivateKey(config.getV3().getPrivateKeyStream());
             this.privateKeySigner = new PrivateKeySigner(config.getV3().getMchSerialNo(), privateKey);
-            // 获取证书管理器实例
-            CertificatesManager certificatesManager = CertificatesManager.getInstance();
-            // 向证书管理器增加需要自动更新平台证书的商户信息
-            certificatesManager.putMerchant(config.getMchId(), new WechatPay2Credentials(config.getMchId(),
-                    this.privateKeySigner), config.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
-            // 从证书管理器中获取verifier
-            this.verifier = certificatesManager.getVerifier(config.getMchId());
             this.validator = new WechatPay2Validator(verifier);
             this.builder = WechatPayHttpClientBuilder.create()
                     .withMerchant(config.getMchId(), config.getV3().getMchSerialNo(), this.privateKey)
@@ -122,37 +107,76 @@
      * @author xiaochen
      * @date 2022-03-22 12:47
      */
-    public Map<String, Object> jsApi(String tradeNo, Integer amount, String openid, String description) {
-        WxPaymentInfoModel requestBody = WxPaymentInfoModel.builder()
-                .mchid(this.config.getMchId())
-                .appid(this.config.getAppId())
-                .description(description)
-                .out_trade_no(tradeNo)
-//                .attach("")
-                .amount(WxPaymentInfoModel.Amount.builder().total(amount).build())
-                .payer(WxPaymentInfoModel.Payer.builder().openid(openid).build())
-                // 分不分账
-//                .settle_info(WxPaymentInfoModel.SettleInfo.builder().profit_sharing(true).build())
-                .build();
-        // 封装基础数据
-        String reqBody = buildBaseParam(requestBody
-                , this.config.getV3().getNotifyPayUrl());
-        //请求URL
-        HttpEntityEnclosingRequestBase httpPost = requestPost(
-                "/v3/pay/transactions/jsapi"
-                , this.config.getHttpReadTimeoutMs()
-                , this.config.getHttpConnectTimeoutMs()
-                , reqBody);
-        String repBody = result(httpClient, httpPost);
-        ObjectMapper om = new ObjectMapper();
+    public Map<String, Object> jsApi(String tradeNo, Long amount, String openid, String description,String attach) {
+        JsapiPrepay client = new JsapiPrepay(
+                this.config.getMchId(),                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
+                this.config.getV3().getMchSerialNo(),         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
+                this.config.getV3().getPrivateKeyPath(),     // 商户API证书私钥文件路径,本地文件路径
+                this.config.getV3().getPublicKeyId(),      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
+                this.config.getV3().getPublicKeyPath()           // 微信支付公钥文件路径,本地文件路径
+        );
+        JsapiPrepay.DirectAPIv3JsapiPrepayRequest request = new JsapiPrepay.DirectAPIv3JsapiPrepayRequest();
+        request.appid = this.config.getAppId();
+        request.mchid = this.config.getMchId();
+        request.description = description;
+        request.outTradeNo = tradeNo;
+//        request.timeExpire = "2018-06-08T10:34:56+08:00";
+        request.attach = attach;
+        request.notifyUrl = this.config.getCallBackUrl();
+        request.goodsTag = "WXG";
+        request.supportFapiao = false;
+        request.amount = new JsapiPrepay.CommonAmountInfo();
+        request.amount.total = amount;
+        request.amount.currency = "CNY";
+        request.payer = new JsapiPrepay.JsapiReqPayerInfo();
+        request.payer.openid = openid;
         try {
-            JsonNode rootNode = om.readTree(repBody);
-            String prepayId = rootNode.path("prepay_id").asText();
-            return wxTuneUp(this.privateKeySigner, requestBody.getAppid(), prepayId);
-        } catch (JsonProcessingException e) {
+            JsapiPrepay.DirectAPIv3JsapiPrepayResponse response = client.run(request);
+            return wxTuneUp(this.privateKeySigner, this.config.getAppId(), response.prepayId);
+        } catch (WXPayUtility.ApiException e) {
             throw new RuntimeException("获取支付数据错误!");
         }
     }
+//    /**
+//     * jsApi下单
+//     *
+//     * @param tradeNo     订单号
+//     * @param amount      金额 分
+//     * @param openid      openid
+//     * @param description 订单描述
+//     * @return java.util.Map<java.lang.String, java.lang.Object>
+//     * @author xiaochen
+//     * @date 2022-03-22 12:47
+//     */
+//    public Map<String, Object> jsApi(String tradeNo, Integer amount, String openid, String description) {
+//        WxPaymentInfoModel requestBody = WxPaymentInfoModel.builder()
+//                .mchid(this.config.getMchId())
+//                .appid(this.config.getAppId())
+//                .description(description)
+//                .out_trade_no(tradeNo)
+////                .attach("")
+//                .amount(WxPaymentInfoModel.Amount.builder().total(amount).build())
+//                .payer(WxPaymentInfoModel.Payer.builder().openid(openid).build())
+//                .build();
+//        // 封装基础数据
+//        String reqBody = buildBaseParam(requestBody
+//                , this.config.getV3().getNotifyPayUrl());
+//        //请求URL
+//        HttpEntityEnclosingRequestBase httpPost = requestPost(
+//                "/v3/pay/transactions/jsapi"
+//                , this.config.getHttpReadTimeoutMs()
+//                , this.config.getHttpConnectTimeoutMs()
+//                , reqBody);
+//        String repBody = result(httpClient, httpPost);
+//        ObjectMapper om = new ObjectMapper();
+//        try {
+//            JsonNode rootNode = om.readTree(repBody);
+//            String prepayId = rootNode.path("prepay_id").asText();
+//            return wxTuneUp(this.privateKeySigner, requestBody.getAppid(), prepayId);
+//        } catch (JsonProcessingException e) {
+//            throw new RuntimeException("获取支付数据错误!");
+//        }
+//    }
 
 
     /**

--
Gitblit v1.7.1