You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用srmklive/paypal ~1.0实现PayPal支付后更新订单支付状态

如何基于srmklive/paypal ~1.0实现支付成功后更新订单状态?

你当前的问题是:已完成订单创建和PayPal支付跳转,但未在回调中验证支付状态并更新订单status(0为待支付,1为支付成功)。以下是具体实现步骤:

1. 修改订单创建逻辑:传递订单ID到回调地址

在创建PayPal请求参数时,需要将订单ID附加到return_url中,同时把invoice_id设置为订单ID(用于后续支付验证):

// ... 订单保存代码 ...

$data = [];
$data['items'] = [];
$data['invoice_description'] = $request->notes;
$data['invoice_id'] = $order->id; // 替换为实际订单ID
$data['return_url'] = route('order.payment.success', ['order_id' => $order->id]); // 携带订单ID
$data['cancel_url'] = route('order.payment.cancel');
$data['total'] = $request->total_price;

$provider = new ExpressCheckout();
$response = $provider->setExpressCheckout($data, true); // 第二个参数true表示立即支付

return redirect($response['paypal_link']);

2. 完善支付成功回调:验证支付状态并更新订单

在payment_success方法中,需要先通过PayPal API验证支付是否真实成功,再更新订单状态:

public function payment_success(Request $request){
    // 获取回调中的订单ID和PayPal返回参数
    $orderId = $request->get('order_id');
    $paypalData = $request->all();

    // 查找对应的订单
    $order = Order::findOrFail($orderId);

    // 初始化PayPal实例并验证支付状态
    $provider = new ExpressCheckout();
    $response = $provider->getExpressCheckoutDetails($paypalData['token']);

    // 验证支付是否完成且金额匹配
    if (isset($response['PAYMENTINFO_0_PAYMENTSTATUS']) && 
        $response['PAYMENTINFO_0_PAYMENTSTATUS'] === 'Completed' &&
        $response['PAYMENTINFO_0_AMT'] == $order->total_price) {
        
        // 支付成功,更新订单状态为1
        $order->status = 1;
        $order->save();

        Alert::success('Success', "订单支付成功");
    } else {
        // 支付未完成或验证失败,保持状态为0
        Alert::error('Error', "支付验证失败,请检查订单状态");
    }

    return redirect()->route('fronthome');
}

3. (可选)处理支付取消回调

如果需要在用户取消支付时给出提示,可完善payment.cancel方法:

public function payment_cancel(Request $request){
    $orderId = $request->get('order_id');
    $order = Order::find($orderId);
    
    // 订单状态保持0,无需修改
    Alert::warning('提示', "您已取消支付,订单状态为待支付");
    return redirect()->route('fronthome');
}

关键注意事项

  • 必须验证支付状态:不能仅依赖用户跳转到success页面就认为支付成功,必须通过PayPal API验证PAYMENTINFO_0_PAYMENTSTATUS为Completed,同时校验支付金额与订单金额一致,避免恶意请求。
  • 订单ID传递:确保回调地址携带订单ID,才能准确找到对应订单进行状态更新。

内容的提问来源于stack exchange,提问作者alex jone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:37:02