From 2ab4caf5e162820b00f71074be0c13a056be5145 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Dec 2025 08:20:07 +0000 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8JsapiResult=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?prepayId=E5=AD=97=E6=AE=B5=E5=B9=B6=E6=8F=90=E4=BE=9B=E9=9D=99?= =?UTF-8?q?=E6=80=81=E5=B7=A5=E5=8E=82=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../result/WxPayUnifiedOrderV3Result.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java index 309fb8e75..dc929a2cd 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java @@ -81,6 +81,19 @@ public class WxPayUnifiedOrderV3Result implements Serializable { private String packageValue; private String signType; private String paySign; + /** + *
+ * 字段名:预支付交易会话标识 + * 变量名:prepay_id + * 是否必填:否(用户可选存储) + * 类型:string[1,64] + * 描述: + * 预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时 + * 此字段用于支持用户存储prepay_id,以便复用和重新生成支付签名 + * 示例值:wx201410272009395522657a690389285100 + *+ */ + private String prepayId; private String getSignStr() { return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue); @@ -113,6 +126,7 @@ public class WxPayUnifiedOrderV3Result implements Serializable { JsapiResult jsapiResult = new JsapiResult(); jsapiResult.setAppId(appId).setTimeStamp(timestamp) .setPackageValue("prepay_id=" + this.prepayId).setNonceStr(nonceStr) + .setPrepayId(this.prepayId) //签名类型,默认为RSA,仅支持RSA。 .setSignType("RSA").setPaySign(SignUtils.sign(jsapiResult.getSignStr(), privateKey)); return (T) jsapiResult; @@ -132,4 +146,79 @@ public class WxPayUnifiedOrderV3Result implements Serializable { throw new WxRuntimeException("不支持的支付类型"); } } + + /** + *
+ * 根据已有的prepay_id生成JSAPI支付所需的参数对象(解耦版本) + * 应用场景: + * 1. 用户已经通过createPartnerOrderV3或unifiedPartnerOrderV3获取了prepay_id + * 2. 用户希望存储prepay_id用于后续复用 + * 3. 支付失败后,使用存储的prepay_id重新生成支付签名信息 + * + * 使用示例: + * // 步骤1:创建订单并获取prepay_id + * WxPayUnifiedOrderV3Result result = wxPayService.unifiedPartnerOrderV3(TradeTypeEnum.JSAPI, request); + * String prepayId = result.getPrepayId(); + * // 存储prepayId到数据库... + * + * // 步骤2:需要支付时,使用存储的prepay_id生成支付信息 + * WxPayUnifiedOrderV3Result.JsapiResult payInfo = WxPayUnifiedOrderV3Result.getJsapiPayInfo( + * prepayId, appId, wxPayService.getConfig().getPrivateKey() + * ); + *+ * + * @param prepayId 预支付交易会话标识 + * @param appId 应用ID + * @param privateKey 商户私钥,用于签名 + * @return JSAPI支付所需的参数对象 + */ + public static JsapiResult getJsapiPayInfo(String prepayId, String appId, PrivateKey privateKey) { + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = SignUtils.genRandomStr(); + JsapiResult jsapiResult = new JsapiResult(); + jsapiResult.setAppId(appId).setTimeStamp(timestamp) + .setPackageValue("prepay_id=" + prepayId).setNonceStr(nonceStr) + .setPrepayId(prepayId) + //签名类型,默认为RSA,仅支持RSA。 + .setSignType("RSA").setPaySign(SignUtils.sign(jsapiResult.getSignStr(), privateKey)); + return jsapiResult; + } + + /** + *
+ * 根据已有的prepay_id生成APP支付所需的参数对象(解耦版本) + * 应用场景: + * 1. 用户已经通过createPartnerOrderV3或unifiedPartnerOrderV3获取了prepay_id + * 2. 用户希望存储prepay_id用于后续复用 + * 3. 支付失败后,使用存储的prepay_id重新生成支付签名信息 + * + * 使用示例: + * // 步骤1:创建订单并获取prepay_id + * WxPayUnifiedOrderV3Result result = wxPayService.unifiedPartnerOrderV3(TradeTypeEnum.APP, request); + * String prepayId = result.getPrepayId(); + * // 存储prepayId到数据库... + * + * // 步骤2:需要支付时,使用存储的prepay_id生成支付信息 + * WxPayUnifiedOrderV3Result.AppResult payInfo = WxPayUnifiedOrderV3Result.getAppPayInfo( + * prepayId, appId, mchId, wxPayService.getConfig().getPrivateKey() + * ); + *+ * + * @param prepayId 预支付交易会话标识 + * @param appId 应用ID + * @param mchId 商户号 + * @param privateKey 商户私钥,用于签名 + * @return APP支付所需的参数对象 + */ + public static AppResult getAppPayInfo(String prepayId, String appId, String mchId, PrivateKey privateKey) { + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = SignUtils.genRandomStr(); + AppResult appResult = new AppResult(); + appResult.setAppid(appId).setPrepayId(prepayId).setPartnerId(mchId) + .setNoncestr(nonceStr).setTimestamp(timestamp) + //暂填写固定值Sign=WXPay + .setPackageValue("Sign=WXPay") + .setSign(SignUtils.sign(appResult.getSignStr(), privateKey)); + return appResult; + } }