千家信息网

如何使用聚合数据API查询快递数据

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍如何使用聚合数据API查询快递数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本项目的文件因为朋友的网站是用 ThinkPHP 写的,为了保持将来代码的兼容,
千家信息网最后更新 2024年11月20日如何使用聚合数据API查询快递数据

这篇文章主要介绍如何使用聚合数据API查询快递数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

本项目的文件

因为朋友的网站是用 ThinkPHP 写的,为了保持将来代码的兼容,这三个功能也用 ThinkPHP 写成。

项目的所有文件都放在了 GitHub 上,部分敏感数据已经隐藏,你需要自行替换,地址如下:

GitHub 地址:使用聚合数据API查询快递数据-短信验证码-企业核名

因为这三个功能并不是正式产品,将来会需要嵌入到网站的各个功能模块中去,所以为了查看起来方便,三个功能的代码都写在一个文件里,你只要重点关注以下几个文件就好:

/Home/Conf/config.php 参数配置文件 /Home/Controller/IndexController.class.php 后端代码、API的请求与处理 /Home/View/Index_index.html 前端 html

申请 KEY 和阅读开发文档

分别到上面两家网站上找到"快递"、"短信"、"核名"的文档地址,根据里面的说明,把 KEY、URL 等信息放入配置文件Home/Conf/config.php,方便后面重复使用。

常用快递API文档

短信API文档

核名-文档

注意 短信的 API 服务,要先到网站的后台添加"短信模板",让管理员审核后才可以正常调用

最后,Home/Conf/config.php 配置文件里的内容如下:

