ExpressBirdHelper.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /*
  3. * This file is part of the flex/express.
  4. *
  5. * (c) Flex<2345@mail.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace common\helpers;
  11. use common\enums\ExpressEnum;
  12. use Flex\Express\Exceptions\HttpException;
  13. use Flex\Express\Exceptions\InvalidArgumentException;
  14. use GuzzleHttp\Client;
  15. use GuzzleHttp\Exception\GuzzleException;
  16. class ExpressBirdHelper
  17. {
  18. protected $instant_api = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';//即时查询 http://www.kdniao.com/api-track
  19. protected $tracking_api = 'https://api.kdniao.com/api/dist';//物流跟踪
  20. // protected $api = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';//物流跟踪 测试
  21. protected $app_id;
  22. protected $app_key;
  23. protected $guzzleOptions = [];
  24. /**
  25. * Kuaidi100 constructor.
  26. *
  27. * @param $app_id
  28. * @param $app_key
  29. */
  30. public function __construct($app_id, $app_key)
  31. {
  32. $this->app_id = $app_id;
  33. $this->app_key = $app_key;
  34. }
  35. /**
  36. * 快递查询.
  37. *
  38. * @param string $tracking_code 快递单号
  39. * @param string $shipping_code 物流公司编号
  40. * @param string $order_code 订单编号(选填)
  41. * @param string $customerName
  42. * ShipperCode 为 SF 时必填,对应寄件人/收件人手机号后四位;
  43. * ShipperCode 为其他快递时,可不填或保留字段,不可传值(选填)
  44. * 京东快递:通过 CustomerName 传值传商家编码(由发货方提供),且快递单号必须是通过该商家编码下单获取的方可查询。若无法提供商家编码
  45. * @param string $requestType 请求指令类型(免费版:1002;付费版:8001)
  46. *
  47. * @return string
  48. *
  49. * @throws InvalidArgumentException
  50. * @throws HttpException
  51. */
  52. public function track($tracking_code = '', $shipping_code = '', $order_code = '', $customerName = '', $callback = null, $requestType = '1002')
  53. {
  54. if (empty($tracking_code)) {
  55. throw new InvalidArgumentException('TrackingCode is required');
  56. }
  57. if (empty($shipping_code)) {
  58. throw new InvalidArgumentException('ShippingCode is required');
  59. }
  60. $allow_shipping_code = ['SF', 'HTKY', 'ZTO', 'STO', 'YTO', 'YD', 'YZPY', 'EMS', 'HHTT', 'JD', 'UC', 'DBL', 'ZJS', 'TNT', 'UPS', 'DHL', 'FEDEX', 'FEDEX_GJ', 'AJ', 'ALKJWL', 'AX', 'AYUS', 'AMAZON', 'AOMENYZ', 'ANE', 'ADD', 'AYCA', 'AXD', 'ANEKY', 'BDT', 'BETWL', 'BJXKY', 'BNTWL', 'BFDF', 'BHGJ', 'BFAY', 'BTWL', 'CFWL', 'CHTWL', 'CXHY', 'CG', 'CITY100', 'CJKD', 'CNPEX', 'COE', 'CSCY', 'CDSTKY', 'CTG', 'CRAZY', 'CBO', 'CND', 'DSWL', 'DLG', 'DTWL', 'DJKJWL', 'DEKUN', 'DBLKY', 'DML', 'ETK', 'EWE', 'KFW', 'FKD', 'FTD', 'FYKD', 'FASTGO', 'FT', 'GD', 'GTO', 'GDEMS', 'GSD', 'GTONG', 'GAI', 'GKSD', 'GTSD', 'HFWL', 'HGLL', 'HLWL', 'HOAU', 'HOTSCM', 'HPTEX', 'hq568', 'HQSY', 'HXLWL', 'HXWL', 'HFHW', 'HLONGWL', 'HQKD', 'HRWL', 'HTKD', 'HYH', 'HYLSD', 'HJWL', 'JAD', 'JGSD', 'JIUYE', 'JXD', 'JYKD', 'JYM', 'JGWL', 'JYWL', 'JDKY', 'CNEX', 'KYSY', 'KYWL', 'KSDWL', 'KBSY', 'LB', 'LJSKD', 'LHT', 'MB', 'MHKD', 'MK', 'MDM', 'MRDY', 'MLWL', 'NF', 'NEDA', 'PADTF', 'PANEX', 'PJ', 'PCA', 'QCKD', 'QRT', 'QUICK', 'QXT', 'RQ', 'QYZY', 'RFD', 'RRS', 'RFEX', 'SAD', 'SNWL', 'SAWL', 'SBWL', 'SDWL', 'SFWL', 'ST', 'STWL', 'SUBIDA', 'SDEZ', 'SCZPDS', 'SURE', 'SS', 'STKD', 'TAIWANYZ', 'TSSTO', 'TJS', 'TYWL', 'TLWL', 'UAPEX', 'ULUCKEX', 'UEQ', 'WJK', 'WJWL', 'WHTZX', 'WPE', 'WXWL', 'WTP', 'WTWL', 'XCWL', 'XFEX', 'XYT', 'XJ', 'YADEX', 'YCWL', 'YCSY', 'YDH', 'YDT', 'YFHEX', 'YFSD', 'YTKD', 'YXKD', 'YUNDX', 'YMDD', 'YZBK', 'YZTSY', 'YFSUYUN', 'YSDF', 'YF', 'YDKY', 'YL', 'ZENY', 'ZHQKD', 'ZTE', 'ZTKY', 'ZTWL', 'SJ', 'ZTOKY', 'ZYKD', 'WM', 'ZMKM', 'ZHWL', 'AAE', 'ACS', 'ADP', 'ANGUILAYOU', 'APAC', 'ARAMEX', 'AT', 'AUSTRALIA', 'BEL', 'BHT', 'BILUYOUZHE', 'BR', 'BUDANYOUZH', 'CDEK', 'CA', 'DBYWL', 'DDWL', 'DGYKD', 'DLGJ', 'DHL_DE', 'DHL_EN', 'DHL_GLB', 'DHLGM', 'DK', 'DPD', 'DPEX', 'D4PX', 'EMSGJ', 'EKM', 'EPS', 'ESHIPPER', 'FCWL', 'FX', 'FQ', 'FLYZ', 'FZGJ', 'GJEYB', 'GJYZ', 'GE2D', 'GT', 'GLS', 'IOZYZ', 'IADLYYZ', 'IAEBNYYZ', 'IAEJLYYZ', 'IAFHYZ', 'IAGLYZ', 'IAJYZ', 'IALBYZ', 'IALYYZ', 'IASBJYZ', 'IBCWNYZ', 'IBDLGYZ', 'IBDYZ', 'IBELSYZ', 'IBHYZ', 'IBJLYYZ', 'IBJSTYZ', 'IBLNYZ', 'IBOLYZ', 'IBTD', 'IBYB', 'ICKY', 'IDGYZ', 'IWDMLYZ', 'IWGDYZ', 'IWKLEMS', 'IWKLYZ', 'IWLGYZ', 'ILKKD', 'IWLYZ', 'IXGLDNYYZ', 'IE', 'IXPWL', 'IYDYZ', 'IXPSJ', 'IEGDEYZ', 'IELSYZ', 'IFTWL', 'IGDLPDYZ', 'IGSDLJYZ', 'IHGYZ', 'IHHWL', 'IHLY', 'IHSKSTYZ', 'IHSYZ', 'IJBBWYZ', 'IJEJSSTYZ', 'IJKYZ', 'IJNYZ', 'IJPZYZ', 'IKNDYYZ', 'IKNYYZ', 'IKTDWEMS', 'ILMNYYZ', 'IMEDWYZ', 'IMETYZ', 'INRLYYZ', 'ISEWYYZ', 'ISPLSYZ', 'IWZBKSTYZ', 'IXBYYZ', 'IXJPEMS', 'IXLYZ', 'IXXLYZ', 'IYDLYZ', 'IYGYZ', 'IYMNYYZ', 'IYMYZ', 'IZLYZ', 'JP', 'JFGJ', 'JGZY', 'JXYKD', 'JLDT', 'JPKD', 'SYJHE', 'LYT', 'LHKDS', 'SHLDHY', 'NL', 'NSF', 'ONTRAC', 'OCS', 'QQYZ', 'POSTEIBE', 'PAPA', 'QYHY', 'VENUCIA', 'RDSE', 'SKYPOST', 'SWCH', 'SDSY', 'SK', 'STONG', 'STO_INTL', 'JYSD', 'TAILAND138', 'USPS', 'UPU', 'VCTRANS', 'XKGJ', 'XD', 'XGYZ', 'XLKD', 'XSRD', 'XYGJ', 'XYGJSD', 'YAMA', 'YODEL', 'YHXGJSD', 'YUEDANYOUZ', 'YMSY', 'YYSD', 'YJD', 'YBG', 'YJ', 'AOL', 'BCWELT', 'BN', 'UBONEX', 'UEX', 'YDGJ', 'ZY_AG', 'ZY_AOZ', 'ZY_AUSE', 'ZY_AXO', 'ZY_BH', 'ZY_BEE', 'ZY_BL', 'ZY_BM', 'ZY_BT', 'ZY_CM', 'ZY_EFS', 'ZY_ESONG', 'ZY_FD', 'ZY_FG', 'ZY_FX', 'ZY_FXSD', 'ZY_FY', 'ZY_HC', 'ZY_HYSD', 'ZY_JA', 'ZY_JD', 'ZY_JDKD', 'ZY_JDZY', 'ZY_JH', 'ZY_JHT', 'ZY_LBZY', 'ZY_LX', 'ZY_MGZY', 'ZY_MST', 'ZY_MXZY', 'ZY_QQEX', 'ZY_RT', 'ZY_RTSD', 'ZY_SDKD', 'ZY_SFZY', 'ZY_ST', 'ZY_TJ', 'ZY_TM', 'ZY_TN', 'ZY_TPY', 'ZY_TSZ', 'ZY_TWC', 'ZY_RDGJ', 'ZY_TX', 'ZY_TY', 'ZY_DGHT', 'ZY_DYW', 'ZY_WDCS', 'ZY_TZH', 'ZY_UCS', 'ZY_XC', 'ZY_XF', 'ZY_XIYJ', 'ZY_YQ', 'ZY_YSSD', 'ZY_YTUSA', 'ZY_ZCSD', 'ZYZOOM', 'ZH', 'ZO', 'ZSKY', 'ZWSY', 'ZZJH', 'JTSD', 'FWX', 'SX'];
  61. if (!in_array($shipping_code, $allow_shipping_code)) {
  62. throw new InvalidArgumentException('Current ShippingCode is not support');
  63. }
  64. if ($requestType == ExpressEnum::EXPRESS_PAY) {
  65. $api = $this->tracking_api;
  66. } else {
  67. $api = $this->instant_api;
  68. }
  69. $requestData = [
  70. 'CustomerName' => $customerName,
  71. 'LogisticCode' => $tracking_code,
  72. 'ShipperCode' => $shipping_code,
  73. 'OrderCode' => $order_code,
  74. 'Callback' => $callback,
  75. ];
  76. $requestData = json_encode($requestData);
  77. $post = array(
  78. 'EBusinessID' => $this->app_id,
  79. 'RequestType' => $requestType,
  80. 'RequestData' => urlencode($requestData),
  81. 'DataType' => '2',
  82. 'DataSign' => $this->encrypt($requestData, $this->app_key),
  83. );
  84. try {
  85. $response = $this->getHttpClient()->request('POST', $api, [
  86. 'form_params' => $post,
  87. ])->getBody()->getContents();
  88. } catch (GuzzleException $e) {
  89. throw new HttpException($e->getMessage(), $e->getCode(), $e);
  90. }
  91. return $response;
  92. }
  93. /**
  94. * 数据签名.
  95. *
  96. * @param $data
  97. * @param $appkey
  98. *
  99. * @return string
  100. */
  101. private function encrypt($data, $appkey)
  102. {
  103. return urlencode(base64_encode(md5($data . $appkey)));
  104. }
  105. /**
  106. * @return Client
  107. */
  108. public function getHttpClient()
  109. {
  110. return new Client($this->guzzleOptions);
  111. }
  112. /**
  113. * @return Client
  114. */
  115. public function getGuzzleOptions()
  116. {
  117. return new Client($this->guzzleOptions);
  118. }
  119. /**
  120. * @param $options
  121. */
  122. public function setGuzzleOptions($options)
  123. {
  124. $this->guzzleOptions = $options;
  125. }
  126. }