快递100接口的调用过程

前言

    大部分的商城都需要调用快递的接口来记录商城的物流信息,这里就给出一种快递接口(快递100)调用的方法。

正文

一、官方文档

1. 官方文档的地址为:
https://www.kuaidi100.com/openapi/api_subscribe.shtml

二、具体实现

1. 商城服务与快递接口服务具体交互示意图:

    具体的实现逻辑为:

    我们将订单号发给快递100,然后订阅该订单号的消息。当快递100中有订阅信息产生的时候,就会给指定的地址发一个消息去推送类似的消息。

  贵公司将需要跟踪的运单提交给快递100指定的接口,快递100接到后就对这些单号进行监控,如果监控到运单有了更新,就主动将这些物流跟踪信息推送到贵公司指定的接口,
直到这些单的生命周期结束(一般以“已签收”为准),一个运单快递100一般会多次推送多条跟踪信息,贵方将之保存到数据库。当用户登录贵方网站、系统或手机APP时,
直接从贵司的数据库读取数据,并显示于贵方的网站、系统或手机APP。
2. 代码实现

(1)订阅某个订单信息

    public static function subscribeExpress($courier_company, $courier_no){$data = ['company' => $courier_company,'number' => $courier_no,'key' => config('express_config.poll_key'),'parameters' => ['callbackurl' => env('API_HOST', 'http://panda.qujie8.com/') . 'api/alipay/express/notify','departureCountry' => 'CN']];$post_data = ['schema' => 'json','param' => json_encode($data),];Log::info('订阅快递100参数', [$post_data]);$o = '';foreach ($post_data as $k => $v) {$o .= "$k=" . urlencode($v) . '&';//默认UTF-8编码格式
        }$post_data = substr($o, 0, -1);$url = env('EXPRESS_PUST_URL', 'http://poll.kuaidi100.com/poll');$ch = curl_init();curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);$rst = curl_exec($ch);curl_close($ch);Log::info('订阅快递100结果', [$rst]);$rst = json_decode($rst, 1);Log::info('订阅快递100结果', [$rst]);if ($rst['result'] == false) {if ($rst['returnCode'] == 501) {Log::info('订阅快递100重复', [$rst, 'company' => $courier_company, 'courier_no' => $courier_no]);return true;}throw new ServiceException('订阅快递100失败', $rst['returnCode']);}return true;}

