参数校验

签名过程

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

第二步,在stringA最后拼接上secret得到stringB字符串,并对stringB进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

发起请求生成校验示例

请求参数(nonce为每个请求生成的不同的随机字符串)

uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx

对请求参数排序组合得到stringA

stringA="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test"

拼接密钥”yyyyyy”

stringB="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test&secret=yyyyyy"

产生签名

signValue="3DB61D5B098BCBA7D2E2A0616541040A"

发起请求

GET
    http://xxx.xxx.xxx/api?avatar=http://xxx.xxx.xxx.xxx.jpg&nonce=xxxxxxxxxxxxx&uid=1&username=test&sign=3DB61D5B098BCBA7D2E2A0616541040A

POST
    http://xxx.xxx.xxx/api
    POST内容:
        uid: 1
        username: test
        avatar: http://xxx.xxx.xxx.xxx.jpg
        nonce: xxxxxxxxxxxxx
        sign: 3DB61D5B098BCBA7D2E2A0616541040A

接口收到请求校验示例

收到的$_GET或$_POST

uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx
sign: 3DB61D5B098BCBA7D2E2A0616541040A

去掉sign字段后的内容做排序组合

stringA="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test"

拼接密钥”yyyyyy”

stringB="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test&secret=yyyyyy"

产生签名

signValue=""

判断请求中的sign是否与生成的signValue相同

注意

* 用于签名的参数中应带有随机字符串,保证签名不可预测
* 请求参数内容中"@"开头的内容不参与生成签名
* 用于签名的参数中不应包含secret字段,secret字段被保留用于密钥

PHP版本随机字符串生成及签名算法

function nonce($length = 32){
     $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
     $str ="";
     for ( $i = 0; $i < $length; $i++ )  {  
         $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
     } 
     return $str;
}

function sign($params, $secret) {
    ksort($params);

    $sparams = array();
    foreach ($params as $k => $v) {
        if ("@" != substr($v, 0, 1)) {
            $sparams[] = "$k=$v";
        }
    }
    $sparams[] = "secret=" . $secret;

    return strtoupper(md5(implode("&amp;", $sparams)));
}

返回的数据格式

* status说明
    * -1 参数校验失败
    * 0 错误
    * 1 正确
*text|string|原因
*data|array|返回的数据
文档更新时间: 2019-11-25 11:43   作者:漫漫