Express.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace App\Support\Sdk\Express;
  3. use GuzzleHttp\Client;
  4. class Express
  5. {
  6. //快递鸟配置
  7. const AppId = 1640111;
  8. const AppKey = '321b74bb-84a3-4b9c-af1d-937583f9a3a0';
  9. const ExpressCode = [
  10. 'SF' => '顺丰速运',
  11. 'HTKY' => '百世快递',
  12. 'ZTO' => '中通快递',
  13. 'STO' => '申通快递',
  14. 'YTO' => '圆通速递',
  15. 'YD' => '韵达速递',
  16. 'YZPY' => '邮政快递包裹',
  17. 'EMS' => 'EMS',
  18. 'HHTT' => '天天快递',
  19. 'JD' => '京东快递',
  20. 'UC' => '优速快递',
  21. 'DBL' => '德邦快递',
  22. 'ZJS' => '宅急送',
  23. 'PJ' => '品骏快递',
  24. ];
  25. public static function nameToCode($name)
  26. {
  27. $code = false;
  28. foreach (self::ExpressCode as $k => $item) {
  29. if (strpos($item, $name) !== false) {
  30. $code = $k;
  31. }
  32. }
  33. return $code;
  34. }
  35. public function search($express_code, $ShipperCode = null, $OrderCode = null, $CustomerName = null)
  36. {
  37. try {
  38. $data = false;
  39. switch (strtoupper($ShipperCode)) {
  40. case "ZTO":
  41. $data = $this->ZTO($express_code, $ShipperCode);
  42. break;
  43. case "DBL":
  44. $data = $this->DBL($express_code, $ShipperCode);
  45. break;
  46. default:
  47. $data = $this->OTHER($express_code, $ShipperCode, $OrderCode, $CustomerName);
  48. break;
  49. }
  50. return $data;
  51. } catch (\Exception $exception) {
  52. $a['LogisticCode'] = $express_code;
  53. $a['ShipperCode'] = $ShipperCode;
  54. $a['Traces'] = [];
  55. $a['State'] = 40010;
  56. return $a;
  57. }
  58. }
  59. private function ZTO($express_code, $ShipperCode)
  60. {
  61. $companyid = '206f48b6bded4906a06eddd39bf26e7c';
  62. $client = new Client();
  63. $url = 'http://japi.zto.cn/traceInterfaceNewTraces';
  64. $array = [
  65. 'headers' => [
  66. 'ContentType' => 'application/x-www-form-urlencoded',
  67. 'x-companyid' => $companyid,
  68. 'x-datadigest' => base64_encode(md5('data=["' . $express_code . '"]&company_id=' . $companyid . '&msg_type=NEW_TRACES0480ecc2d633', true))
  69. ],
  70. 'query' => [
  71. 'data' => '["' . $express_code . '"]',
  72. 'company_id' => $companyid,
  73. 'msg_type' => 'NEW_TRACES',
  74. ]
  75. ];
  76. $request = $client->request('POST', $url, $array);
  77. $ad = $request->getBody()->getContents();
  78. $re = [];
  79. $state = 0;
  80. $ads = json_decode($ad);
  81. $arr = (array)$ads;
  82. if ($arr['data'][0]->traces) {
  83. foreach ($arr['data'][0]->traces as $k => $v) {
  84. $re[$k]['AcceptStation'] = $v->desc;
  85. $re[$k]['AcceptTime'] = strtotime($v->scanDate) * 1000;
  86. if ($v->scanType == 'ARRIVAL' || $v->scanType == 'SIGNED' || $v->scanType == '5' || $v->scanType == '6' || $v->scanType == '签收') {
  87. $state = 3;
  88. }
  89. }
  90. }
  91. $a['LogisticCode'] = $express_code;
  92. $a['ShipperCode'] = $ShipperCode;
  93. $a['Traces'] = $re;
  94. $a['State'] = $state;
  95. return $a;
  96. }
  97. private function DBL($express_code, $ShipperCode)
  98. {
  99. $client = new Client();
  100. $url = 'https://www.deppon.com/gwapi/trackService/eco/track/searchTrack?billNo=' . $express_code;
  101. $request = $client->request('get', $url);
  102. $ad = $request->getBody()->getContents();
  103. $ads = json_decode($ad);
  104. $re = [];
  105. $state = 0;
  106. if ($ads->status == 'success') {
  107. foreach ($ads->result->tracks as $k => $v) {
  108. $re[$k]['AcceptStation'] = $v->contentNoLinkLabel;
  109. $re[$k]['AcceptTime'] = $v->operateTime;
  110. }
  111. if ($ads->result->billNoState == '已签收') {
  112. $state = 3;
  113. }
  114. }
  115. $a['LogisticCode'] = $express_code;
  116. $a['ShipperCode'] = $ShipperCode;
  117. $a['Traces'] = $re;
  118. $a['message'] = $ads->message;
  119. $a['State'] = $state;
  120. return $a;
  121. }
  122. private function OTHER($express_code, $ShipperCode, $OrderCode, $CustomerName)
  123. {
  124. $client = new Client();
  125. $appkey = self::AppKey;
  126. $appid = self::AppId;
  127. $url = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
  128. $array = [
  129. 'query' => [
  130. 'RequestData' => urlencode($this->requestdata($express_code, $ShipperCode, $OrderCode, $CustomerName)),
  131. 'EBusinessID' => $appid,
  132. 'RequestType' => '8001',
  133. 'DataSign' => urlencode($this->encrypt($this->requestdata($express_code, $ShipperCode, $OrderCode, $CustomerName), $appkey)),
  134. 'DataType' => '2'
  135. ]
  136. ];
  137. $re = $client->request('POST', $url, $array);
  138. $dd = $re->getBody()->getContents();
  139. $d = json_decode($dd);
  140. if ($d->Traces) {
  141. foreach ($d->Traces as $k => $v) {
  142. $v->AcceptTime = strtotime($v->AcceptTime) * 1000;
  143. }
  144. }
  145. return js2php(php2js($d));
  146. }
  147. private function requestdata($express_code, $ShipperCode = null, $OrderCode = null, $CustomerName = null)
  148. {
  149. if ($ShipperCode) {
  150. $requestdata['ShipperCode'] = $ShipperCode;
  151. }
  152. if ($OrderCode) {
  153. $requestdata['OrderCode'] = $OrderCode;
  154. }
  155. if ($CustomerName) {
  156. $requestdata['CustomerName'] = $CustomerName;
  157. }
  158. $requestdata['LogisticCode'] = $express_code;
  159. return json_encode($requestdata);
  160. }
  161. private function encrypt($reqiredata, $appkey)
  162. {
  163. return base64_encode(md5($reqiredata . $appkey));
  164. }
  165. public function getExpressCompany($LogisticCode)
  166. {
  167. $client = new Client();
  168. $appKey = self::AppKey;
  169. $appId = self::AppId;
  170. // $url = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';
  171. $url = 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
  172. $requestData = $this->requestData($LogisticCode);
  173. $array = [
  174. 'query' => [
  175. 'RequestData' => urlencode($requestData),
  176. 'EBusinessID' => $appId,
  177. 'RequestType' => '2002',
  178. 'DataSign' => urlencode($this->encrypt($requestData, $appKey)),
  179. 'DataType' => '2'
  180. ]
  181. ];
  182. $result = $client->request('POST', $url, $array);
  183. $res = json_decode($result->getBody()->getContents());
  184. return $res;
  185. }
  186. }