PHP实现Fedex Rates and Transit Times API时遇401未授权错误
问题现象
用PHP的file_get_contents()调用Fedex Rates and Transit Times沙箱API时,返回HTTP/1.1 401 Unauthorized错误,但相同的访问令牌和账户ID在Postman里能正常请求。
代码中的核心问题
- 请求头格式错误:
header参数应该是字符串数组,原代码把多个header写在一个字符串里,导致HTTP头解析异常,Authorization令牌无法被正确识别。 - 请求体格式不匹配:Fedex API要求接收JSON格式的请求体,但原代码把JSON解码后用
http_build_query()转成了URL编码的表单数据,这不符合API的接收要求,同时会破坏原JSON的嵌套结构。 - 令牌占位符拼写错误:
ACESS_TOKEN_HERE少写了一个C,应该是ACCESS_TOKEN_HERE(虽为占位符,但拼写错误可能导致复制时出错)。
修正后的代码
<?php $url = "https://apis-sandbox.fedex.com/rate/v1/rates/quotes"; // 保留原始JSON字符串,无需解码后再处理 $rawdatajson = '{ "accountNumber": { "value": "XXXXX7020" }, "requestedShipment": { "shipper": { "address": { "postalCode": 65247, "countryCode": "US" } }, "recipient": { "address": { "postalCode": 75063, "countryCode": "US" } }, "pickupType": "DROPOFF_AT_FEDEX_LOCATION", "serviceType": "FEDEX_2_DAY", "rateRequestType": [ "PREFERRED" ], "preferredCurrency": "CAD", "requestedPackageLineItems": [ { "weight": { "units": "LB", "value": 10 } } ] } }'; // 替换为你的有效访问令牌 $accessToken = "YOUR_VALID_ACCESS_TOKEN"; $options = [ 'http' => [ 'method' => 'POST', // 每个请求头单独作为数组元素 'header' => [ "Authorization: Bearer {$accessToken}", "Content-Type: application/json", "x-customer-transaction-id: 624deea6-b709-470c-8c39-4b5511281490", "x-locale: en_US" ], // 直接使用原始JSON作为请求体 'content' => $rawdatajson ] ]; $context = stream_context_create($options); // 捕获可能的错误,方便调试 $resp_json = @file_get_contents($url, false, $context); if ($resp_json === false) { $error = error_get_last(); var_dump($error); } else { $response_data = json_decode($resp_json); var_dump($response_data); } ?>
关键修改说明
- 请求头改为数组:确保每个HTTP头被正确解析,Authorization令牌能被Fedex服务器识别。
- 请求体直接用原始JSON:避免解码再转码导致的格式错误,符合API要求的
application/json格式。 - Content-Type修正为application/json:原代码用了
application/x-www-form-urlencoded,这和API接收格式不符。 - 增加错误捕获:用
@屏蔽警告,同时通过error_get_last()获取详细错误信息,方便调试。
内容的提问来源于stack exchange,提问作者Mohsin Aziz
相关产品推荐
相关产品推荐

