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 0df3530a3..ec31c5fcb 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 f79e0859f..4e7c96c7f 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")); + } + } + }