From b8c6fccf8449d8f91587aedf925f4d4b076bb42c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 22 Sep 2025 16:26:41 +0000 Subject: [PATCH 1/4] Initial plan From c8cbe46768851e1b54a58c90df66edaaa211cdfa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 22 Sep 2025 16:41:31 +0000 Subject: [PATCH 2/4] Fix payment callback parsing error with format detection Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../service/impl/BaseWxPayServiceImpl.java | 7 +++++ .../notify/WxPayOrderNotifyResultTest.java | 31 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 0df3530a31..ec31c5fcbd 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -319,6 +319,13 @@ public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPa public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData, String signType) throws WxPayException { try { log.debug("微信支付异步通知请求参数:{}", xmlData); + + // 检测数据格式并给出适当的处理建议 + if (xmlData != null && xmlData.trim().startsWith("{")) { + throw new WxPayException("检测到V3版本的JSON格式通知数据,请使用parseOrderNotifyV3Result方法解析。" + + "V3 API需要传入SignatureHeader参数进行签名验证。"); + } + WxPayOrderNotifyResult result = WxPayOrderNotifyResult.fromXML(xmlData); if (signType == null) { this.switchover(result.getMchId(), result.getAppid()); diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java index f79e0859f0..4e7c96c7f3 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java @@ -82,4 +82,35 @@ public void testFromXML() { } } + /** + * Test that JSON format input throws a helpful error message. + */ + @Test + public void testFromXMLWithJsonShouldGiveHelpfulError() { + String jsonString = "{\n" + + " \"id\": \"EV-2018022511223320873\",\n" + + " \"create_time\": \"2015-05-20T13:29:35+08:00\",\n" + + " \"resource_type\": \"encrypt-resource\",\n" + + " \"event_type\": \"TRANSACTION.SUCCESS\",\n" + + " \"summary\": \"支付成功\",\n" + + " \"resource\": {\n" + + " \"algorithm\": \"AEAD_AES_256_GCM\",\n" + + " \"ciphertext\": \"test\",\n" + + " \"associated_data\": \"transaction\",\n" + + " \"nonce\": \"test\"\n" + + " }\n" + + "}"; + + try { + WxPayOrderNotifyResult.fromXML(jsonString); + Assert.fail("Expected exception for JSON input"); + } catch (Exception e) { + // Verify that the error message mentions whitespace/XML parsing issues + // This is the original XStream error that would occur + Assert.assertTrue(e.getMessage().contains("whitespace") || + e.getMessage().contains("XmlPull") || + e.getMessage().contains("START_DOCUMENT")); + } + } + } From c9dcca9ba3e97446df2b1d3ee89904fd4b8ce03d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 21 Dec 2025 21:41:59 +0800 Subject: [PATCH 3/4] Update weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index ec31c5fcbd..aea9dd381b 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -323,7 +323,7 @@ public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData, String sign // 检测数据格式并给出适当的处理建议 if (xmlData != null && xmlData.trim().startsWith("{")) { throw new WxPayException("检测到V3版本的JSON格式通知数据,请使用parseOrderNotifyV3Result方法解析。" + - "V3 API需要传入SignatureHeader参数进行签名验证。"); + " V3 API需要传入SignatureHeader参数进行签名验证。"); } WxPayOrderNotifyResult result = WxPayOrderNotifyResult.fromXML(xmlData); From ec53b97cafc121e868ba491838c1feca3afb790e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 21 Dec 2025 13:47:09 +0000 Subject: [PATCH 4/4] Fix test to properly test service method for JSON format detection - Remove incorrect test from WxPayOrderNotifyResultTest that tested fromXML() directly - Add proper test in BaseWxPayServiceImplTest that tests parseOrderNotifyResult() service method - New test verifies that JSON format triggers helpful error message with V3 API guidance Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../notify/WxPayOrderNotifyResultTest.java | 31 ---------------- .../impl/BaseWxPayServiceImplTest.java | 36 +++++++++++++++++++ 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java index 4e7c96c7f3..f79e0859f0 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResultTest.java @@ -82,35 +82,4 @@ public void testFromXML() { } } - /** - * Test that JSON format input throws a helpful error message. - */ - @Test - public void testFromXMLWithJsonShouldGiveHelpfulError() { - String jsonString = "{\n" + - " \"id\": \"EV-2018022511223320873\",\n" + - " \"create_time\": \"2015-05-20T13:29:35+08:00\",\n" + - " \"resource_type\": \"encrypt-resource\",\n" + - " \"event_type\": \"TRANSACTION.SUCCESS\",\n" + - " \"summary\": \"支付成功\",\n" + - " \"resource\": {\n" + - " \"algorithm\": \"AEAD_AES_256_GCM\",\n" + - " \"ciphertext\": \"test\",\n" + - " \"associated_data\": \"transaction\",\n" + - " \"nonce\": \"test\"\n" + - " }\n" + - "}"; - - try { - WxPayOrderNotifyResult.fromXML(jsonString); - Assert.fail("Expected exception for JSON input"); - } catch (Exception e) { - // Verify that the error message mentions whitespace/XML parsing issues - // This is the original XStream error that would occur - Assert.assertTrue(e.getMessage().contains("whitespace") || - e.getMessage().contains("XmlPull") || - e.getMessage().contains("START_DOCUMENT")); - } - } - } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java index 955071e10f..463dfbf256 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java @@ -626,6 +626,42 @@ public void testParseOrderNotifyResult() throws Exception { } + /** + * Test parse order notify result with JSON format should give helpful error. + * 测试当传入V3版本的JSON格式通知数据时,应该抛出清晰的错误提示 + * + * @throws Exception the exception + */ + @Test + public void testParseOrderNotifyResultWithJsonShouldGiveHelpfulError() throws Exception { + String jsonString = "{\n" + + " \"id\": \"EV-2018022511223320873\",\n" + + " \"create_time\": \"2015-05-20T13:29:35+08:00\",\n" + + " \"resource_type\": \"encrypt-resource\",\n" + + " \"event_type\": \"TRANSACTION.SUCCESS\",\n" + + " \"summary\": \"支付成功\",\n" + + " \"resource\": {\n" + + " \"algorithm\": \"AEAD_AES_256_GCM\",\n" + + " \"ciphertext\": \"test\",\n" + + " \"associated_data\": \"transaction\",\n" + + " \"nonce\": \"test\"\n" + + " }\n" + + "}"; + + try { + this.payService.parseOrderNotifyResult(jsonString); + fail("Expected WxPayException for JSON input"); + } catch (WxPayException e) { + // 验证错误消息包含V3版本和parseOrderNotifyV3Result方法的指导信息 + String message = e.getMessage(); + assertTrue(message.contains("V3版本"), "错误消息应包含'V3版本'"); + assertTrue(message.contains("JSON格式"), "错误消息应包含'JSON格式'"); + assertTrue(message.contains("parseOrderNotifyV3Result"), "错误消息应包含'parseOrderNotifyV3Result'方法名"); + assertTrue(message.contains("SignatureHeader"), "错误消息应包含'SignatureHeader'"); + log.info("JSON格式检测正常,错误提示: {}", message); + } + } + /** * Test get wx api data. *