V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
madpecker009
V2EX  ›  PHP

关于 PHP curl 请求 header 的问题。困扰了我一整天了!

  •  
  •   madpecker009 · 2021-06-29 09:49:55 +08:00 · 1425 次点击
    这是一个创建于 1276 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们调用的是大华的接口,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 。
    

    czhuyu
        1
    czhuyu  
       2021-07-09 11:28:36 +08:00
    可以抓包对比下看看
    yqf0215
        2
    yqf0215  
       2021-08-01 18:15:25 +08:00
    $stringToSign 、hash_hmac("sha256", $stringToSign....)这两个值,与 java 生成的两个值,都一样吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3125 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:36 · PVG 21:36 · LAX 05:36 · JFK 08:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.