我需要很少的帮助来解决php的问题hash_hmac。我正在将现有的python脚本转换为调用流程数据api的php。Python脚本运行良好。在
几乎没有类似的问题,其中之一是
HMAC value not consistent in Python and PHP但这对我没有帮助。我试过很多方法,但一直都有错误,你的签名不匹配
这是我的php代码$session_id = xxxxxxxxxxxxxxxxxxxxx;
$accessKey = xxxxxxxxxxxxxxxxxxxxxx;
$url = '/APIENDPOINT?action=mobileAccess&autoJoin=true';
$timestamp = date('r');
$body = '{"expireTime": "20160322T2359", "doorOperations": [{"operation": "guest", "doors": ["103"]}], "endPointID": "enpointID", "format": "rfid48"}';
$params["action"] = "mobileAccess";
$params["override"] = "true";
$canonicalized_query = array();
foreach ($params as $param => $value) {
$param = str_replace("%7E", "~", rawurlencode($param));
$value = str_replace("%7E", "~", rawurlencode($value));
$canonicalized_query[] = $param . "=" . $value;
}
ksort($canonicalized_query);
$canonicalized_query = implode("&", $canonicalized_query);
$string_to_sign = "POST\n";
$string_to_sign .= base64_encode(md5($body, true))."\n";
$string_to_sign .="application/json;charset=utf-8\n";
$string_to_sign .= $timestamp."\n";
$string_to_sign .= 'APIEDNPOINT?'.$canonicalized_query;
echo strlen($string_to_sign);
$header=array(
'Date: '.$timestamp,
'Content-Type: application/json;charset=utf-8',
'Content-MD5: '.base64_encode(md5($body, true)),
'Authorization: Basic '.$session_id.':'.base64_encode(hash_hmac('sha1', iconv(mb_detect_encoding($string_to_sign, mb_detect_order(), true), "UTF-8", $string_to_sign), iconv(mb_detect_encoding($accessKey, mb_detect_order(), true), "UTF-8", $accessKey), true))
这是工作python代码
^{pr2}$
在python中调用endpoint
^{3}$
我已经检查了两个脚本的body content md5 & string_to_sign输出是否相同。在