OrderStatus.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace app\api\controller\product;
  3. use app\common\controller\Frontend;
  4. use think\facade\Db;
  5. class OrderStatus extends Frontend
  6. {
  7. protected array $noNeedPermission = ['check'];
  8. protected array $noNeedLogin = ['check']; // 允许未登录用户查询(通过订单号)
  9. /**
  10. * 查询订单状态(前端轮询调用)
  11. * GET /api/product/orderStatus/check?order_no=BUV202601161721166683
  12. */
  13. public function check()
  14. {
  15. // 1. 获取订单号
  16. $orderNo = $this->request->get('order_no', '');
  17. if (empty($orderNo)) {
  18. return json([
  19. 'code' => 400,
  20. 'msg' => '订单号不能为空',
  21. 'data' => null
  22. ]);
  23. }
  24. // 2. 查询订单信息
  25. $order = Db::name('order')
  26. ->where('order_no', $orderNo)
  27. ->field('id, order_no, user_id, pay_amount, pay_method,
  28. pay_status, order_status, pay_time, create_time')
  29. ->find();
  30. if (!$order) {
  31. return json([
  32. 'code' => 404,
  33. 'msg' => '订单不存在',
  34. 'data' => null
  35. ]);
  36. }
  37. // 3. 查询支付记录(如果有)
  38. $paymentRecord = Db::name('payment_record')
  39. ->where('order_no', $orderNo)
  40. ->field('id, trade_no, status, pay_time as payment_pay_time')
  41. ->find();
  42. // 4. 查询订单商品信息
  43. $orderItem = Db::name('order_item')
  44. ->where('order_id', $order['id'])
  45. ->field('item_name, spec_name, quantity, unit_price')
  46. ->find();
  47. // 5. 格式化返回数据
  48. $result = [
  49. 'order_no' => $order['order_no'],
  50. 'pay_status' => $order['pay_status'], // 0=待支付, 1=已支付, 2=支付失败
  51. 'order_status' => $order['order_status'], // 0=待处理, 1=已确认, 2=已发货, 3=已完成, 4=已取消
  52. 'pay_method' => $order['pay_method'],
  53. 'pay_amount' => $order['pay_amount'],
  54. 'pay_time' => $order['pay_time'],
  55. 'trade_no' => $paymentRecord['trade_no'] ?? '',
  56. 'product_name' => $orderItem['item_name'] ?? '商品',
  57. 'product_spec' => $orderItem['spec_name'] ?? '',
  58. 'quantity' => $orderItem['quantity'] ?? 1,
  59. 'status_text' => $this->getStatusText($order['pay_status'], $order['order_status'])
  60. ];
  61. return json([
  62. 'code' => 1,
  63. 'msg' => 'success',
  64. 'data' => $result
  65. ]);
  66. }
  67. /**
  68. * 获取状态文本
  69. */
  70. private function getStatusText($payStatus, $orderStatus)
  71. {
  72. // 支付状态文本
  73. $payStatusMap = [
  74. 0 => '待支付',
  75. 1 => '已支付',
  76. 2 => '支付失败'
  77. ];
  78. // 订单状态文本
  79. $orderStatusMap = [
  80. 0 => '待处理',
  81. 1 => '已确认',
  82. 2 => '已发货',
  83. 3 => '已完成',
  84. 4 => '已取消'
  85. ];
  86. $text = $payStatusMap[$payStatus] ?? '未知支付状态';
  87. // 如果已支付,显示订单状态
  88. if ($payStatus == 1) {
  89. $text .= '/' . ($orderStatusMap[$orderStatus] ?? '未知订单状态');
  90. }
  91. return $text;
  92. }
  93. /**
  94. * 手动查询微信订单状态(用于调试)
  95. */
  96. public function queryWechat()
  97. {
  98. if (!$this->auth->isLogin() || !$this->auth->isAdmin()) {
  99. $this->error('权限不足');
  100. }
  101. $orderNo = $this->request->get('order_no', '');
  102. if (empty($orderNo)) {
  103. $this->error('订单号不能为空');
  104. }
  105. try {
  106. // 查询支付记录
  107. $paymentRecord = Db::name('ba_payment_record')
  108. ->where('order_no', $orderNo)
  109. ->find();
  110. if (!$paymentRecord) {
  111. $this->error('支付记录不存在');
  112. }
  113. // 查询支付配置
  114. $payConfig = Db::name('ba_pay_config')
  115. ->where('id', $paymentRecord['pay_config_id'])
  116. ->find();
  117. if (!$payConfig) {
  118. $this->error('支付配置不存在');
  119. }
  120. // 调用微信查询接口
  121. $paymentService = \app\common\service\PaymentFactory::create(
  122. $paymentRecord['pay_method'],
  123. $payConfig['id']
  124. );
  125. $result = $paymentService->queryOrder($orderNo);
  126. $this->success('查询成功', $result);
  127. } catch (\Exception $e) {
  128. $this->error('查询失败: ' . $e->getMessage());
  129. }
  130. }
  131. }