(2)接收每个订单信息的回调

    /*** 快递100回调*/public static function notifyExpressInfo($poll_express_info){$company = array_get($poll_express_info['lastResult'], 'com');$number = array_get($poll_express_info['lastResult'], 'nu');$borrow_express_type = FrontConst::BORROW_EXPRESS_TYPE_BORROW;$borrow_info = Borrow::where('business_courier_company_name', $company)->where('business_courier_no', $number)->first();if (empty($borrow_info)) {$borrow_express_type = FrontConst::BORROW_EXPRESS_TYPE_RETURN;$borrow_info = Borrow::where('courier_company_name', $company)->where('courier_no', $number)->first();}if (!empty($borrow_info)) {if ($borrow_info->status == FrontConst::STATUS_BORROW_DONE_RETURN) {\Log::info('---快递100传输已完成的订单号--', ['borrow_id' => $borrow_info->id, 'status' => $borrow_info->status, 'business_courier_no' => $borrow_info->business_courier_no, 'Request_courier_no' => $number]);throw new ServiceException('此单号已还书完成无需操作', -2000);}}if (empty($borrow_info)) {throw new ServiceException('没有该订单匹配的物流单号', -1000);}$express_last_info = array_get($poll_express_info, 'lastResult');if (empty($express_last_info)) {throw new ServiceException('没有最新快递物流信息', -1000);}$ischeck = array_get($express_last_info, 'ischeck');try {DB::beginTransaction();$express_data = array_reverse($express_last_info['data']);foreach ($express_data as $key => $value) {//查询该快递信息是否已经录入$borrow_express = BorrowExpress::where('borrow_id', $borrow_info->id)->where('ftime', $value['ftime'])->first();if (empty($borrow_express)) {$express_info = ['ischeck' => $ischeck,'state' => ExpressConst::$expressState[$express_last_info['state']],'ftime' => $value['ftime'],'content' => $value['context'],'control_status' => ExpressConst::$expressStatus[$poll_express_info['status']],'control_message' => $poll_express_info['message'],];//增加快递信息self::addExpress($borrow_info->id, $borrow_info->borrow_source, $borrow_info->status, $express_info, $borrow_express_type);}}//快递被签收if ($ischeck == 1 && $borrow_express_type == FrontConst::BORROW_EXPRESS_TYPE_BORROW) {$borrow_info->status = FrontConst::STATUS_BORROW_RECEIPT_DELIVERY;//修改订单dead_line,支付宝小程序不需要修改if ($borrow_info->borrow_source != FrontConst::SOURCE_ALIPAY_APPLETS) {$dead_line_info = BorrowRepository::getBorrowDeadOverdue($borrow_info);$borrow_info->dead_line = empty($dead_line_info['dead_line']) ? $borrow_info->dead_line : $dead_line_info['dead_line'];}$borrow_info->save();$return_time = strtotime($borrow_info->dead_line);if ($borrow_info->borrow_source == FrontConst::SOURCE_ALIPAY_APPLETS) {$return_time -= FrontConst::APPLETS_RENTS_EXPRESS_RETURN_TIME * 3600 * 24;}if ($borrow_info->borrow_source == FrontConst::SOURCE_ALIPAY) {//判断是否是信用借还$notify_alipay_status = true;$user_package = $borrow_info->user_package;$package_info = empty($user_package->book_package) ? $user_package->package : $user_package->book_package;$notify_alipay_status = (!empty($user_package->book_package)) ? true : ($package_info->subscribe_times > 1 ? false : true);//通知支付宝修改订单时间if ($notify_alipay_status) {BorrowRepository::orderRentModify($borrow_info, $dead_line_info['dead_line']);\Log::info('该订单' . $borrow_info->id . '使用的是' . $package_info->name . ',不需要修改到期时间', ['id' => $borrow_info->id]);}}self::addExpress($borrow_info->id, $borrow_info->borrow_source, $borrow_info->status);//发送短信SmsEntrance::sendCodeByScene($borrow_info->mobile, SmsEntrance::SCENES_USER_BORROW_RECEIPT, date('m', $return_time), date('d', $return_time));}DB::commit();} catch (ServiceException $e) {DB::rollBack();Log::error($e);throw new ServiceException($e->getMessage(), $e->getCode());} catch (Exception $e) {DB::rollBack();Log::error($e);throw new ServiceException($e->getMessage(), $e->getCode());}return true;}

后记

    日子要一天一天的过,知识要一点一点的积累。

转载于:https://www.cnblogs.com/cjjjj/p/11016560.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搞懂开源框架设计思想真的这么重要吗?终获offer

正文 从我个人的角度写写30多岁码工的感受:的确是受年龄压力开始增大了。比如二十多岁的小年轻,可能什么都懂,对组里的东西很熟悉。有时候我也怀疑自己是不是智商不够,是不是自学能力太差,是不是基础不行,…

真香定律!Android动态换肤实现原理解析,吐血整理

自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils、DbUtils、ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的。最近决定研究一下xUtils的源码,用了这么久总得知道它的实现原理吧。我是先从先从BitmapUtils模块开始的。…

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采…

真香定律!一文带你搞懂Android多线程Handler,成功入职腾讯

Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support 包被整合进了 Jetpack,例如上图 Foundatio…

真香警告!2021Android高级面试题,挥泪整理面经

前言 这是“拔剑金九银十”的第二篇文章,本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理。 希望可以对你们有所帮助。不多废话,进入正题。 目录: Java中高级 计算机网络 Android高级面试—性能优化 Android优秀第三方…

冗余的阿里云实例开启和停止API

停止使用的API URL:https://api.aliyun.com/?spm5176.12818093.resource-links.dapi_platform.488716d0OrHCwQ#/?productEcs&version2014-05-26&apiStopInstance&tabDEMO&langJAVA 启动实例: URL:https://api.aliyun.com/?spm5176.12818093.re…

知乎大V推荐!面试官6个灵魂拷问,原理+实战+视频+源码

概述 想了很久怎么样可以让文章的标题不那么悲观,但是各种文案都在我脑海里面不断的被否定,要么是不那么抓眼球,要么是立意不匹配。最后想了想,这个标题是真的符合我最近的感悟。 希望看过文章,能有同感的朋友也能多…

Windows10家庭版安装Docker Desktop(非Docker Toolbox)

现在大部分笔记本预装的都是win10家庭版,而家庭版又不支持Hyper-V,Docker Desktop是无法直接安装的。但其实家庭版是可以通过脚本开启Hyper-V来安装Docker Desktop的。下面就教大家如何操作。 开启Hyper-V 添加方法非常简单,把以下内容保存…

阿里P7手把手教你!阿里P7级别面试经验总结,搞懂这些直接来阿里入职

什么是中年危机 根据权威数据显示,国内IT程序员鼎盛时期是在25-27岁左右,30岁对于程序员而言完全是一个38线,接着就是转业转岗的事情,这一点在业界也算是一个共识了。 大学毕业步入IT行业普遍年龄也是在22岁左右,然而…

自适应阈值化操作:adaptiveThreshold()函数

在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处&#xf…

阿里P8亲自教你!Activity的6大难点,你会几个?年薪50W

前言 网上有很多对程序员简历的一些指导,这里就不重述,大家可以搜下网上其他大神的总结,结合自身情况修改下。我有几点建议: 1.尽量不要花哨,程序员和设计师或者产品运营还不一样,我们的简历成功与否决定…

为什么选用NACOS

Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如…

Qt样式表之一:Qt样式表和盒子模型介绍

一、Qt样式表介绍 Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表(Cascading Style Sheets, CSS)的启发,不过与CSS不同的是,Qt样式表应用于部件的世界…

阿里P8大佬亲自教你!Android内存泄漏总结,看看这篇文章吧!

前言 这次去腾讯面试的是我大学同学,我们大学都是一学习,一起吃饭,一起洗脚,一起。。。 他们公司最近也裁员了,不过他是裁员前去的腾讯,不知道谁捞到他简历了,莫名就走了流程,他莫…

Sentinel在订单大量服务调用的应用场景

Sentinel译为“哨兵”,顾名思义,面对您后台的大量服务/微服务,前置一个哨兵,但面对大量请求时,让后台服务有序被调用,但某些服务的不可用时,采用服务熔断降级等措施,让系统仍能平稳运…

程序员深度学习!我想谈谈关于Android面试那些事,附赠课程+题库

想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 25%的面试官会在头5分钟内决定面试的结果60%的面试官会在头15分钟内决定面试的结果 一般来说,一场单面的时间在30分钟左右&…

MOSS 代替Spring Boot Admin 的服务治理工具

1.1 什么是服务治理 服务治理,我也称之为微服务治理,是指用来管理微服务的整个生命周期。包括应用的创建,服务名的规范,服务的上下线,服务的迁移,整个服务的生老病死等方方面面的治理。 1.2 Moss概述 Mo…

程序员经验分享:Android高级工程师系列学习路线介绍,面试必备

前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期,工作主要是按照业务需求实现App页面的功能,按照设…

算法题+JVM+自定义View,隔壁都馋哭了

反思 昨晚去北京大望路阿里面试, 产生了严重的挫败感, 羞愧难当. 比不得从大学就有目标有理想, 一直在为目标努力学习技术的同学, 在大学唯一能拿得出手的就是参加了电子设计大赛, 学了点嵌入式的知识. 毕业后开始做android, 说得好听点叫做项目, 实际上就是搬代码, 真正记到…

终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结

行业激烈变化时,恰恰是机会最多的时候 坦白讲,许多人骨子里害怕变化和竞争。 其实大可不必。 一来,怕也没用嘛。二来,变化越快,组合要素增加了,意味着新的工作机会越多。 就像传统媒体VS新媒体。 放在…