签名算法

第一步


设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

  1. 参数名ASCII码从小到大排序(字典序);
  2. 如果参数的值为空不参与签名;
  3. 参数名区分大小写;
  4. 验证调用返回或本站主动通知签名时,传送的sign参数和sign_type不参与签名,将生成的签名与该sign值作校验。
  5. 本接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步


在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign值signValue。

PHP签名实例


/**
 * @Note  生成签名
 * @param $data   参与签名的参数
 * @return string
 */
public function getSign($data)
{
    $data = array_filter($data);
    if (get_magic_quotes_gpc()) {
        $data = stripslashes($data);
    }
    ksort($data);
    $str1 = '';
    foreach ($data as $k => $v) {
        $str1 .= '&' . $k . "=" . $v;
    }
    $str = $str1 . $this->key;
    $str = trim($str, '&');
    $sign = md5($str);
    return $sign;
}



PHP验证签名实例


/**
 * @Note   验证签名
 * @param $data  待验证参数
 * @return bool
 */
public function verify($data)
{
    if (!isset($data['sign']) || !$data['sign']) {
        return false;
    }
    $sign = $data['sign'];
    unset($data['sign']);
    unset($data['sign_type']);
    $sign2 = $this->getSign($data);
    if ($sign != $sign2) {
        return false;
    }
    return true;
}