Appearance
签名规则 ¶
请求参数签名 ¶
注意
签名字符串中不能拥有 "
和 \
特殊符号,通常处理有嵌套对象活Json字符的请求参数时,会有此类特殊符号,如果不是在使用SDK
,需要我们签名前手动替换为空字符串,然后再进行签名。
将发送的所有数据假定位为集合M,将集合内非空的参数值按照参数名ASCII码
从小到大排序,使用URL请求键值对参数方式进行拼接成字符串,类似key1=value1&key2=value2
这样的格式。需要注意如下原则:
- 参数名不区分大小写
- 将字符串中
"
和\
特殊符号替换为空字符串''
- 参数名ASCII码从小到大排序(字典序)
- 如果参数值为空不进行签名,注意
''
空字符串不是空,null
才是空 - 如果是嵌套参数,将嵌套的参数按上面的规则进行排序,然后转换为
json字符串
,然后参与排序 - 如果是json字符串,不需要做额外处理,直接参与签名即可(别忘了第一条去除特殊符号)
- 进行验签时,
sign
字段不参与签名,将生成的签名与该sign
值作校验 - 含有小数金额的数值不需要保留末尾的0,例如
1.10
需要设置为1.1
,1.00
需要设置为1
。
将上面生成的参数后追加上 sign=秘钥
(追加后格式为 key1=value1&key2=value2&key=秘钥
),然后将该字符串转换为大写,然后进行数据摘要算法计算出 sign
值,并将sign
值添加到请求中进行发送。
数据摘要支持
MD5
和HmacSHA256
两种,使用HmacSHA256
时,key值作为秘钥
样例(无嵌套参数情况) ¶
使用MD5签名方式,密钥为: 123456
待签名的参数 ¶
json
{
"bizOrderNo": "pay_2021520000012254",
"title": "测试支付商品",
"description": "测试支付商户的描述",
"allocation": false,
"autoAllocation": false,
"expiredTime": "2025-04-06 18:37:13",
"channel": "ali_pay",
"method": "qrcode",
"limitPay": "no_credit",
"amount": 99.6,
"extraParam": "{\"openIdType\":\"sub\"}",
"attach": "{\"order:\"}:\"order_0000001\"",
"returnUrl": "https://pay.daxpay.cn/returnurl",
"notifyUrl": "https://pay.daxpay.cn/notice",
"clientIp": "127.0.0.1",
"reqTime": "2025-04-06 18:07:13",
"nonceStr": "ww5gjytfsdfe"
}
转换为有序集合 ¶
json
{
"allocation": "false",
"amount": "99.6",
"attach": "{\"order\":\"order_0000001\"",
"autoAllocation": "false",
"bizOrderNo": "pay_2021520000012254",
"channel": "ali_pay",
"clientIp": "127.0.0.1",
"description": "测试支付商户的描述",
"expiredTime": "2025-04-06 18:40:31",
"extraParam": "{\"openIdType\":\"sub\"}",
"limitPay": "no_credit",
"method": "qrcode",
"nonceStr": "ww5gjytfsdfe",
"notifyUrl": "https://pay.daxpay.cn/notice",
"reqTime": "2025-04-06 18:10:31",
"returnUrl": "https://pay.daxpay.cn/returnurl",
"title": "测试支付商品"
}
拼接字符串并过滤掉特殊字符 ¶
allocation=false&amount=99.6&attach={order:order_0000001&autoAllocation=false&bizOrderNo=pay_2021520000012254&channel=ali_pay&clientIp=127.0.0.1&description=测试支付商户的描述&expiredTime=2025-04-06 18:40:31&extraParam={openIdType:sub}&limitPay=no_credit&method=qrcode&nonceStr=ww5gjytfsdfe¬ifyUrl=https://pay.daxpay.cn/notice&reqTime=2025-04-06 18:10:31&returnUrl=https://pay.daxpay.cn/returnurl&title=测试支付商品
拼接密并钥转换大写 ¶
ALLOCATION=FALSE&AMOUNT=99.6&ATTACH={ORDER:ORDER_0000001&AUTOALLOCATION=FALSE&BIZORDERNO=PAY_2021520000012254&CHANNEL=ALI_PAY&CLIENTIP=127.0.0.1&DESCRIPTION=测试支付商户的描述&EXPIREDTIME=2025-04-06 18:43:29&EXTRAPARAM={OPENIDTYPE:SUB}&LIMITPAY=NO_CREDIT&METHOD=QRCODE&NONCESTR=WW5GJYTFSDFE&NOTIFYURL=HTTPS://PAY.DAXPAY.CN/NOTICE&REQTIME=2025-04-06 18:13:29&RETURNURL=HTTPS://PAY.DAXPAY.CN/RETURNURL&TITLE=测试支付商品&KEY=123456
进行签名 ¶
636c5f87e5d128da83cad79e76d1bc0e
数据验签 ¶
注意
响应参数和通知消息验签时,通常我们接口返回的类型会是公共响应参数<业务响应参数>
的格式,签名规则基本与请求参数验签一致,需要注意的点在于返回的data
参数直接序列化为json
字符串即可 不需要进行排序。注意返回的数据如果没有sign
字段,则不需要进行验签,参考下面的验签示例
使用MD5签名方式,密钥为: 123456
待验签的数据 ¶
json
{
"code" : 0,
"msg" : "success",
"data" : {
"bizOrderNo" : "SDK_1744004534098",
"orderNo" : "DEV_P2025040713421870000006",
"status" : "progress",
"payBody" : "weixin://wxpay/bizpayurl?pr=FwIhHn7z1"
},
"sign" : "0f5f56d8df0db335c21c5649028b6b91",
"resTime" : "2025-04-07 13:42:18",
"traceId" : "4sObqTTuNfQL"
}
转换为有序集合 ¶
json
{
"code" : "0",
"data" : "{\"bizOrderNo\":\"SDK_1744004534098\",\"orderNo\":\"DEV_P2025040713421870000006\",\"status\":\"progress\",\"payBody\":\"weixin://wxpay/bizpayurl?pr=FwIhHn7z1\"}",
"msg" : "success",
"resTime" : "2025-04-07 13:42:18",
"traceId" : "4sObqTTuNfQL"
}
拼接字符串并过滤掉特殊字符 ¶
code=0&data={bizOrderNo:SDK_1744004534098,orderNo:DEV_P2025040713421870000006,status:progress,payBody:weixin://wxpay/bizpayurl?pr=FwIhHn7z1}&msg=success&resTime=2025-04-07 13:42:18&traceId=4sObqTTuNfQL
拼接密并钥转换大写 ¶
CODE=0&DATA={BIZORDERNO:SDK_1744004534098,ORDERNO:DEV_P2025040713421870000006,STATUS:PROGRESS,PAYBODY:WEIXIN://WXPAY/BIZPAYURL?PR=FWIHHN7Z1}&MSG=SUCCESS&RESTIME=2025-04-07 13:42:18&TRACEID=4SOBQTTUNFQL&KEY=123456
进行签名并对比 ¶
0f5f56d8df0db335c21c5649028b6b91
与返回值一致