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.
96 lines
3.2 KiB
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'));
|
|
}
|
|
}
|