快递信息订阅后快递100的服务器会请求callback地址来传递快递信息示例代码如下:
<?php
namespace app\api\controller;
use app\common\controller\Api;
use app\common\model\KuaidiLog;
class Kuaidi extends Api
{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
/**
* 测试绑定快递
* @return void
*
*/
public function poll(){
$res = KuaidiLog::poll('yuantong','YT********818','156*******');
$this->success('获取成功',$res);
}
/**
* 快递100的通知推送
* @return \think\response\Json|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function callback(){
$res = KuaidiLog::callBack($_POST);
if($res){
//给快递100返回处理成功结果
return new \think\response\Json(['result'=>true,'returnCode'=>200,'message'=>'成功']);
}
exit();
}
}
<?php
namespace app\common\model;
use think\Model;
use fast\Http;
class KuaidiLog extends Model
{
/**
* 订阅接口逻辑
* @param $company
* @param $number
* @param $phone
* @return mixed
*/
public static function poll($company,$number,$phone){
$param['company'] = $company;
$param['number'] = $number;
$param['key'] = 'MA*******207';//快递100授权码,请申请企业版获取
//快递100推送地址
$param['parameters']['callbackurl'] = request()->domain()."/api/kuaidi/callback";
$param['parameters']['phone'] = $phone;
$param['parameters']['resultv2'] = '4';
// 请求参数
$post_data = array();
$post_data['schema'] = 'json';
$post_data['param'] = json_encode($param, JSON_UNESCAPED_UNICODE);
$url = 'https://poll.kuaidi100.com/poll'; // 订阅请求地址
// 发送post请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
$data = json_decode($result, true);
return $data;
}
/**
* 通知推送逻辑
* @param $post
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function callBack($post){
$post = json_decode($post['param'],true);
$kuaidigongsi = $post['lastResult']['com'];
$kuaididanhao = $post['lastResult']['nu'];
$lastResult = json_encode($post);
$log = self::where('kuaididanhao',$kuaididanhao)
->where('kuaidigongsi',$kuaidigongsi)
->find();
if(empty($log)){
self::create([
'kuaidigongsi'=>$kuaidigongsi,
'kuaididanhao'=>$kuaididanhao,
'lastResult'=>$lastResult,
'createtime'=>time(),
'updatetime'=>time(),
]);
}else{
$log->lastResult = $lastResult;
$log->updatetime = time();
$log->save();
}
return true;
}
}
KuaidiLog对应的数据表
CREATE TABLE `fa_kuaidi_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '11',
`kuaidigongsi` varchar(255) DEFAULT NULL COMMENT '快递公司:yuantong=圆通,shentong=申通,jtexpress=极兔速递,zhongtong=中通快递,yunda=韵达快递,youzhengguonei=邮政快递包裹,shunfeng=顺丰速运,jd=京东物流',
`kuaididanhao` varchar(255) DEFAULT NULL COMMENT '快递单号',
`lastResult` text COMMENT '最新查询结果',
`createtime` bigint(11) DEFAULT NULL,
`updatetime` bigint(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='快递推送记录';
这样快递就完成了订阅,快递动态就被保存在了fa_kuaidi_log表中,可通过快递单号获取动态用于项目中的展示。