From 22f876d2aae5ee48a85f7151bf3360e76031b5d9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:28:18 +0000 Subject: [PATCH 1/4] Initial plan From ccbfe8e47105e5a8861a611e155c5fe298567ed9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:36:01 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81JSON=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=A8=A1=E5=BC=8F=E9=AA=8C=E7=AD=BE=E8=A7=A3=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/bean/WxMaMessage.java | 31 ++++++++++++ .../wx/miniapp/bean/WxMaMessageTest.java | 49 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java index 83073850da..a45e394e2b 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java @@ -629,6 +629,27 @@ public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig con } } + /** + * 从加密字符串转换. + * + * @param encryptedJson 密文 + * @param config 配置存储器对象 + * @param timestamp 时间戳 + * @param nonce 随机串 + * @param msgSignature 签名串 + */ + public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config, + String timestamp, String nonce, String msgSignature) { + try { + WxMaMessage encryptedMessage = fromJson(encryptedJson); + String plainText = new WxMaCryptUtils(config).decryptContent(msgSignature, timestamp, nonce, + encryptedMessage.getEncrypt()); + return fromJson(plainText); + } catch (Exception e) { + throw new WxRuntimeException(e); + } + } + public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { try { return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config); @@ -637,6 +658,16 @@ public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig } } + public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config, + String timestamp, String nonce, String msgSignature) { + try { + return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config, + timestamp, nonce, msgSignature); + } catch (IOException e) { + throw new WxRuntimeException(e); + } + } + @Override public String toString() { return this.toJson(); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java index a25589d640..0b7060e79b 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java @@ -2,14 +2,21 @@ import cn.binarywang.wx.miniapp.bean.xpay.WxMaXPayTeamInfo; import cn.binarywang.wx.miniapp.constant.WxMaConstants; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils; import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.error.WxRuntimeException; +import me.chanjar.weixin.common.util.crypto.SHA1; import org.testng.annotations.Test; +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.as; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -459,6 +466,48 @@ private void checkXPayComplaintNotifyMessage(WxMaMessage msg) { assertEquals(msg.getRequestId(), "req_005"); } + @Test + public void testFromEncryptedJsonWithSignature() { + WxMaDefaultConfigImpl config = buildMessagePushConfig(); + String plainJson = "{\"ToUserName\":\"gh_123456789abc\",\"FromUserName\":\"fromUser\",\"CreateTime\":1710000000," + + "\"MsgType\":\"event\",\"Event\":\"subscribe_msg_popup_event\"}"; + String encrypt = new WxMaCryptUtils(config).encrypt("1234567890abcdef", plainJson); + String timestamp = "1710000000"; + String nonce = "nonce123"; + String msgSignature = SHA1.gen(config.getToken(), timestamp, nonce, encrypt); + String encryptedJson = "{\"Encrypt\":\"" + encrypt + "\"}"; + + WxMaMessage wxMessage = WxMaMessage.fromEncryptedJson(new ByteArrayInputStream( + encryptedJson.getBytes(StandardCharsets.UTF_8)), config, timestamp, nonce, msgSignature); + + assertEquals(wxMessage.getToUser(), "gh_123456789abc"); + assertEquals(wxMessage.getFromUser(), "fromUser"); + assertEquals(wxMessage.getCreateTime(), new Integer(1710000000)); + assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); + assertEquals(wxMessage.getEvent(), "subscribe_msg_popup_event"); + } + + @Test + public void testFromEncryptedJsonWithSignatureInvalidMsgSignature() { + WxMaDefaultConfigImpl config = buildMessagePushConfig(); + String plainJson = "{\"ToUserName\":\"gh_123456789abc\",\"FromUserName\":\"fromUser\"}"; + String encrypt = new WxMaCryptUtils(config).encrypt("1234567890abcdef", plainJson); + String encryptedJson = "{\"Encrypt\":\"" + encrypt + "\"}"; + + assertThatThrownBy(() -> WxMaMessage.fromEncryptedJson(encryptedJson, config, + "1710000000", "nonce123", "invalidSignature")) + .isInstanceOf(WxRuntimeException.class) + .hasMessageContaining("加密消息签名校验失败"); + } + + private WxMaDefaultConfigImpl buildMessagePushConfig() { + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + config.setAppid("wx1234567890abcdef"); + config.setToken("testToken"); + config.setAesKey("abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"); + return config; + } + /** * 虚拟支付 iOS 退款查询通知事件 xpay_subscribe_ios_refund_query_notify 测试用例(XML格式) */ From 556d3762c477999af8cf4a44e29f509b39af47ec Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 15 Jul 2026 14:08:52 +0800 Subject: [PATCH 3/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../wx/miniapp/bean/WxMaMessage.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java index a45e394e2b..c561ca944a 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java @@ -638,16 +638,19 @@ public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig con * @param nonce 随机串 * @param msgSignature 签名串 */ - public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config, - String timestamp, String nonce, String msgSignature) { - try { - WxMaMessage encryptedMessage = fromJson(encryptedJson); - String plainText = new WxMaCryptUtils(config).decryptContent(msgSignature, timestamp, nonce, - encryptedMessage.getEncrypt()); - return fromJson(plainText); - } catch (Exception e) { - throw new WxRuntimeException(e); - } +public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config, + String timestamp, String nonce, String msgSignature) { + try { + WxMaMessage encryptedMessage = fromJson(encryptedJson); + String plainText = new WxMaCryptUtils(config).decryptContent(msgSignature, timestamp, nonce, + encryptedMessage.getEncrypt()); + return fromJson(plainText); + } catch (WxRuntimeException e) { + throw e; + } catch (Exception e) { + throw new WxRuntimeException(e); + } +} } public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { From 3d32eef6ae16a0b548f4240e5a3748a11b48e9d3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Jul 2026 06:13:56 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20WxMaMessage.java=20?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF=EF=BC=9A=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E7=9A=84=20}=20=E5=B9=B6=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E7=BC=A9=E8=BF=9B=E4=B8=8E=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/binarywang/wx/miniapp/bean/WxMaMessage.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java index c561ca944a..6d01e58034 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java @@ -638,19 +638,12 @@ public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig con * @param nonce 随机串 * @param msgSignature 签名串 */ -public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config, - String timestamp, String nonce, String msgSignature) { - try { + public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config, + String timestamp, String nonce, String msgSignature) { WxMaMessage encryptedMessage = fromJson(encryptedJson); String plainText = new WxMaCryptUtils(config).decryptContent(msgSignature, timestamp, nonce, encryptedMessage.getEncrypt()); return fromJson(plainText); - } catch (WxRuntimeException e) { - throw e; - } catch (Exception e) { - throw new WxRuntimeException(e); - } -} } public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) {