php实现快递进度
实现快递进度查询的PHP方法
使用快递鸟API
快递鸟提供物流查询API接口,支持多家快递公司。需注册账号获取API Key和商户ID。
// 配置参数
$appKey = '你的AppKey';
$ebusinessID = '你的商户ID';
$requestData = json_encode([
'ShipperCode' => '快递公司编码',
'LogisticCode' => '快递单号'
]);
// 生成数据签名
$dataSign = urlencode(base64_encode(md5($requestData . $appKey)));
// 请求API
$url = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
$postData = [
'RequestData' => urlencode($requestData),
'EBusinessID' => $ebusinessID,
'RequestType' => '1002',
'DataSign' => $dataSign,
'DataType' => '2'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
// 处理返回结果
$resultArray = json_decode($result, true);
if(isset($resultArray['Traces'])) {
foreach($resultArray['Traces'] as $trace) {
echo $trace['AcceptTime'] . ': ' . $trace['AcceptStation'] . "\n";
}
}
使用快递100API
快递100也提供物流查询接口,需申请API Key。
$customer = '你的客户编码';
$key = '你的授权Key';
$com = '快递公司代码';
$num = '快递单号';
$url = "http://api.kuaidi100.com/api?id={$customer}&com={$com}&nu={$num}&show=0&muti=1&order=desc";
$sign = md5($url . $key);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . '&sign=' . $sign);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$result = json_decode($output, true);
if($result['message'] == 'ok') {
foreach($result['data'] as $item) {
echo $item['time'] . ': ' . $item['context'] . "\n";
}
}
自行解析快递公司官网
对于不支持API的快递公司,可通过爬取官网信息实现。
function querySFExpress($trackingNumber) {
$url = "https://www.sf-express.com/sf-service-owf-web/order/orderTrack?lang=sc®ion=cn&trackingNumber={$trackingNumber}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if(isset($data['data']['routes'])) {
foreach($data['data']['routes'] as $route) {
echo $route['acceptTime'] . ': ' . $route['acceptAddress'] . ' - ' . $route['remark'] . "\n";
}
}
}
数据库存储快递信息
对于频繁查询的快递单号,建议缓存结果到数据库。
// 存储查询结果
function saveTrackingInfo($trackingNumber, $carrier, $data) {
$pdo = new PDO('mysql:host=localhost;dbname=courier', 'username', 'password');
$stmt = $pdo->prepare("REPLACE INTO tracking_info (tracking_number, carrier, data, last_updated) VALUES (?, ?, ?, NOW())");
$stmt->execute([$trackingNumber, $carrier, json_encode($data)]);
}
// 从数据库获取
function getTrackingInfo($trackingNumber) {
$pdo = new PDO('mysql:host=localhost;dbname=courier', 'username', 'password');
$stmt = $pdo->prepare("SELECT data FROM tracking_info WHERE tracking_number = ? AND last_updated > DATE_SUB(NOW(), INTERVAL 1 HOUR)");
$stmt->execute([$trackingNumber]);
return $stmt->fetchColumn();
}
注意事项
- 所有API都需要注册获取授权密钥
- 注意处理API调用频率限制
- 建议对查询结果进行缓存,避免频繁请求
- 错误处理应包括网络超时、API限制等情况
- 快递公司编码需与API文档中的代码一致







