<?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>