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.
aquaculture/app/Http/Controllers/PaymentNotificationControll...

96 lines
3.2 KiB

<?php
namespace App\Http\Controllers;
use App\Admin\Transforms\OrderPayTypeTransform;
use App\Enums\OrderPayTypeEnum;
use App\Enums\OrderStatusEnum;
use App\Http\Controllers\User\PaymentController;
use App\Models\Order;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Yansongda\Pay\Pay;
class PaymentNotificationController extends Controller
{
protected $config;
public function __construct()
{
// 从配置文件中加载支付宝支付配置
$this->config = config('pay.ali');
}
/**
* 处理支付宝后台通知的接口
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response 返回支付宝的成功响应
*/
public function payNotify(Request $request)
{
$alipay = Pay::alipay($this->config);
// TODO: 加入轮询接口以配合后台通知修改订单状态
// 后台异步通知接口可能因网络问题而未能接收
// 使用轮询检查订单状态,如果支付成功则停止轮询
try {
$data = $alipay->verify(); // 验签操作
// 验证 app_id
// 可判断 total_amount 是否为该订单的实际金额
if ($data->get('app_id') == $this->config['app_id']) {
// 支付成功
if ($data->get('trade_status') == 'TRADE_SUCCESS') {
// 更新订单信息
$order = Order::query()->where('no', $data->get('out_trade_no'))->firstOrFail();
$order->paid_at = $data->get('notify_time'); // 支付时间
$order->pay_no = $data->get('trade_no'); // 支付交易号
$order->pay_amount = $data->get('receipt_amount'); // 实际支付金额
$order->status = OrderStatusEnum::PAID; // 更新订单状态为已支付
$order->pay_type = OrderPayTypeEnum::ALI; // 支付类型
$order->save(); // 保存订单信息
}
}
// 记录支付宝通知日志
Log::debug('Alipay notify', $data->all());
} catch (\Exception $e) {
// 记录异常日志
Log::debug('Alipay notify', $e->getMessage());
}
// 返回支付宝的成功响应
return $alipay->success();
}
/**
* 处理前台跳转的接口
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View 返回支付结果视图
*/
public function payReturn()
{
// 获取最新的 9 个产品
$latestProducts = Product::query()->latest()->take(9)->get();
$order = null;
try {
// 验证支付数据
$data = Pay::alipay($this->config)->verify();
// 根据订单号查询订单
$order = Order::query()->where('no', $data->get('out_trade_no'))->firstOrFail();
} catch (\Exception $e) {
// 处理异常(可以记录日志或返回错误视图)
}
// 返回支付结果视图,并传递订单和最新产品数据
return view('user.payments.result', compact('order', 'latestProducts'));
}
}