chunkById(200, function ($logs) { foreach ($logs as $log) { try { $method = 'refundBy'.Str::studly($log->order->pay_way); if (! method_exists($this, $method)) { throw new BizException('退款方式暂不支持'); } $this->{$method}($log); } catch (Throwable $e) { report($e); $log->update([ 'status' => OrderRefundLog::STATUS_FAILED, 'failed_reason' => $e->getMessage(), ]); } } }); return 0; } /** * 微信支付退款 * * @param \App\Models\OrderRefundLog $log * @return void */ protected function refundByWxpay(OrderRefundLog $log) { $order = $log->order; (new WeChatPayService())->refundByOutTradeNumber( $order->pay_sn, $log->sn, $order->total_amount, $log->amount, [ 'refund_desc' => $log->reason, 'notify_url' => url(route('wxpay.order_refund_notify', [], false), [], true), ] ); $log->update([ 'status' => OrderRefundLog::STATUS_SUCCESS, 'failed_reason' => null, ]); } /** * 支付宝退款 * * @param \App\Models\OrderRefundLog $log * @return void */ protected function refundByAlipay(OrderRefundLog $log) { $order = $log->order; (new AlipayService())->refund( $order->pay_sn, $log->sn, bcdiv($log->amount, 100, 2), $log->reason, ); $log->update([ 'status' => OrderRefundLog::STATUS_SUCCESS, 'failed_reason' => null, ]); } /** * 可提支付退款 * * @param \App\Models\OrderRefundLog $log * @return void */ protected function refundByWallet(OrderRefundLog $log) { $order = $log->order; (new WalletService())->changeBalance( $order->user, $order->total_amount, $log->after_sale_id ? WalletLog::ACTION_ORDER_AFTER_SALE : WalletLog::ACTION_ORDER_CANCELLED, $log->after_sale_id ? '订单-售后退款' : $log->reason, $order ); $log->update([ 'status' => OrderRefundLog::STATUS_SUCCESS, 'failed_reason' => null, ]); } /** * 余额支付退款 * * @param \App\Models\OrderRefundLog $log * @return void */ protected function refundByBalance(OrderRefundLog $log) { $order = $log->order; (new BalanceService())->changeBalance( $order->user, $order->total_amount, $log->after_sale_id ? BalanceLog::ACTION_ORDER_AFTER_SALE : BalanceLog::ACTION_ORDER_CANCELLED, $log->after_sale_id ? '订单-售后退款' : $log->reason, $order ); $log->update([ 'status' => OrderRefundLog::STATUS_SUCCESS, 'failed_reason' => null, ]); } /** * 现金支付退款 * * @param \App\Models\OrderRefundLog $log * @return void */ protected function refundByOffline(OrderRefundLog $log) { $log->update([ 'status' => OrderRefundLog::STATUS_SUCCESS, ]); } }