Curl和FedEx API在PHP中响应乱码

dsf9zpds  于 2022-12-10  发布在  PHP
关注(0)|答案(2)|浏览(270)

我一直在尝试用PHP脚本实现FedEx费率和中转时间API。我成功地与它连接以获取不记名令牌。但当我尝试获取简单货物的费率时,它的响应是随机的胡言乱语。
我甚至没有得到任何错误。这是什么沮丧。
下面是我的代码:

ini_set('display_errors', 1); 
error_reporting(-1);

$access_url = 'https://apis-sandbox.fedex.com/oauth/token';
    $access_headers = ['Content-Type' => 'application/x-www-form-urlencoded'];
    $access_fields = "grant_type=client_credentials&client_id=...&client_secret=...";
    
    $resp = curl_me($access_url, $access_headers, $access_fields);
    
    $access_token = json_decode($resp)->access_token;

    $rate_url = 'https://apis-sandbox.fedex.com/rate/v1/rates/quotes';
    $rate_hdrs =  [
        'Authorization' => 'Bearer '.$access_token,
        'X-locale' => 'en_US',
        'Content-Type' => 'application/json'
    ];
        
    $rate_flds = '{
        "accountNumber": {
            "value": "..."
        },
        "requestedShipment": {
            "shipper": {
                "address": {
                    "streetLines": [
                        "..."
                    ],
                    "city": "...",
                    "stateOrProvinceCode": "...",
                    "postalCode": "...",
                    "countryCode": "US",
                    "residential": false
                }
            },
            "recipient": {
                "address": {
                    "postalCode": "...",
                    "countryCode": "US"
                }
            },
            "shipDateStamp": "2022-12-06",
            "pickupType": "DROPOFF_AT_FEDEX_LOCATION",
            "requestedPackageLineItems": [{
                "declaredValue": {
                    "amount": 123,
                    "currency": "USD"
                },
                "weight": {
                    "units": "LB",
                    "value": 12
                },
                "dimensions": {
                    "length": 12,
                    "width": 12,
                    "height": 12,
                    "units": "IN"
                }
            }],
            "documentShipment": false,
            "packagingType": "YOUR_PACKAGING",
            "groupShipment": true
        },
        "carrierCodes": [
            "FDXE"
        ]
    }';
    
    $field = build_post_fields($rate_flds);
    
    $resp = curl_me($rate_url, $rate_hdrs, $field);
    
    var_dump($resp);

下面是我正在使用的两个函数:
第一次
第二个函数来自Yisrael Dov对this question的回答。
当我使用第一个函数获取访问令牌时,它运行得非常完美,但我不明白为什么第二次使用它时,它的响应是:字符串(176)“********************************
我尝试了各种不同的编码和解码JSON字符串的方法,但每次都得到乱码。
我试过通过各种解码器运行这个胡言乱语,但当然它们都返回NULL。
我以为至少会有某种错误或警告。
如有任何意见,我们将不胜感激。

dsekswqp

dsekswqp1#

$rate_hdrs =  [
    'Authorization: Bearer '.$access_token,
    'X-locale: en_US',
    'Content-Type: application/json',
];

看这个:PHP cURL custom headers

nafvub8i

nafvub8i2#

感谢大家的精彩投入!
我是CURL的新手,所以请原谅我没有认识到这些错误。
我把Sammitch的评论和Walter KT的回答结合起来。
Sammitch是正确的:响应是gzip编码的。我在我的函数中添加了curl_setopt($ch, CURLOPT_ENCODING, "gzip");,最后得到了响应(有一些方便的错误需要处理)。
我还去掉了build_post_fields()函数。

相关问题