使用快递100的服务,网址:http://www.kuaidi100.com/
其实快递100有专门提供快递物流信息查询的API,只不过要申请,如下:
那现在我只需要,提供快递公司和快递单号得到物流信息这个功能。
正好发现,使用快递100的官网首页查询的话,没有其他多余的限制,所以就能够利用起来,做成免费且没有查询次数限制的接口了。
代码
利用其官网的首页查询接口,将信息拼成url,直接curl获取内容,其中发现还有一层限制就是UA的现在,所以在curl需要设置下UA。
<?php
/**
* 快递100查询类
*/
class express
{
public $company = array('ems','shunfeng');
public function query($company,$no){
$return_data = array();
if (in_array($company, $this->company)) {
$url = "http://www.kuaidi100.com/query?type=$company&postid=$no&id=1.html";//快递100
$res = $this->curl($url);
if($res){
$data = json_decode($res,true);
if(empty($data)||!is_array($data)) return false;
$return_data['state'] = $data['state'];
$return_data['status'] = $data['status'];
$return_data['message'] = $data['message'];
$return_data['list'] = array();
if(!empty($data['data'])){//查询成功
foreach ($data['data'] as $k => $v) {
$return_data['list'][$k]['time'] = $v['time'];
$return_data['list'][$k]['context'] = $v['context'];
}
}
$query_id = $company.'_'.$no;
$query_info = '';//从缓存中取 根据query_id
if($return_data['status'] == 200){
if(empty($query_info)){//插入
$query_info = serialize($return_data);
//写入缓存
}else{
$query_info = serialize($return_data);
//更新缓存
}
}else{
if(!empty($query_info)){
$return_data = unserialize($query_info);
}
}
return $return_data;
}
}
return false;
}
private function curl($url){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$UserAgent = 'Mozilla/4.0 ....';//UA
curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
}
因为这个接口的不稳定性,所以我做了一个查询的缓存。其实可以做的更精细一点,比如收货了就不在继续查询了,直接从缓存中获取内容等等,这些自行考虑。
这里就是个简单的例子,如果要追求接口性能,接口稳定性,实时性等等的话,还是花钱买个企业版吧,over