param('page', 1)); $limit = min(100, max(1, (int) request()->param('limit', 15))); $tradeNo = trim((string) request()->param('trade_no', '')); $channel = trim((string) request()->param('channel', '')); $status = request()->param('status', ''); $db = Db::name('paycenter_trade'); if ($tradeNo !== '') { $db->where('trade_no', 'like', '%' . $tradeNo . '%'); } if ($channel !== '') { $db->where('channel', $channel); } if ($status !== '' && $status !== null) { $db->where('status', (int) $status); } $total = (int) $db->count(); $rows = $db->order('id', 'desc')->page($page, $limit)->select()->toArray(); foreach ($rows as &$row) { $row['status_text'] = [0 => '待支付', 1 => '已支付', 2 => '已退款'][(int) $row['status']] ?? '未知'; $row['create_time'] = !empty($row['create_at']) ? date('Y-m-d H:i:s', (int) $row['create_at']) : ''; $row['pay_time'] = !empty($row['pay_at']) ? date('Y-m-d H:i:s', (int) $row['pay_at']) : ''; } return json(['code' => 0, 'msg' => '', 'count' => $total, 'data' => $rows]); } /** 详情 */ public function detail() { Schema::ensure(); $tradeNo = trim((string) request()->param('trade_no', '')); $trade = $tradeNo !== '' ? (array) Db::name('paycenter_trade')->where('trade_no', $tradeNo)->find() : []; if (!$trade) { return $this->result->error('流水不存在'); } return $this->result->success('success', $trade); } /** * 主动查单:回调到不了(内网 / 防火墙 / 网关重试失败)时,用网关结果补发货。 */ public function query() { Schema::ensure(); $tradeNo = trim((string) request()->param('trade_no', '')); if ($tradeNo === '') { return $this->result->error('缺少订单号'); } $trade = (array) Db::name('paycenter_trade')->where('trade_no', $tradeNo)->find(); if (!$trade) { return $this->result->error('流水不存在:' . $tradeNo); } $result = Payment::query((string) $trade['channel'], $tradeNo); if (!empty($result['paid'])) { // 与回调同一条链路:触发 PayPaid,让业务监听器发货(幂等) \addon\paycenter\library\TradeLog::markPaid([ 'trade_no' => $tradeNo, 'gateway_no' => (string) ($result['gateway_no'] ?? ''), ]); \think\facade\Event::trigger(Payment::EVENT_PAID, [ 'trade_no' => $tradeNo, 'channel' => (string) $trade['channel'], 'amount' => (float) ($result['amount'] ?? 0), 'gateway_no' => (string) ($result['gateway_no'] ?? ''), 'biz' => (string) ($trade['biz'] ?? ''), 'biz_id' => (int) ($trade['biz_id'] ?? 0), 'attach' => $trade['attach'] ?? '', 'scene' => (string) ($trade['scene'] ?? ''), 'trade' => $trade, ]); return $this->result->success('网关已确认付款,并已触发发货'); } return $this->result->error('网关查询不到付款记录(可能尚未支付或查单失败)'); } /** 发起退款(网关退款 + 流水置已退款) */ public function refund() { Schema::ensure(); $tradeNo = trim((string) request()->param('trade_no', '')); $amount = (float) request()->param('amount', 0); if ($tradeNo === '') { return $this->result->error('缺少订单号'); } $result = Payment::refund($tradeNo, $amount > 0 ? $amount : null); return $result['ok'] ? $this->result->success($result['message']) : $this->result->error($result['message']); } }