本頁還沒有繁體中文版本,下面是简体中文內容。
签名
请求、应答、回调都带签名 sign。两套接口的签法不同,别混用。
代付接口 std1:HMAC-SHA256
- 取全部参数(验应答、回调时取全部字段),去掉
sign。 - 值是空串的不参与(空串等于没传);
0和空格照样参与。 - 参数名按 UTF-8 字节升序排:区分大小写,大写字母排在小写前面,数字名
20排在3前面。 - 拼成
名=值,用&连起来。值用原文:不做 URL 编码、不去空白、不转 HTML 实体。 - 用 API私钥做 HMAC-SHA256。私钥就是商户后台「安全中心」里那串文本本身(新开的商户是 64 位十六进制),按文本的 UTF-8 字节用,不要先解成字节。
- 结果写成 64 位小写十六进制,前面的 0 要补足。我们验签不分大小写。
请求、应答、回调同一种签法、同一把密钥。您带了文档没列的参数,也要参与签名(我们验签后忽略它)。
示例
示例密钥(假的)
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
密钥按文本的 UTF-8 字节当 HMAC 密钥,不要先把 64 位十六进制解成 32 字节;hexDecodedKeySign 是解了之后签出来的错误值
参数
[["mchId","DEMO0001"],["mchOrderNo","ORDER-20260917-0001"],["amount","10000"]]
签名串
amount=10000&mchId=DEMO0001&mchOrderNo=ORDER-20260917-0001
sign
9baf546e1f95057438cab0379a8abe79f65110f4edb21ae3c1131b7b87694509
错误做法(把密钥解成 32 字节再签)得到
b21db2c6def6135e35d9fca688449a9bb1a14b226be5c21adff1b267a6c3a1bb
空串和 null 不参与(等于没传);"0" 和一个空格照签;sign 本身不参与
参数
[["a","1"],["b",""],["c",null],["d"," "],["e","0"],["sign","ffff"]]
签名串
a=1&d= &e=0
sign
e73689ddfba7cb0e1fee38f7450ced153080e6e9ec2e29b986a6f5259dc6ef09
参数名按 UTF-8 字节升序、区分大小写:数字 < 大写 < 下划线 < 小写;纯数字名也按字节比(20 在 3 前面)
参数
[["b","1"],["a","2"],["B","3"],["_","4"],["0","5"],["20","6"],["3","7"],["aB","8"],["a_b","9"],["a1","10"],["Z","11"],["ab","12"]]
签名串
0=5&20=6&3=7&B=3&Z=11&_=4&a=2&a1=10&aB=8&a_b=9&ab=12&b=1
sign
cc98598fb90d59b6603d65a813ad54959ce38cdbe6e1fb2ed1c0b7baead5cf3d
签名以 00 开头:十六进制输出必须补足 64 位(大整数转十六进制会丢前导 0)
参数
[["mchId","DEMO0001"],["nonce","112"]]
签名串
mchId=DEMO0001&nonce=112
sign
00e9a48bd200689f0a7e7a91e650f022f7e54d7f6816d869ddce36f19c1e5c1a
验应答和回调
- 应答:取应答 JSON 里除
sign外的全部字段,照上面算,和sign比(不分大小写)。验不过的应答当「结果不明」,里面的字段一个都别信。 - 回调:只用 POST 正文里的参数验。别把回调地址上的查询串混进来:很多框架的「参数表」会把两者合在一起,合了必然验不过。
代收接口 compat1(老协议):MD5
和原来老系统完全一样:
- 取收到的全部参数,去掉
sign;值是 null 或正好是空串的不参与,只有空格的值要参与。 - 值是 JSON 对象的(只有应答里的
payParams),把它第一层的键按字符编码排好,再紧凑写成 JSON(不留空格)当作值。 - 拼成
名=值,对整条名=值按不分大小写排序。注意不是只排名字:param10=…排在param1=…前面,因为0在=前面。 - 用
&连起来,最后接上&key=您的商户私钥。 - 取 UTF-8 字节做 MD5,结果写成 32 位大写十六进制。我们验签不分大小写。
- 您带的全部非空参数都参与,包括文档没列的。
示例
下单请求:
示例密钥(假的):demo-key-NOT-REAL-do-not-use-0001
参数
mchId=20000001
productId=8001
mchOrderNo=ORDER20260918001
amount=10000
notifyUrl=https://merchant.example.com/notify
subject=goods
body=goods
param1=shop-7
param2=张三
reqTime=20260918120000
签名串
amount=10000&body=goods&mchId=20000001&mchOrderNo=ORDER20260918001¬ifyUrl=https://merchant.example.com/notify¶m1=shop-7¶m2=张三&productId=8001&reqTime=20260918120000&subject=goods&key=demo-key-NOT-REAL-do-not-use-0001
sign
86032564C62F16F220F9DBAD7D88C690
请求正文
mchId=20000001&productId=8001&mchOrderNo=ORDER20260918001&amount=10000¬ifyUrl=https%3A%2F%2Fmerchant.example.com%2Fnotify&subject=goods&body=goods¶m1=shop-7¶m2=%E5%BC%A0%E4%B8%89&reqTime=20260918120000&sign=86032564C62F16F220F9DBAD7D88C690回调(sign 在正文里,空值不参与签名):
示例密钥(假的):demo-key-NOT-REAL-do-not-use-0001
您填的 notifyUrl
https://merchant.example.com/notify
发往的地址
https://merchant.example.com/notify
回调正文
income=10000&payOrderId=ORDER20260918001&amount=10000&mchId=20000001&productId=8001&mchOrderNo=ORDER20260918001&paySuccTime=1789704005000&sign=9447B44CF966CB47A625CADF63C539A8&channelOrderNo=UP20260918000123&backType=2¶m1=shop-7¶m2=%E5%BC%A0%E4%B8%89&channelAttach=&status=2
签名串
amount=10000&backType=2&channelOrderNo=UP20260918000123&income=10000&mchId=20000001&mchOrderNo=ORDER20260918001¶m1=shop-7¶m2=张三&payOrderId=ORDER20260918001&paySuccTime=1789704005000&productId=8001&status=2&key=demo-key-NOT-REAL-do-not-use-0001