Thinkapi.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace addons\shopro\library\express\provider;
  3. use app\admin\model\shopro\Config;
  4. use app\admin\model\shopro\order\Address as OrderAddress;
  5. use fast\Http;
  6. class Thinkapi extends Base
  7. {
  8. protected $uri = 'https://api.topthink.com';
  9. protected $appCode = '';
  10. public function __construct()
  11. {
  12. $this->appCode = Config::getConfigField('shop.dispatch.thinkapi.app_code');
  13. }
  14. public $status = [
  15. '1' => 'noinfo',
  16. '2' => 'transport',
  17. '3' => 'delivery',
  18. '4' => 'signfor',
  19. '5' => 'refuse',
  20. '6' => 'difficulty',
  21. '7' => 'invalid',
  22. '8' => 'timeout',
  23. '9' => 'fail',
  24. '10' => 'back'
  25. ];
  26. /**
  27. * 快递查询
  28. *
  29. * @param array $data
  30. * @param mixed $orderExpress
  31. * @return array
  32. */
  33. public function search($data, $orderExpress = 0)
  34. {
  35. $mobile = (isset($data['mobile']) && $data['mobile']) ? $data['mobile'] : '';
  36. if (!$mobile && stripos($data['express_no'], 'SF') === 0 && isset($data['order_id'])) {
  37. // 获取手机号
  38. $orderAddress = OrderAddress::where('order_id', $data['order_id'])->find();
  39. $mobile = $orderAddress ? $orderAddress->mobile : $mobile;
  40. }
  41. $requestData = [
  42. 'appCode' => $this->appCode,
  43. 'com' => 'auto',
  44. 'nu' => $data['express_no'],
  45. 'phone' => substr($mobile, 7)
  46. ];
  47. $result = Http::get($this->uri . '/express/query', $requestData);
  48. $result = is_string($result) ? json_decode($result, true) : $result;
  49. if (isset($result['code']) && $result['code'] != 0) {
  50. $msg = $result['data']['msg'] ?? ($result['message'] ?? '');
  51. error_stop($msg);
  52. }
  53. $data = $result['data'] ?? [];
  54. $traces = $data['data'] ?? [];
  55. $status = $data['status'];
  56. // 格式化结果
  57. $formatResult = $this->formatResult([
  58. 'status' => $status,
  59. 'traces' => $traces
  60. ]);
  61. if ($orderExpress) {
  62. $this->updateExpress($formatResult, $orderExpress);
  63. }
  64. return $formatResult;
  65. }
  66. /**
  67. * 处理返回结果
  68. *
  69. * @param array $data
  70. * @return array
  71. */
  72. protected function formatResult($data)
  73. {
  74. $status = $this->status[$data['status']] ?? 'noinfo';
  75. $traces = [];
  76. foreach ($data['traces'] as $trace) {
  77. $traces[] = [
  78. 'content' => $trace['context'],
  79. 'change_date' => $trace['time'],
  80. 'status' => $trace['status'] ?? $status
  81. ];
  82. }
  83. $traces = array_reverse($traces); // 调转顺序,第一条为最开始运输信息,最后一条为最新消息
  84. return compact('status', 'traces');
  85. }
  86. }