技术更新迭代,但总能有迹可循。
无休止的造轮子,早已让人精疲力竭。
自己跳过的坑,分享最终的成果,只为让痛苦不再重复。
商城项目中,需要根据订单号查询物流信息。经过自己的快递单号评测,最终选中快递鸟平台。
1 需要到快递鸟平台申请账号。获取后台的ID和加密私钥。
2 根据官方提供的demo,集成自己的类库。
3 后台调用,前台渲染结果。
快递鸟开发文档 快递鸟开发文档
apache和mysql和php5.6
框架:thinkphp5.0
电商ID和加密私钥可以做成配置文件
//快递鸟平台,根据快递号和快递公司码,查询快递信息
class BirdExpress
{
private $EBusinessID; //电商ID
private $AppKey; //电商加密私钥,快递鸟提供,注意保管,不要泄漏
private $ReqURL; //请求ur1填写你的账号数据
public function __construct()
{
//进行配置信息的替换
$this->EBusinessID = "";
$this->AppKey = "";
$this->ReqURL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
}
/**
* 核心方法
* Json方式 查询订单物流轨迹
* @param string $ShipperCode 快递公司编码
* @param string $LogisticCode 物流单号
* @param int $arrayFlag 是否进行数组转化标志 默认0:否 1:转化
* 参考规则举例:
* $requestData = "{'OrderCode':'','ShipperCode':'ZTO','LogisticCode':'640041334612'}";
* @return result 包含即时物流信息的 Json数据
* * status
* 0:物流单号暂无结果;
* 3:在途,快递处于运输过程中;
* 4:揽件,快递已被快递公司揽收并产生了第一条信息;
* 5:疑难,快递邮寄过程中出现问题;
* 6:签收,收件人已签收;
* 7:退签,快递因用户拒签、超区等原因退回,而且发件人已经签收;
* 8:派件,快递员正在同城派件;
* 9:退回,货物处于退回发件人途中;
*/
public function getOrderTracesByJson($ShipperCode = "",$LogisticCode = "",$arrayFlag = 0)
{
$requestData = "{
'OrderCode':'',
'ShipperCode':'$ShipperCode',
'LogisticCode':'$LogisticCode'
}";
$postData = array(
'EBusinessID' => $this->EBusinessID,
'RequestType' => '1002',//接口指令1002
'RequestData' => urlencode($requestData),
'DataType' => '2',
);
$postData['DataSign'] = $this->encrypt($requestData, $this->AppKey);
$result = $this->sendPost($this->ReqURL, $postData);
//根据公司业务处理返回的信息......
if ($arrayFlag){
$result = json_decode($result,true);
//TODO 方便物流信息的倒序展示,进行数组反转
$result['Traces'] = array_reverse($result['Traces']);
}
return $result;
}
/**
* 电商Sign签名生成
* @param data 内容
* @param appkey Appkey
* @return DataSign签名
*/
private function encrypt($data, $appkey) {
return urlencode(base64_encode(md5($data.$appkey)));
}
/**
* post提交数据
* @param string $url 请求Url
* @param array $datas 提交的数据
* @return url响应返回的html
*/
private function sendPost($url, $datas) {
$temps = array();
foreach ($datas as $key => $value) {
$temps[] = sprintf('%s=%s', $key, $value);
}
$post_data = implode('&', $temps);
$url_info = parse_url($url);
if(empty($url_info['port']))
{
$url_info['port']=80;
}
$httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";
$httpheader.= "Host:" . $url_info['host'] . "\r\n";
$httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";
$httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";
$httpheader.= "Connection:close\r\n\r\n";
$httpheader.= $post_data;
$fd = fsockopen($url_info['host'], $url_info['port']);
fwrite($fd, $httpheader);
$gets = "";
$headerFlag = true;
while (!feof($fd)) {
if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {
break;
}
}
while (!feof($fd)) {
$gets.= fread($fd, 128);
}
fclose($fd);
return $gets;
}
}
快递鸟有快递公司对应码的excel表,通过php工具类导入到mysql表中
public function getBirdExpress()
{
//根据快递公司查找表得到,快递码
$kuaidiName = '圆通速递';
$ShipperCode = Db::name('xbird_express')->where('name',$kuaidiName)->value('code');
//单号
$LogisticCode = "************";
$express = new BirdExpress();
$expressData = $express->getOrderTracesByJson($ShipperCode,$LogisticCode,1);
return $expressData;
}
可以自己根据返回数据,渲染前台模板
array(6) {
["LogisticCode"] => string(15) "*********"
["ShipperCode"] => string(3) "YTO"
["Traces"] => array(11) {
[0] => array(2) {
["AcceptStation"] => string(156) "客户签收人: *** 已签收 感谢使用圆通速递,期待再次为您服务 如有疑问请联系:1523***835,投诉电话:*******"
["AcceptTime"] => string(19) "2020-01-16 17:09:02"
}
[1] => array(2) {
["AcceptStation"] => string(98) "****小区圆通代办点***驿站已发出自提短信请上门自提联系电话185****490"
["AcceptTime"] => string(19) "2020-01-16 09:00:51"
}
[2] => array(2) {
["AcceptStation"] => string(77) "快件已到达****小区圆通代办点***驿站联系电话185****0490"
["AcceptTime"] => string(19) "2020-01-16 07:52:57"
}
[3] => array(2) {
["AcceptStation"] => string(49) "【河南省郑州市******公司】 已收入"
["AcceptTime"] => string(19) "2020-01-16 07:45:53"
}
[4] => array(2) {
["AcceptStation"] => string(84) "【郑州转运中心】 已发出 下一站 【河南省郑州市*****公司】"
["AcceptTime"] => string(19) "2020-01-15 22:18:26"
}
[5] => array(2) {
["AcceptStation"] => string(40) "【郑州转运中心公司】 已收入"
["AcceptTime"] => string(19) "2020-01-15 21:57:06"
}
[6] => array(2) {
["AcceptStation"] => string(75) "【义乌转运中心】 已发出 下一站 【郑州转运中心公司】"
["AcceptTime"] => string(19) "2020-01-15 00:51:08"
}
[7] => array(2) {
["AcceptStation"] => string(40) "【义乌转运中心公司】 已收入"
["AcceptTime"] => string(19) "2020-01-15 00:25:12"
}
[8] => array(2) {
["AcceptStation"] => string(90) "【浙江省金华市义乌市洪华】 已发出 下一站 【义乌转运中心公司】"
["AcceptTime"] => string(19) "2020-01-15 00:15:18"
}
[9] => array(2) {
["AcceptStation"] => string(55) "【浙江省金华市义乌市****公司】 已打包"
["AcceptTime"] => string(19) "2020-01-15 00:12:46"
}
[10] => array(2) {
["AcceptStation"] => string(90) "【浙江省金华市义乌市***公司】 已收件 取件人: **** (185*****134)"
["AcceptTime"] => string(19) "2020-01-15 00:07:28"
}
}
["State"] => string(1) "3"
["EBusinessID"] => string(7) "*******"
["Success"] => bool(true)
}
我申请的是快递鸟的体验账号。
限500次/天(即时查询 仅支持3家申通、圆通、中通)
不限调用量(电子面单)
如果大家的业务需要,也可以升级。