|
| 1 | +package cn.binarywang.wx.miniapp.api.impl; |
| 2 | + |
| 3 | +import static org.testng.Assert.assertEquals; |
| 4 | +import static org.testng.Assert.assertFalse; |
| 5 | + |
| 6 | +import org.testng.annotations.Test; |
| 7 | + |
| 8 | +/** |
| 9 | + * 验证同城配送 API 签名 payload 格式的单元测试。 |
| 10 | + * |
| 11 | + * <p>直接测试 {@link BaseWxMaServiceImpl#buildSignaturePayload} 生产方法, |
| 12 | + * 确保待签名串格式符合微信官方规范:<br> |
| 13 | + * {@code urlpath\nappid\ntimestamp\npostdata}<br> |
| 14 | + * 共 4 个字段,字段间以换行符 {@code \n} 分隔,末尾无额外回车符。 |
| 15 | + * |
| 16 | + * @author GitHub Copilot |
| 17 | + * @see <a |
| 18 | + * href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/getting_started/api_signature.html"> |
| 19 | + * 微信服务端API签名指南</a> |
| 20 | + */ |
| 21 | +public class WxMaSignaturePayloadTest { |
| 22 | + |
| 23 | + private static final String URL_PATH = |
| 24 | + "https://api.weixin.qq.com/cgi-bin/express/intracity/createstore"; |
| 25 | + private static final String APP_ID = "wx1234567890abcdef"; |
| 26 | + private static final long TIMESTAMP = 1700000000L; |
| 27 | + private static final String POST_DATA = "{\"iv\":\"abc\",\"data\":\"xyz\",\"authtag\":\"tag\"}"; |
| 28 | + private static final String RSA_KEY_SN = "some_serial_number"; |
| 29 | + |
| 30 | + /** |
| 31 | + * 验证 buildSignaturePayload 返回的待签名串恰好包含 4 个字段, |
| 32 | + * 格式为:urlpath\nappid\ntimestamp\npostdata |
| 33 | + */ |
| 34 | + @Test |
| 35 | + public void testPayloadHasExactlyFourFields() { |
| 36 | + String payload = |
| 37 | + BaseWxMaServiceImpl.buildSignaturePayload(URL_PATH, APP_ID, TIMESTAMP, POST_DATA); |
| 38 | + |
| 39 | + String[] parts = payload.split("\n", -1); |
| 40 | + assertEquals(parts.length, 4, "待签名串应恰好包含 4 个字段(urlpath、appid、timestamp、postdata)"); |
| 41 | + assertEquals(parts[0], URL_PATH, "第 1 段应为 urlpath"); |
| 42 | + assertEquals(parts[1], APP_ID, "第 2 段应为 appid"); |
| 43 | + assertEquals(parts[2], String.valueOf(TIMESTAMP), "第 3 段应为 timestamp"); |
| 44 | + assertEquals(parts[3], POST_DATA, "第 4 段应为 postdata"); |
| 45 | + } |
| 46 | + |
| 47 | + /** |
| 48 | + * 验证 buildSignaturePayload 返回的待签名串不包含 rsaKeySn。 |
| 49 | + * rsaKeySn 应通过请求头 Wechatmp-Serial 传递,而不应出现在签名 payload 中。 |
| 50 | + */ |
| 51 | + @Test |
| 52 | + public void testPayloadDoesNotContainRsaKeySn() { |
| 53 | + String payload = |
| 54 | + BaseWxMaServiceImpl.buildSignaturePayload(URL_PATH, APP_ID, TIMESTAMP, POST_DATA); |
| 55 | + |
| 56 | + assertFalse(payload.contains(RSA_KEY_SN), |
| 57 | + "待签名串不应包含 rsaKeySn,rsaKeySn 应通过请求头 Wechatmp-Serial 传递"); |
| 58 | + } |
| 59 | + |
| 60 | + /** |
| 61 | + * 验证 buildSignaturePayload 返回的待签名串与预期格式完全一致。 |
| 62 | + */ |
| 63 | + @Test |
| 64 | + public void testPayloadMatchesExpectedFormat() { |
| 65 | + String expected = URL_PATH + "\n" + APP_ID + "\n" + TIMESTAMP + "\n" + POST_DATA; |
| 66 | + String actual = |
| 67 | + BaseWxMaServiceImpl.buildSignaturePayload(URL_PATH, APP_ID, TIMESTAMP, POST_DATA); |
| 68 | + |
| 69 | + assertEquals(actual, expected, "待签名串格式应为:urlpath\\nappid\\ntimestamp\\npostdata"); |
| 70 | + } |
| 71 | +} |
0 commit comments