From 4784f7aec63a5d305a2259baa1099935597dc588 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 03:50:54 +0000 Subject: [PATCH 1/2] Initial plan From 67e52cc2765120c5b236bf6d462b2632dd30ea74 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 03:54:15 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E8=99=9A=E6=8B=9F=E6=94=AF=E4=BB=98=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=80=81=E7=AD=BE=E5=90=8D=E6=9C=AA=E8=BD=AC=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E5=AF=BC=E8=87=B4=E7=AD=BE=E5=90=8D=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 WxMaXPaySigParams.calcSig() 方法返回值添加 .toLowerCase(), 与 calcPaySig() 保持一致,修复签名大小写问题导致的 SIGNATURE_INVALID -15005 错误。 同时新增 WxMaXPaySigParamsTest 单元测试验证签名均为小写。 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../miniapp/bean/xpay/WxMaXPaySigParams.java | 2 +- .../bean/xpay/WxMaXPaySigParamsTest.java | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParamsTest.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParams.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParams.java index abe6b2b982..6234a8d3ff 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParams.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParams.java @@ -55,7 +55,7 @@ public String calcPaySig(String url, String postBody) { public String calcSig(String postBody) { String sk = StringUtils.trimToEmpty(this.sessionKey); - return calcSignature(postBody, sk); + return calcSignature(postBody, sk).toLowerCase(); } /** diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParamsTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParamsTest.java new file mode 100644 index 0000000000..7c32b42d01 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/xpay/WxMaXPaySigParamsTest.java @@ -0,0 +1,75 @@ +package cn.binarywang.wx.miniapp.bean.xpay; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +/** + * 验证 {@link WxMaXPaySigParams} 签名方法的单元测试。 + * + *
修复说明:{@link WxMaXPaySigParams#calcSig(String)} 方法计算用户态签名(HMAC-SHA256)后 + * 未转小写,导致微信小程序端返回 {@code SIGNATURE_INVALID -15005} 错误。 + * 修复方案与 {@link WxMaXPaySigParams#calcPaySig(String, String)} 保持一致, + * 在返回前调用 {@code .toLowerCase()}。 + * + * @author GitHub Copilot + */ +public class WxMaXPaySigParamsTest { + + private static final String SESSION_KEY = "your_session_key"; + private static final String APP_KEY = "your_app_key"; + private static final String POST_BODY = "{\"openid\":\"oHoSt5abc123\",\"env\":1}"; + private static final String URL = "https://api.weixin.qq.com/xpay/query_user_balance"; + + /** + * 验证 calcSig 返回值全部为小写十六进制字符,不包含大写字母。 + */ + @Test + public void testCalcSigReturnsLowerCase() { + WxMaXPaySigParams sigParams = WxMaXPaySigParams.builder() + .sessionKey(SESSION_KEY) + .appKey(APP_KEY) + .build(); + + String sig = sigParams.calcSig(POST_BODY); + + assertTrue(sig.equals(sig.toLowerCase()), + "calcSig 返回值应为全小写,当前值: " + sig); + } + + /** + * 验证 calcPaySig 返回值全部为小写十六进制字符,不包含大写字母。 + */ + @Test + public void testCalcPaySigReturnsLowerCase() { + WxMaXPaySigParams sigParams = WxMaXPaySigParams.builder() + .sessionKey(SESSION_KEY) + .appKey(APP_KEY) + .build(); + + String paySig = sigParams.calcPaySig(URL, POST_BODY); + + assertTrue(paySig.equals(paySig.toLowerCase()), + "calcPaySig 返回值应为全小写,当前值: " + paySig); + } + + /** + * 验证 calcSig 与 calcPaySig 的返回值均为有效的 HMAC-SHA256 十六进制字符串(64 个字符)。 + */ + @Test + public void testCalcSigIsValidHexString() { + WxMaXPaySigParams sigParams = WxMaXPaySigParams.builder() + .sessionKey(SESSION_KEY) + .appKey(APP_KEY) + .build(); + + String sig = sigParams.calcSig(POST_BODY); + String paySig = sigParams.calcPaySig(URL, POST_BODY); + + assertEquals(sig.length(), 64, "HMAC-SHA256 签名应为 64 个十六进制字符"); + assertEquals(paySig.length(), 64, "HMAC-SHA256 pay_sig 应为 64 个十六进制字符"); + assertTrue(sig.matches("[0-9a-f]+"), "calcSig 返回值应只含小写十六进制字符"); + assertTrue(paySig.matches("[0-9a-f]+"), "calcPaySig 返回值应只含小写十六进制字符"); + } +}