From 28e0c16e943bcbbd6c093728ae2ca486299243ac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Dec 2025 08:25:52 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E6=A1=A3=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E9=94=99=E8=AF=AF=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= 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 | 2 +- .../result/WxPayUnifiedOrderV3ResultTest.java | 201 ++++++++++++++++++ 2 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java 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 dc929a2cd..47445ff37 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 @@ -58,7 +58,7 @@ public class WxPayUnifiedOrderV3Result implements Serializable { /** *
    * 字段名:二维码链接(NATIVE支付 会返回)
-   * 变量名:h5_url
+   * 变量名:code_url
    * 是否必填:是
    * 类型:string[1,512]
    * 描述:
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java
new file mode 100644
index 000000000..afcca2924
--- /dev/null
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java
@@ -0,0 +1,201 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.v3.util.SignUtils;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+
+/**
+ * 
+ * WxPayUnifiedOrderV3Result 测试类
+ * 主要测试prepayId字段和静态工厂方法的解耦功能
+ * 
+ * + * @author copilot + */ +public class WxPayUnifiedOrderV3ResultTest { + + /** + * 生成测试用的RSA密钥对 + */ + private KeyPair generateKeyPair() throws Exception { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); + return keyPairGenerator.generateKeyPair(); + } + + /** + * 测试JsapiResult中的prepayId字段是否正确设置 + */ + @Test + public void testJsapiResultWithPrepayId() throws Exception { + // 准备测试数据 + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + // 创建WxPayUnifiedOrderV3Result对象 + WxPayUnifiedOrderV3Result result = new WxPayUnifiedOrderV3Result(); + result.setPrepayId(testPrepayId); + + // 调用getPayInfo生成JsapiResult + WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = + result.getPayInfo(TradeTypeEnum.JSAPI, testAppId, null, privateKey); + + // 验证prepayId字段是否正确设置 + Assert.assertNotNull(jsapiResult.getPrepayId(), "prepayId不应为null"); + Assert.assertEquals(jsapiResult.getPrepayId(), testPrepayId, "prepayId应该与设置的值相同"); + + // 验证其他字段 + Assert.assertEquals(jsapiResult.getAppId(), testAppId); + Assert.assertNotNull(jsapiResult.getTimeStamp()); + Assert.assertNotNull(jsapiResult.getNonceStr()); + Assert.assertEquals(jsapiResult.getPackageValue(), "prepay_id=" + testPrepayId); + Assert.assertEquals(jsapiResult.getSignType(), "RSA"); + Assert.assertNotNull(jsapiResult.getPaySign()); + } + + /** + * 测试使用静态工厂方法生成JsapiResult(解耦场景) + */ + @Test + public void testGetJsapiPayInfoStaticMethod() throws Exception { + // 准备测试数据 + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + // 使用静态工厂方法生成JsapiResult + WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = + WxPayUnifiedOrderV3Result.getJsapiPayInfo(testPrepayId, testAppId, privateKey); + + // 验证prepayId字段 + Assert.assertNotNull(jsapiResult.getPrepayId(), "prepayId不应为null"); + Assert.assertEquals(jsapiResult.getPrepayId(), testPrepayId, "prepayId应该与输入的值相同"); + + // 验证其他字段 + Assert.assertEquals(jsapiResult.getAppId(), testAppId); + Assert.assertNotNull(jsapiResult.getTimeStamp()); + Assert.assertNotNull(jsapiResult.getNonceStr()); + Assert.assertEquals(jsapiResult.getPackageValue(), "prepay_id=" + testPrepayId); + Assert.assertEquals(jsapiResult.getSignType(), "RSA"); + Assert.assertNotNull(jsapiResult.getPaySign()); + } + + /** + * 测试使用静态工厂方法生成AppResult(解耦场景) + */ + @Test + public void testGetAppPayInfoStaticMethod() throws Exception { + // 准备测试数据 + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + String testMchId = "1900000109"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + // 使用静态工厂方法生成AppResult + WxPayUnifiedOrderV3Result.AppResult appResult = + WxPayUnifiedOrderV3Result.getAppPayInfo(testPrepayId, testAppId, testMchId, privateKey); + + // 验证prepayId字段 + Assert.assertNotNull(appResult.getPrepayId(), "prepayId不应为null"); + Assert.assertEquals(appResult.getPrepayId(), testPrepayId, "prepayId应该与输入的值相同"); + + // 验证其他字段 + Assert.assertEquals(appResult.getAppid(), testAppId); + Assert.assertEquals(appResult.getPartnerId(), testMchId); + Assert.assertNotNull(appResult.getTimestamp()); + Assert.assertNotNull(appResult.getNoncestr()); + Assert.assertEquals(appResult.getPackageValue(), "Sign=WXPay"); + Assert.assertNotNull(appResult.getSign()); + } + + /** + * 测试解耦场景:先获取prepayId,后续再生成支付信息 + */ + @Test + public void testDecoupledScenario() throws Exception { + // 模拟场景:先创建订单获取prepayId + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + // 步骤1:模拟从创建订单接口获取prepayId + WxPayUnifiedOrderV3Result orderResult = new WxPayUnifiedOrderV3Result(); + orderResult.setPrepayId(testPrepayId); + + // 获取prepayId用于存储 + String storedPrepayId = orderResult.getPrepayId(); + Assert.assertEquals(storedPrepayId, testPrepayId); + + // 步骤2:后续支付失败时,使用存储的prepayId重新生成支付信息 + WxPayUnifiedOrderV3Result.JsapiResult newPayInfo = + WxPayUnifiedOrderV3Result.getJsapiPayInfo(storedPrepayId, testAppId, privateKey); + + // 验证重新生成的支付信息 + Assert.assertEquals(newPayInfo.getPrepayId(), storedPrepayId); + Assert.assertEquals(newPayInfo.getPackageValue(), "prepay_id=" + storedPrepayId); + Assert.assertNotNull(newPayInfo.getPaySign()); + } + + /** + * 测试多次生成支付信息,签名应该不同(因为timestamp和nonceStr每次都不同) + */ + @Test + public void testMultipleGenerationsHaveDifferentSignatures() throws Exception { + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + // 生成第一次支付信息 + WxPayUnifiedOrderV3Result.JsapiResult result1 = + WxPayUnifiedOrderV3Result.getJsapiPayInfo(testPrepayId, testAppId, privateKey); + + // 等待一秒确保timestamp不同 + Thread.sleep(1000); + + // 生成第二次支付信息 + WxPayUnifiedOrderV3Result.JsapiResult result2 = + WxPayUnifiedOrderV3Result.getJsapiPayInfo(testPrepayId, testAppId, privateKey); + + // prepayId应该相同 + Assert.assertEquals(result1.getPrepayId(), result2.getPrepayId()); + + // 但是timestamp、nonceStr和签名应该不同 + Assert.assertNotEquals(result1.getTimeStamp(), result2.getTimeStamp(), "timestamp应该不同"); + Assert.assertNotEquals(result1.getNonceStr(), result2.getNonceStr(), "nonceStr应该不同"); + Assert.assertNotEquals(result1.getPaySign(), result2.getPaySign(), "签名应该不同"); + } + + /** + * 测试AppResult中的prepayId字段 + */ + @Test + public void testAppResultWithPrepayId() throws Exception { + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + String testMchId = "1900000109"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + WxPayUnifiedOrderV3Result result = new WxPayUnifiedOrderV3Result(); + result.setPrepayId(testPrepayId); + + // 调用getPayInfo生成AppResult + WxPayUnifiedOrderV3Result.AppResult appResult = + result.getPayInfo(TradeTypeEnum.APP, testAppId, testMchId, privateKey); + + // 验证prepayId字段 + Assert.assertNotNull(appResult.getPrepayId(), "prepayId不应为null"); + Assert.assertEquals(appResult.getPrepayId(), testPrepayId, "prepayId应该与设置的值相同"); + } +}