
我们调用的是大华的接口,php 和 Java 生成的 HMAC-SHA256 签名是一样的。Java 请求就返回 200,用 php 请求该接口就一直是 401 未授权。所以说生成的签名不可能有问题。昨天晚上一直在找问题,所获请求不成功。话不多说,直接上代码!
<?php $contentMD5 = ""; $cOntentType= "application/json"; $xlcNOnce= create_uuid(); $date1 = date("Ymd\THis\Z"); //20210626T111514Z $ak='1233444'; $SK = "1234566677"; $httpMethod_name = "GET"; // 两个值 GET POST $CanOnicalizedResource= "/eags/api/fsds/v1.0/school-roll/search?id=1&name=12&pId=123&level=0"; $stringToSign = $httpMethod_name."\n".$contentMD5."\n".$contentType."\n".$date1."\n".$xlcNonce."\n"."1.0"."\n".$CanonicalizedResource; echo "要加密的数据-------------\n\n\n".$stringToSign; echo "\n\n\n\n\n"; $hash_code = base64_encode(hash_hmac("sha256", $stringToSign, $SK, true)); echo 'hashCode-------------'.$hash_code; echo "\n\n\n\n\n"; // headers 信息 $headers = [ "Authorization:LC-HMAC-SHA256 ".$ak.":".$hash_code, "Content-MD5:".$contentMD5, "Content-type:".$contentType, "X-LC-Date: ".$date1, "X-LC-Nonce: ".$xlcNonce, // 生成 hash 时候的 uuid "X-LC-VERSION: 1.0", "accept:*/*", "connection:Keep-Alive", "user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" ]; function create_uuid($prefix = ""){ $str = md5(uniqid(mt_rand(), true)); $uuid = substr($str,0,8) . '-'; $uuid .= substr($str,8,4) . '-'; $uuid .= substr($str,12,4) . '-'; $uuid .= substr($str,16,4) . '-'; $uuid .= substr($str,20,12); return $prefix . $uuid; } function get2($url, $header){ $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //TRUE 将 curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); print_r($header); curl_setopt($ch, CURLOPT_HEADER, true); //返回 response 头部信息 curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 时追踪句柄的请求字符串,从 PHP 5.1.3 开始可用。这个很关键,就是允许你查看请求 header //禁止 https 协议验证 ssl 安全认证证书 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); echo "\n\n\n\n\n"; echo curl_getinfo($ch, CURLINFO_HEADER_OUT); //官方文档描述是“发送请求的字符串”,其实就是请求的 header 。这个就是直接查看请求 header,因为上面允许查看 curl_close($ch); return $result; } echo get2("http://XXX.XXX.Xxx.211/eags/api/fsds/v1.0/school-roll/search?id=1&name=12&pId=123&level=0", $headers); 下图是打印的 php 的 header 。 1 czhuyu 2021-07-09 11:28:36 +08:00 可以抓包对比下看看 |
2 b4115Z4mRAz9P8EA 2021-08-01 18:15:25 +08:00 $stringToSign 、hash_hmac("sha256", $stringToSign....)这两个值,与 java 生成的两个值,都一样吗? |