Express.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. $data = $this->OTHER($express_code, $ShipperCode, $OrderCode, $CustomerName);
  43. break;
  44. case "DBL":
  45. $data = $this->DBL($express_code, $ShipperCode);
  46. break;
  47. default:
  48. $data = $this->OTHER($express_code, $ShipperCode, $OrderCode, $CustomerName);
  49. break;
  50. }
  51. return $data;
  52. } catch (\Exception $exception) {
  53. $a['LogisticCode'] = $express_code;
  54. $a['ShipperCode'] = $ShipperCode;
  55. $a['Traces'] = [];
  56. $a['State'] = 40010;
  57. return $a;
  58. }
  59. }
  60. private function ZTO($express_code, $ShipperCode)
  61. {
  62. $companyid = '206f48b6bded4906a06eddd39bf26e7c';
  63. $client = new Client();
  64. $url = 'http://japi.zto.cn/traceInterfaceNewTraces';
  65. $array = [
  66. 'headers' => [
  67. 'ContentType' => 'application/x-www-form-urlencoded',
  68. 'x-companyid' => $companyid,
  69. 'x-datadigest' => base64_encode(md5('data=["' . $express_code . '"]&company_id=' . $companyid . '&msg_type=NEW_TRACES0480ecc2d633', true))
  70. ],
  71. 'query' => [
  72. 'data' => '["' . $express_code . '"]',
  73. 'company_id' => $companyid,
  74. 'msg_type' => 'NEW_TRACES',
  75. ]
  76. ];
  77. $request = $client->request('POST', $url, $array);
  78. $ad = $request->getBody()->getContents();
  79. $re = [];
  80. $state = 0;
  81. $ads = json_decode($ad);
  82. $arr = (array)$ads;
  83. if ($arr['data'][0]->traces) {
  84. foreach ($arr['data'][0]->traces as $k => $v) {
  85. $re[$k]['AcceptStation'] = $v->desc;
  86. $re[$k]['AcceptTime'] = strtotime($v->scanDate) * 1000;
  87. if ($v->scanType == 'ARRIVAL' || $v->scanType == 'SIGNED' || $v->scanType == '5' || $v->scanType == '6' || $v->scanType == '签收') {
  88. $state = 3;
  89. }
  90. }
  91. }
  92. $a['LogisticCode'] = $express_code;
  93. $a['ShipperCode'] = $ShipperCode;
  94. $a['Traces'] = $re;
  95. $a['State'] = $state;
  96. return $a;
  97. }
  98. private function DBL($express_code, $ShipperCode)
  99. {
  100. $client = new Client();
  101. $url = 'https://www.deppon.com/gwapi/trackService/eco/track/searchTrack?billNo=' . $express_code;
  102. $request = $client->request('get', $url);
  103. $ad = $request->getBody()->getContents();
  104. $ads = json_decode($ad);
  105. $re = [];
  106. $state = 0;
  107. if ($ads->status == 'success') {
  108. foreach ($ads->result->tracks as $k => $v) {
  109. $re[$k]['AcceptStation'] = $v->contentNoLinkLabel;
  110. $re[$k]['AcceptTime'] = $v->operateTime;
  111. }
  112. if ($ads->result->billNoState == '已签收') {
  113. $state = 3;
  114. }
  115. }
  116. $a['LogisticCode'] = $express_code;
  117. $a['ShipperCode'] = $ShipperCode;
  118. $a['Traces'] = $re;
  119. $a['message'] = $ads->message;
  120. $a['State'] = $state;
  121. return $a;
  122. }
  123. private function OTHER($express_code, $ShipperCode, $OrderCode, $CustomerName)
  124. {
  125. $client = new Client();
  126. $appkey = self::AppKey;
  127. $appid = self::AppId;
  128. $url = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
  129. $array = [
  130. 'query' => [
  131. 'RequestData' => urlencode($this->requestdata($express_code, $ShipperCode, $OrderCode, $CustomerName)),
  132. 'EBusinessID' => $appid,
  133. 'RequestType' => '8002',
  134. 'DataSign' => urlencode($this->encrypt($this->requestdata($express_code, $ShipperCode, $OrderCode, $CustomerName), $appkey)),
  135. 'DataType' => '2'
  136. ]
  137. ];
  138. $re = $client->request('POST', $url, $array);
  139. $dd = $re->getBody()->getContents();
  140. $d = json_decode($dd);
  141. if ($d->Traces) {
  142. foreach ($d->Traces as $k => $v) {
  143. $v->AcceptTime = strtotime($v->AcceptTime) * 1000;
  144. }
  145. }
  146. return js2php(php2js($d));
  147. }
  148. private function requestdata($express_code, $ShipperCode = null, $OrderCode = null, $CustomerName = null)
  149. {
  150. if ($ShipperCode) {
  151. $requestdata['ShipperCode'] = $ShipperCode;
  152. }
  153. if ($OrderCode) {
  154. $requestdata['OrderCode'] = $OrderCode;
  155. }
  156. if ($CustomerName) {
  157. $requestdata['CustomerName'] = $CustomerName;
  158. }
  159. $requestdata['LogisticCode'] = $express_code;
  160. return json_encode($requestdata);
  161. }
  162. private function encrypt($reqiredata, $appkey)
  163. {
  164. return base64_encode(md5($reqiredata . $appkey));
  165. }
  166. public function getExpressCompany($LogisticCode)
  167. {
  168. $client = new Client();
  169. $appKey = self::AppKey;
  170. $appId = self::AppId;
  171. // $url = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';
  172. $url = 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
  173. $requestData = $this->requestData($LogisticCode);
  174. $array = [
  175. 'query' => [
  176. 'RequestData' => urlencode($requestData),
  177. 'EBusinessID' => $appId,
  178. 'RequestType' => '2002',
  179. 'DataSign' => urlencode($this->encrypt($requestData, $appKey)),
  180. 'DataType' => '2'
  181. ]
  182. ];
  183. $result = $client->request('POST', $url, $array);
  184. $res = json_decode($result->getBody()->getContents());
  185. return $res;
  186. }
  187. }