## 签名规则 签名算法 签名生成的通用步骤如下: - 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序), 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 参数的值为空或null、sign签名字段不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或码付宝主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 码付宝接口可能增加字段,验证签名时必须支持增加的扩展字段 - 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign值signValue。 ◆ key:“应用管理”-“应用管理”-“选择对应应用-详情”中获取SECRET 举例: 假设传送的参数如下: ```bash a:1 b:2 sign:86452f3b9aa613299f2e00224a3dfef1 ``` 第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下: ```bash stringA = "a=1&b=2" ``` 第二步:拼接API密钥: ```bash stringB = stringA+"&key=sdfwewlslsxxwesf" // 注: key为应用的SECRET sign = md5(stringB) // md5加密, 结果为 86452f3b9aa613299f2e00224a3dfef1 ``` ## php代码示例 ```php ~~~ /** * 生成支付签名 * @param array $option 所有参数 * @param string $partnerKey 私钥 * @return string 签名 */ function getPaySign($option, $partnerKey) { ksort($option); $sign = ''; foreach ($option as $k => $v) { if ($k == 'sign' || $v === '' || $v === null) { continue; } $sign .= "$k=$v&"; } return md5($sign . 'key=' . $partnerKey); } /** * 验证支付签名 * @param array $option 所有参数 * @param string $partnerKey 私钥 * @return bool */ function checkPaySign($option, $partnerKey) { $sign = $option["sign"]; return getPaySign($option, $partnerKey) == $sign; } ~~~ ```