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