You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.3 KiB
74 lines
2.3 KiB
<?php
|
|
|
|
namespace App\Admin\Actions\Post;
|
|
|
|
use App\Enums\OrderShipStatusEnum;
|
|
use App\Enums\OrderStatusEnum;
|
|
use App\Models\Order;
|
|
use Encore\Admin\Actions\RowAction;
|
|
use Illuminate\Http\Request;
|
|
use Yansongda\Pay\Pay;
|
|
|
|
class OrderRefundAction extends RowAction
|
|
{
|
|
// 动作名称,显示在界面上的按钮文本
|
|
public $name = '退款';
|
|
|
|
/**
|
|
* 处理订单退款的逻辑
|
|
*
|
|
* @param Order $order 当前订单模型实例
|
|
* @param Request $request 当前请求实例
|
|
* @return \Encore\Admin\Actions\Response 返回操作结果的响应
|
|
*/
|
|
public function handle(Order $order, Request $request)
|
|
{
|
|
// 检查订单状态是否为申请退款
|
|
if ($order->status != OrderStatusEnum::APPLY_REFUND) {
|
|
// 如果当前状态不允许退款,返回错误信息
|
|
return $this->response()->error('订单当前状态禁止退款');
|
|
}
|
|
|
|
// 创建支付宝支付实例
|
|
$pay = Pay::alipay(config('pay.ali'));
|
|
|
|
// 准备退款数据
|
|
$refundData = [
|
|
'out_trade_no' => $order->no, // 订单号
|
|
'trade_no' => $order->pay_no, // 支付交易号
|
|
'refund_amount' => $order->pay_amount, // 退款金额
|
|
'refund_reason' => '正常退款', // 退款原因
|
|
];
|
|
|
|
try {
|
|
// 发起退款请求
|
|
$response = $pay->refund($refundData);
|
|
|
|
// 更新订单的退款信息
|
|
$order->pay_refund_fee = $response->get('refund_fee'); // 设置退款金额
|
|
$order->pay_trade_no = $response->get('trade_no'); // 设置退款交易号
|
|
$order->status = OrderStatusEnum::REFUND; // 更新订单状态为退款
|
|
$order->save(); // 保存订单的更改
|
|
|
|
} catch (\Exception $e) {
|
|
// 处理异常情况
|
|
// abort(500, $e->getMessage()); // 可选:抛出异常
|
|
return $this->response()->error('服务器异常,请稍后再试'); // 返回错误信息
|
|
}
|
|
|
|
// 返回成功响应并刷新页面
|
|
return $this->response()->success('退款成功.')->refresh();
|
|
}
|
|
|
|
/**
|
|
* 显示退款确认对话框
|
|
*
|
|
* @return void
|
|
*/
|
|
public function dialog()
|
|
{
|
|
// 确认退款操作
|
|
$this->confirm('退款会直接把钱退回到支付账户,是否继续');
|
|
}
|
|
}
|