在JsapiResult中添加prepayId字段并提供静态工厂方法实现解耦
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
This commit is contained in:
@@ -81,6 +81,19 @@ public class WxPayUnifiedOrderV3Result implements Serializable {
|
||||
private String packageValue;
|
||||
private String signType;
|
||||
private String paySign;
|
||||
/**
|
||||
* <pre>
|
||||
* 字段名:预支付交易会话标识
|
||||
* 变量名:prepay_id
|
||||
* 是否必填:否(用户可选存储)
|
||||
* 类型:string[1,64]
|
||||
* 描述:
|
||||
* 预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时
|
||||
* 此字段用于支持用户存储prepay_id,以便复用和重新生成支付签名
|
||||
* 示例值:wx201410272009395522657a690389285100
|
||||
* </pre>
|
||||
*/
|
||||
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("不支持的支付类型");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 根据已有的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()
|
||||
* );
|
||||
* </pre>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 根据已有的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()
|
||||
* );
|
||||
* </pre>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user