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