为确认回调来自 Setu 且正文未被改动,使用 Setu 的 RSA 公钥和 SHA-512 校验 Signature请求头(算法名SHA512withRSA)。
收到 Setu 回调后,先校验 Signature,通过后再处理业务。验签失败的回调应丢弃。
回调带有 Signature和Timestamp。对待验字符串做SHA512withRSA验签,公钥为 Setu 的公钥。待验字符串不含请求路径。
SHA512withRSAstringToVerify = sha512Hex(rawBody) + timestamprawBody:收到的回调 JSON 原始字节(UTF-8)。先解析再序列化会改变字段顺序、空格或数字类型,验签会失败。sha512Hex:对 rawBody 计算 SHA-512,输出小写十六进制,共 128 个字符。timestamp:Timestamp 请求头的原始字符串,单位为秒。不要改用本机当前时间。{"transactionRef":"e50f5496-1316-4fa6-a206-98be03550c4d","merchantRef":"19e5b36d-c9d6-4cb4-8e4e-e6fe0e3a0cb5","currency":"INR","method":"NATIVE","amount":"100.01","paidAmount":"100.01","fee":"5.5","status":"Success"}9e0fa54a47570bf67f9bff06fbabc2a1a220863dfa5f50514e220287ad5bcdeb46f07090e1bf2180cba4360a45a35cb0cf9dd705401bddfdaa18c275ecbb8688Timestamp 为:16994472979e0fa54a47570bf67f9bff06fbabc2a1a220863dfa5f50514e220287ad5bcdeb46f07090e1bf2180cba4360a45a35cb0cf9dd705401bddfdaa18c275ecbb86881699447297stringToVerify 的 UTF-8 字节做 SHA512withRSA 验签。Signature 按标准 Base64 解码。Base64 区分大小写,不要使用 URL-safe 解码。-----BEGIN PUBLIC KEY-----)。| 请求头 | 值 |
|---|---|
Timestamp | Unix 秒级时间戳,与拼入待验字符串的值相同 |
Signature | Setu 私钥签名的标准 Base64 |
Content-Type | application/json |
Setu 使用自己的私钥对回调签名,商户使用 Setu 公钥验签。 待验字符串是 sha512Hex + timestamp,不含路径。商户请求 Setu 时的path + sha512Hex + timestamp不能用在回调上。正文哈希和时间戳都在签名范围内。验签通过后仍应只使用原始正文里的字段,不要改用另一份重新序列化的 JSON。
待验字符串区分大小写,必须逐字节一致。正文哈希必须是小写十六进制。 哈希的必须是 HTTP 正文原始字节,不能格式化、重排字段或增删空格。 Timestamp从请求头读取,单位是秒,并且与 Setu 签名时使用的值相同。Signature使用标准 Base64(字母表含+、/、=),验签前先解码。示例正文只说明哈希算法。正式回调的字段以接口文档为准,验签时仍对收到的原始正文计算哈希。