1、签名算法
目前只支持MD5签名
请求签名
1、 原始请求(sign字段除外) ,所有参数按照字段名的 ascii码从小到大排序后使用 QueryString的格式(即 key1=value1&key2=value2…)拼接而成,空值不传递,不参与签名组串。
2、 在MD5签名时,可以在快接商户平台查看,获取商户密钥(key)。当拿到请求时的待签名字符串后,需要加上&key=商户密钥,形成新的待签名字符串(即 key1=value1&key2=value2…&key=商户密钥),利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串(不需要转大写)。
响应签名
1、 响应的json串,只需要对data里面的字段进行签名(sign字段除外)所有参数按照字段名的 ascii码从小到大排序后使用 QueryString的格式(即 key1=value1&key2=value2…)拼接而成,空值不传递,不参与签名组串。
2、 在MD5签名时,可以在快接商户平台查看,获取商户密钥(key)。当拿到(第一步)的待签名字符串后,需要加上&key=商户密钥,形成新的待签名字符串(即 key1=value1&key2=value2…&key=商户密钥),利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串(不需要转大写)
异步通知签名
1、 异步通知-快接服务器以http post的请求方式将信息返回给客户,信息(sign字段除外)所有参数按照字段名的 ascii码从小到大排序后使用 QueryString的格式(即 key1=value1&key2=value2…)拼接而成,空值不传递,不参与签名组串。
2、 在MD5签名时,可以在快接商户平台查看,获取商户密钥(key)。当拿到(第一步)的待签名字符串后,需要加上&key=商户密钥,形成新的待签名字符串(即 key1=value1&key2=value2…&key=商户密钥),利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串(不需要转大写)
注:快接异步通知消息可能会由于升级增加参数,请验证应答签名时注意允许这种情况。
2、PHP验签实例
/**
* 除去数组中的空值和签名参数
* @param $para 签名参数组
* return 去掉空值与签名参数后的新签名参数组
*/
function paraFilters($para) {
$para_filter = array();
while (list ($key, $val) = each ($para)) {
if($key == "sign" || $val == "")continue;
else $para_filter[$key] = $para[$key];
}
return $para_filter;
}
/**
* 对数组排序
* @param $para 排序前的数组
* return 排序后的数组
*/
function argSorts($para) {
ksort($para);
reset($para);
return $para;
}
/**
* 签名验证-快接支付
* $datas 数据数组
* $key 密钥
*/
function sign($datas = array(), $key = ""){
$str = urldecode(http_build_query(argSorts(paraFilters($datas))));
$sign = md5($str."&key=".$key);
return $sign;
}