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

Omnipay-PayPal集成中notifyUrl无法触发问题求助

解决Omnipay-PayPal REST集成中notifyUrl无法触发的问题

核心原因

旧版PayPal标准支付的notifyUrl属于IPN(即时付款通知)机制,而REST API采用Webhooks作为支付状态通知方案,Omnipay-PayPal的REST网关不支持通过purchase/completePurchase方法直接设置notifyUrl参数,这是设置无效的根本原因。

解决步骤

  1. 在PayPal商家后台配置Webhook

    • 登录PayPal商家平台(沙箱或生产环境),进入「Webhooks」管理页面
    • 创建新Webhook,选择需监听的核心事件(推荐PAYMENT.SALE.COMPLETED,对应支付完成状态)
    • 填写原notifyUrl对应的接收地址,确保该地址可被公网访问(本地测试可使用ngrok等工具暴露端口)
  2. 替换原IPN验证逻辑为Webhook处理
    原IPN的VERIFIED验证逻辑不再适用,需替换为Webhook请求的签名验证,以下是CodeIgniter控制器示例代码:

    public function paypal_webhook()
    {
        $gateway = Omnipay::create('PayPal_Rest');
        $gateway->setClientId('你的client_id');
        $gateway->setSecret('你的secret');
        $gateway->setTestMode(true); // 沙箱环境开启
    
        $payload = file_get_contents('php://input');
        $headers = getallheaders();
    
        // 验证Webhook签名
        try {
            $gateway->verifyWebhookSignature([
                'payload' => $payload,
                'headers' => $headers,
            ]);
    
            // 解析事件数据
            $event = json_decode($payload, true);
            if ($event['event_type'] === 'PAYMENT.SALE.COMPLETED') {
                // 触发订单发货逻辑
                $saleId = $event['resource']['id'];
                // 此处添加你的订单处理代码
            }
    
            // 返回200状态码告知PayPal已接收
            http_response_code(200);
        } catch (\Exception $e) {
            // 验证失败,记录日志
            log_message('error', 'PayPal Webhook验证失败: ' . $e->getMessage());
            http_response_code(400);
        }
    }
    
  3. 关键注意事项

    • 生产环境下,Webhook接收地址必须支持HTTPS
    • 可通过PayPal后台的Webhook日志排查发送失败问题(如地址不可达、签名验证失败)
    • 沙箱测试需使用沙箱商家账号配置Webhook,搭配沙箱买家账号完成支付测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:50:23