Python版FedEx包裹查询脚本转PHP报错UNSUPPORTED.ACTION求解决方案
FedEx快递免API注册PHP查询实现方案
问题根因
你提交的代码存在两处核心错误:
- 请求头参数错误:该FedEx公开查询接口要求提交表单格式数据,你错误设置
Content-Type: application/json,导致服务端无法解析请求参数 - 编码逻辑错误:仅
data字段对应的请求结构体需要做JSON序列化,其余action、locale、version等均为普通表单参数,你错误将整个请求数组做了JSON序列化,导致服务端无法识别action参数,返回UNSUPPORTED.ACTION错误。
修正后可运行代码
<?php $dir = __DIR__; include $dir . '/vendor/autoload.php'; $tracking_number = '123456789'; // 替换为实际快递单号 $url = 'https://www.fedex.com/trackingCal/track'; // 构造data字段单独JSON序列化 $trackRequest = [ 'TrackPackagesRequest' => [ 'appType' => 'wtrk', 'uniqueKey' => '', 'processingParameters' => [ 'anonymousTransaction' => true, 'clientId' => 'WTRK', 'returnDetailedErrors' => true, 'returnLocalizedDateTime' => false ], 'trackingInfoList' => [ [ 'trackNumberInfo' => [ 'trackingNumber' => $tracking_number, 'trackingQualifier' => '', 'trackingCarrier' => '' ] ] ] ] ]; // 构造完整表单参数 $postData = [ 'data' => json_encode($trackRequest), 'action' => 'trackpackages', 'locale' => 'en_US', 'format' => 'json', 'version' => 99 ]; // 发送请求,无需自定义Content-Type,Requests库会自动适配表单格式 $response = Requests::post($url, [], $postData); // 解析返回结果 $result = json_decode($response->body, true); if (isset($result['TrackPackagesResponse']['packageList'][0])) { $packageInfo = $result['TrackPackagesResponse']['packageList'][0]; $fedex_status = $packageInfo['keyStatus']; $fedex_details = $packageInfo['statusWithDetails']; $delivery_date = $packageInfo['displayActDeliveryDt'] ?? ''; $delivery_time = $packageInfo['displayActDeliveryTm'] ?? ''; // 测试输出 var_dump($fedex_status, $fedex_details, $delivery_date, $delivery_time); } else { echo "查询失败,无对应快递信息"; }
注意事项
- 若需要查询国内FedEx单号,可将
locale参数修改为zh_CN,返回内容会自动适配中文 - 该接口为FedEx公开查询页面使用的后端接口,无需注册官方开发者账号即可调用,请注意控制调用频率避免被IP限制。
内容的提问来源于stack exchange,提问作者Frank Jance
相关产品推荐
相关产品推荐

