我一直在尝试用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。
我以为至少会有某种错误或警告。
如有任何意见,我们将不胜感激。
2条答案
按热度按时间dsekswqp1#
看这个:PHP cURL custom headers
nafvub8i2#
感谢大家的精彩投入!
我是CURL的新手,所以请原谅我没有认识到这些错误。
我把Sammitch的评论和Walter KT的回答结合起来。
Sammitch是正确的:响应是gzip编码的。我在我的函数中添加了
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
,最后得到了响应(有一些方便的错误需要处理)。我还去掉了build_post_fields()函数。