return array(    // 快递查询    'EXPRESS_APP_KEY' => '你的快递 APPKEY',    'EXPRESS_QUERY_URL' => 'http://v.juhe.cn/exp/index', //快递单号查询    'EXPRESS_COM_URL' => 'http://v.juhe.cn/exp/com', //快递公司查询    // 发短信    'SEND_SMS_KEY' => '你的短信接口 APPKEY',    'SEND_SMS_URL' => 'http://v.juhe.cn/sms/send',    // 核名    'COMPANY_KEY' => '核名 APPKEY',    'COMPANY_URL' => 'http://eci.yjapi.com/ECIFast/Search',    //数据库配置信息    'DB_TYPE'   => 'mysql', // 数据库类型    'DB_HOST'   => 'localhost', // 服务器地址    'DB_NAME'   => '你的数据库名', // 数据库名    'DB_USER'   => '你的数据库用户名', // 用户名    'DB_PWD'    => '密码', // 密码    'DB_PORT'   => 3306, // 端口    'DB_PREFIX' => 'pre_', // 数据库表前缀     'DB_CHARSET'=> 'utf8', // 字符集);

设置数据库

为了防止恶意用户利用暴露在外的短信接口捣乱,需要对每个手机号码的行为进行记录。例如:

向某个手机号码发送短信验证码后, 60 秒内不能再次发送 必须在 1 小时内填写短信验证码,否则会过期 避免 ajax 请求地址被机器人程序利用,在表单里要使用图片验证码才能提交数据 关于"表单验证码"我们后面代码会说明,这里先创建表结构如下,用于记录短信发送记录:

CREATE TABLE `pre_smsrecord` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `mobile` varchar(11) NOT NULL DEFAULT '',  `tpl_id` int(11) NOT NULL,  `code` int(6) NOT NULL,  `time` int(11) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=M

mobile 是手机号码 tpl_id是在网站后台添加并通过审核的短信模板 code是发送的验证码(一般是4位或6位) time是发送时间戳 直接下载sql进行还原:在本项目的 GitHub 地址上也可以直接从 /Pubic 目录找到 sql 文件,你可以直接把它还原你的 MySQL 上。

表单验证码的实现

因为三个功能都需要表单验证码,所以首先实现它。

打开 /Home/View/Index_index.html,注意里面图片验证码 img 标签,以及对应的 javascript

(通用)输入验证码 刷新

对应的后端代码在 /Home/Controller/IndexController.class.php 中

/*** +--------------------------------------------------------------------------* 生成验证码** +--------------------------------------------------------------------------*/public function verify(){    $Verify = new \Think\Verify();    $Verify->entry();}/*** +--------------------------------------------------------------------------* 检查验证码** @param string $code 输入的验证码* @return boolean* +--------------------------------------------------------------------------*/protected function check_verify($code){    $verify = new \Think\Verify();    return $verify->check($code);}

通用的 Curl 方法,用来向第三方网站的 API 发起请求并获取返回值

因为 3 个功能实际上都是通过网络来请求一个第三方网站的 API 接口地址,因此可以统一成一个通用的方法。代码如下,可以传入三个变量,分别为 :url、参数数组、请求方式(是否是post,默认为0),返回一个 json 格式的数据。

/*** +--------------------------------------------------------------------------* 通用的"聚合数据"请求接口,返回JSON数据** @param string $url 接口地址* @param array $params 传递的参数* @param int $ispost 是否以POST提交,默认GET* @return json* +--------------------------------------------------------------------------*/public function juhecurl($url,$params=false,$ispost=0){    $httpInfo = array();    $ch = curl_init();    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );    curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' );    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 30 );    curl_setopt( $ch, CURLOPT_TIMEOUT , 30);    curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );    if( $ispost )    {        curl_setopt( $ch , CURLOPT_POST , true );        curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );        curl_setopt( $ch , CURLOPT_URL , $url );    }    else    {        if($params){            curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );        }else{            curl_setopt( $ch , CURLOPT_URL , $url);        }    }    $response = curl_exec( $ch );    if ($response === FALSE) {          //echo "cURL Error: " . curl_error($ch);        return false;    }    $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );    $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );    curl_close( $ch );    return $response;}

后面我们获取快递数据、发送短信、查询企业名称,都可以调用这个通用的方法。

获取快递数据列表的实现

打开 /Home/View/Index_index.html

获取快递数据

选择公司

输入单号

返回结果:

快件动态:

对应的后端代码为如下,特别注意,你要把 this->juhecurl(C("EXPRESS_QUERY_URL"), $params, 1); 这段的注释去掉(因为我开发的时候查询余额不足,所以使用了一个写死的数组来让程序能正常运行)

/** * +--------------------------------------------------------------------------* 获取快递数据** @param string $get.company 快递公司代码* @param string $get.number 快递单号* @return json* +--------------------------------------------------------------------------*/public function getExpressData(){    // 传入 get 参数,包括公司代号、快递单号、验证码    $com    = I("get.company");    $no     = I("get.number");    $verify = I("get.verify");    // 处理验证码    if ( !$this->check_verify($verify) ) {        $content = array('resultcode'=>1000, 'reason'=>'验证码填写错误');        echo json_encode($content);        exit();    }    // 处理机器人程序刷接口(目前通过IP判断)    $ip = get_client_ip(0, true);    $Record = M("expressrecord");    $express_record = $Record->where("ip='" . $ip . "'")->find();    if( $express_record && ( (time() - $express_record['time']) < 60 ) ){        echo json_encode(array('reason'=>'60秒内只能查询一次'));        exit();    }    if ( $com && $no ) {        $params = array(            'key' => C("EXPRESS_APP_KEY"),            'com'  => $com,            'no' => $no        );        // 开发测试阶段直接返回值,不请求 API        // $content = $this->juhecurl(C("EXPRESS_QUERY_URL"), $params, 1);        $content = array('resultcode'=>200, 'reason'=>'查询成功', 'result'=>array('list'=>array()));        // 删除旧记录(如果有),然后添加新的记录        $Record->where("ip='" . $ip . "'")->delete();        $data = array(            'ip' => $ip,            'time'=>time()        );        $Record->add($data);        //$returnArray = json_decode($content,true);        echo json_encode($content, true);    }}

短信验证码的发送和检验

废话不多说,前端html直接上代码。这里实际上有两个动作,一个是"给我手机号码 xxxxx 发个验证码",另一个是"我已经收到了,并填写了,请看我填写的验证码对不对"。

发送短信验证码与检查

短信模板:

手机号码:

输入手机验证码:

0