签名算法
签名生成的通用步骤如下
第一步
假设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序) 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
参数名ASCII码从小到大排序(字典序);
如果参数的值为空(null 或 ""[空字符串] " "[空字符串] 字符均不参与签名)不参与签名;
参数名区分大小写;
验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步
在stringA最后拼接上key`[即 StringA +"&key=" + 私钥 ]` 得到stringSignTemp字符串, 并对stringSignTemp进行MD5运算
DEMO
如请求支付系统参数如下
{
"merchantNo": 22190316182634888,
"merchantOrderNo": "92e6f005b40746ea82360a36f7c2e8a2",
"currency": 1,
"notifyURL": "https://www.baidu.com/api/test/demo/webhook/pay",
"wayCode": "ALI_PC",
"extras": "{}",
"amount": 100,
"timestamp": 1767108249845,
"returnURL": "https://www.baidu.com/api/test/demo/page/pay"
}
拼接成字符串stringA
amount=100.00¤cy=1&extras={}&merchantNo=22190316182634496&merchantOrderNo=92e6f005b40746ea82360a36f7c2e8a2¬ifyURL=https://www.baidu.com/api/test/demo/webhook/pay&returnURL=https://www.baidu.com/api/test/demo/page/pay×tamp=1767108249845&wayCode=ALI_PC
待签名值stringSignTemp
amount=100.00¤cy=1&extras={}&merchantNo=22190316182634496&merchantOrderNo=92e6f005b40746ea82360a36f7c2e8a2¬ifyURL=https://www.baidu.com/api/test/demo/webhook/pay&returnURL=https://www.baidu.com/api/test/demo/page/pay×tamp=1767108249845&wayCode=ALI_PC&key=8ff81f5fdd065fc2e862
签名结果:
md5(stringSignTemp)
08240cc7f7b6dd2749fc0bedfcea8bbe
最终请求支付系统参数
{
"merchantNo": 22190316182634888,
"merchantOrderNo": "92e6f005b40746ea82360a36f7c2e8a2",
"currency": 1,
"notifyURL": "https://www.baidu.com/api/test/demo/webhook/pay",
"wayCode": "ALI_PC",
"extras": "{}",
"amount": 100,
"timestamp": 1767108249845,
"returnURL": "https://www.baidu.com/api/test/demo/page/pay",
"sign": "08240cc7f7b6dd2749fc0bedfcea8bbe"
}
私钥请见商户管理后台