api 签名算法

<?php


define('token', 'tokensecret'); //  定义私钥token 
/**
 * 哈希验证签名
 */
function hmacSign($array, $token) {
    if (isset($array['sign'])) {
        $orig_sign = $array['sign'];
        unset($array['sign']);
    } else {
        print_r([1000, '签名错误']);
    }
    ksort($array);
    $requestString = '';

    foreach ($array as $k => $v) {
              $requestString .= $k . '=' . urlencode($v);   //  编码转换问题
    }
    $newSign = hash_hmac("md5", strtolower($requestString), $token);  // 生成服务器端签名规则  $requestString 全部转换为小写 进行加密
    // 生成签名进行判断
    if ($orig_sign != $newSign) {   //  验证码签名 
        print_r([1000, '签名错误.']);
    }else{
         echo '签名成功';
    }
}


/**
 *  date 接收的数组
 */
$data = [
    'time' => '1523002001',
    'DId' => '2320200012',
    'appid' => '12547412589',  
];

/**
 * 服务器验证
 */

$sig = $data;
$sig['sign'] ='50d1b37fb9c1ac08eb6c20acc5266558';  //  js 生成sign
$a = hmacSign($sig, token);

?>
<!-- MD5.js -->
  <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
<script>

    var postData =<?php echo json_encode($data); ?>;
    var token ='<?php echo token; ?>';
    /**
     * json 排序 
     * 先排序再toLower,所以Did 在appid 之前
     */
    function jsonSort(jsonObj) {
        let arr = [];
        for (var key in jsonObj) {
            arr.push(key)
        }
        arr.sort();
        let str = '';
        for (var i in arr) {
            str += arr[i].toLowerCase() + "=" + encodeURI(jsonObj[arr[i]]).toLowerCase();   // value 先进行encodeURL 在转换为小写
        }
        return str
    }

    strData = jsonSort(postData);
    var sign = md5(strData, token);
    postData['sign'] = sign;
    console.log(postData);

</script>

  

猜你喜欢

转载自www.cnblogs.com/yanyanyanyanliu/p/9340448.html
今日推荐