handlePaidNotify(function ($message, $fail) { $this->log('order paid notify', $message); // 通信失败 if (data_get($message, 'return_code') !== 'SUCCESS') { return $fail('通信失败'); } // 支付失败 if (data_get($message, 'result_code') !== 'SUCCESS') { return true; } try { $order = DB::transaction(function () use ($message) { return (new OrderService())->paySuccess($message['out_trade_no'], [ 'pay_sn' => $message['transaction_id'], 'pay_way' => Order::PAY_WAY_WXPAY, 'pay_at' => Carbon::parse($message['time_end']), ]); }); OrderPaid::dispatchIf($order->isPaid(), $order); } catch (ModelNotFoundException | BizException $e) { } catch (Throwable $e) { throw $e; } return true; }); } /** * 订单退款结果通知 * * @param \App\Services\WeChatPayService $weChatPayService * @return \Illuminate\Http\Response */ public function orderRefundedNotify(WeChatPayService $weChatPayService) { return $weChatPayService->handleRefundedNotify(function ($message, $reqInfo, $fail) { $this->log('order refunded notify', $reqInfo); // 通信失败 if (data_get($message, 'return_code') !== 'SUCCESS') { return $fail('通信失败'); } // 退款失败 if ($reqInfo['refund_status'] !== 'SUCCESS') { $orderRefundJob = OrderRefundJob::where('sn', $reqInfo['out_refund_no'])->first(); $orderRefundJob?->update([ 'status' => OrderRefundJob::STATUS_FAILED, 'failed_reason' => $reqInfo['refund_status'] === 'CHANGE' ? '退款异常' : '退款关闭', ]); } return true; }); } /** * 微信回调日志 * * @param string $message * @param array $context * @return void */ protected function log(string $message, array $context = []) { return Log::build([ 'driver' => 'daily', 'path' => storage_path('logs/wxpay.log'), ])->info($message, $context); } }