加签验签说明#
1.
商户、合作方保存自己的私钥证书和收呗支付公钥证书。
3.
商户、合作方向收呗发起请求时,商户、合作方使用自己的私钥签名。
4.
收呗接收商户、合作的请求时,收呗使用商户、合作方公钥进行验签。
5.
收呗返回商户、合作方应答时,收呗使用自己的私钥签名。
6.
商户、合作方接收收呗交易应答时,商户、合作方使用收呗的公钥验签
公钥私钥#
收呗平台公钥:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7hyx4CAbEA1BWUqdpLNeAA2QZ+/VtMpxmgR3iHE5qgMIkCJ7oQmzTgMiGv37gbFD2PRWL9raPwWEhqCor3Ga+bbhr94ozUn/Q/A+shBqxfbtKjYUpHXOD2O4dcaJ2XBzO8wHDwQKaBw8P21A/UgF1vcCHs3qHExaiWFswgF4Pb7Nt8D9nqa1FI9jRjcpRcO3ouqxWRJMoqCVsjyQsqXYSsFHw/0ysyd07a2gDVymZlHaGTQREjCme6FR5hq8noZ2CrTyrsNE5OXo7YylkfAdHEZP4b7YC5ExN01vps3Zg0YbuCJCLTWHJD7a+3cRJenR+KKou/glnZJxUZX+dTjYmwIDAQAB
代理商私钥:
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCj/jngLrcfYBDn
vPjNrOCZ/RhD19MBix2TyqzRDIuMAxwsuarvnFh7am0YjxnOEf5VhQoqPMwvYGSa
pDD1gU5ryR9RSEvtxcU76/QUa8E4IECOHjQ7tb6cuWzjIPA9uD80WUiIBWKAlLPv
puU5OIgD0JGB4kcSkIy6LRNLa5jjJ5AgfJo7+8GIqUldCbnWM2oMoNkjaPfnbOMR
QxI5CfLdVULuZmTZ5xEx6MDWPqDtJND0qpU2GCWxJAdi82o2nQbGNMmRqYHq1euy
PeZZdq0bcFSN45LH0qEiTCrgUVQ/dIdNhKowVesJX3OHrwggHsxv8OY9xcqysrsD
r72v54bXAgMBAAECggEACo2Wy24Ku3FcFSNMWhLPj0lB2moVKBzpnLPm0c1ZpvtF
rqpEUfScVVVlJpI4l9Hcv7FkgpDiTXFS5b8+bwYHrPQiIbi0XiZ+tz/LXB3pnLDw
WNTpdycOar3lZLQM2tY0YnU51Ciz+odE7LjmOKBdvqLQQkg9pC7WIvCm62wzfx1p
xNDiQtF1GAvCB1eeE80taYYt2+YsMPL6CTTaRjhwZU8MK3rZak+oO0zgJLNQrWM8
RGbeYS4tE9RUAFZO98b93GupDKQ1Ha6YPVm3DGITZLy4XFSDxUt2nMcJNdzmAU/6
B0lBCvH/Z76o4dlYmGwNFqXOZUvQgqwAAa99f4A3JQKBgQDSG8YR9DdojrHk6Ab/
RY1l5VGHV4K9i8WWrg4C2NI5sDZ8LNq9NH1b7FymG2o5y2KzElBXz8fkp3TYlCpW
s30hwBMCNnSIckyaW/oRUV0p7fz9iI2PQWiOj2InFWVSl8K5Rt8QkuzIdCHaw1Mm
GxNqpO1Le+/Sb+PIMk9U0toGhQKBgQDHz+gMD0wGb2cH7uYsb/VRhu9p83Crbcwi
7iaxO2Xd5g0EpfOBEtciDAsd+iBmYM1WTWDdgFRSn6Pgaiq43L6CCt2I4n/WqkyC
GvU/RmgVGRdfBY9y2ab7xkakSPLxcHUPlt6a1qdzLyiMGxv1ecGEKxoxB9RKYMFa
gaml2yY8qwKBgFg8x8MUgAyOGNGcTAv6prZLRyECtGpr/7AXKtUxP6Bwi4E8ySQ6
ngbzzbkIvGTHMI0pvMoT/cveM6kdGGbO/FcnNhRw0CHZdqhAxlVtiSWpx9yl82Vd
P87XEo59Ys774xAyXk20lnJcqzcXXp0bM91OpEVWKFKFIPEbh8uEvYGNAoGALxer
Ixx/2IxtBguiKBsDAIIC7z+28FBiamEisWbEbXYI322VZHhiR936yMfo1vg9rPdz
uwDB3u9NGlkrVIKCS/fvmpF3e8qLWaas4orfgQl23qha1MDDgFeM0q92wry0ekYe
lPO+Z4FX1x2Ui1h06YeXFrM3r4f6SjCBIVvzOR0CgYBCZej8pfc87pD/ALMvdy1k
0gnFYCVUv1z4hWf5Ruz/djWxdL5swgB13Bkj/zJcK5wWXvIOfDDqUlS/h9acYdfw
mbZuy2lEiil+YzatWr+IcB6jy8K61/z55nUDYk6N1NJNfGyDzxyvhNdLV1pEErsg
C+f+hwVNxFTyDGLA1M84kw==
-----END PRIVATE KEY-----
【商户请求加签】 商户使用"商户自己的 RSA 私钥"对请求报文进行加签。开发注意:
1、空字符串也参与签名
2、为了解决签名的效率问题,部分接口的请求体(reqBody)或者响应体(rspBody)是不参与签名的,具体参加具体接口的特殊签名说明
签名流程:
1、将请求报文(排除 sign 字段)按字段名的 ASCII 码从小到大排序 (嵌套参数用点号 . 扁平化,如 reqBody.amount;值为 null 的字段不参与签名)
2、将排序后的参数拼接为字符串:key1=value1&key2=value2&...(参数名和值之间用 = 连接,参数之间用 & 连接)
3、对拼接后的字符串计算 MD5(hex 小写,32 位)
4、对 MD5 值进行 RSA2 签名(SHA256withRSA,密钥位数 2048),得到 Base64 编码的签名串 sign待签名串 = key1=value1&key2=value2&...(ASCII升序,排除sign,null值不参与)
md5值 = MD5小写(待签名串)
sign = SHA256withRSA_SIGN(md5值, 商户私钥)
------------加签前-------------------------
{
"requestId": "51",
"timestamp": "1786106107116",
"nonce": "7898bn800789890000",
"reqBody": {
"mccType": "01"
}
}
------------加签后-------------------------
注意:
1. 空字符串也参与签名
2. 数据类型如果不一致,也会导致验签失败
3. 比如 transAmount 必须是数值类型,不能是字符串
{
"requestId": "51",
"timestamp": "1786106107116",
"nonce": "7898bn800789890000",
"sign": "k4dAJ1htyty72LCOMMBVBFBh5UaQ3U25TtnBfMAVeCy85G6ff3IQKsrO7bGHEBJOpKgSrMKi5wkX3U6RLtnEWRxEwCVmRtlpCHqKg9aSYF+L9cwz2bfqdVCb3rTU0YO3oUl/bUXUfwmLJ8QaESJC7/a9eojHwUjLcMXDMfUwVVt3g9FspB7c2fxkd+xe0MndimSylF+YRhP1N/BMlwj/iKjvgYHs4YXgPvsS9c6U8stY2JuCTWqqvMIIHCxPRCcfzf5YfkAtbSzEBeXHPn2KUswE7Rht5YzXeTHTmVZSQ/QMyZwf0HMZuOTQQcLVcL4pcPBPptQZOutbiwjXl8C8Lw==",
"reqBody": {
"mccType": "01"
}
}
【商户验签】 商户使用 "收呗的RSA公钥" 对收呗的响应报文 进行验签
待签名串 = key1=value1&key2=value2&...(ASCII升序,排除sign,null值不参与)
md5值 = MD5小写(待签名串)
验签结果 = RSA公钥验签(待签名串, 响应返回的sign, 收呗公钥)
【重要】通过验签确定响应的报文是否合法,是保障通信安全的保障手段,建议每个接口都需要验签
{
"code": 200,
"msg": "成功",
"timestamp": "1786106107116",
"nonce": "789rrtr8999000",
"rspBody": {
"playType": "MemberApply",
"applyNo": "318516039568",
"merTrace": "631000000005575"
},
"sign": "k5QtbtHLjvCTd3eiRHPI+hoFd8TizvuwQ443r7K/yjUDeCOWflJryPbsBlEonRc/2mm43s+x/f3h1pAa5swuHODoYDo6dYFHa5PjH3bD2Fnds5IjeYcdQxbcDCQugXm5m3eoR+jWUrX28XnL63qdgdnaYDM4SlF7QC+59XxA8xBwAsPGwq9tOOFTYNuv4f2XKB8UH3tSjj0o31RUix3XtEr8TDsvFrk3znaWo0Vue2JrKhvJzfrHeeisMZlhYckvlJqDQdOXwtz1hxoo8DMGuZl08gXpEeYOZBtoW0sX+MJnYcEQ4VpoBzgxP5YSOaGg56rM7x8I34WX8xqglSX7Wg=="
}
java版本的加签、验签工具类#