Omnipay-PayPal集成中notifyUrl无法触发问题求助
解决Omnipay-PayPal REST集成中notifyUrl无法触发的问题
核心原因
旧版PayPal标准支付的notifyUrl属于IPN(即时付款通知)机制,而REST API采用Webhooks作为支付状态通知方案,Omnipay-PayPal的REST网关不支持通过purchase/completePurchase方法直接设置notifyUrl参数,这是设置无效的根本原因。
解决步骤
在PayPal商家后台配置Webhook
- 登录PayPal商家平台(沙箱或生产环境),进入「Webhooks」管理页面
- 创建新Webhook,选择需监听的核心事件(推荐
PAYMENT.SALE.COMPLETED,对应支付完成状态) - 填写原
notifyUrl对应的接收地址,确保该地址可被公网访问(本地测试可使用ngrok等工具暴露端口)
替换原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); } }关键注意事项
- 生产环境下,Webhook接收地址必须支持HTTPS
- 可通过PayPal后台的Webhook日志排查发送失败问题(如地址不可达、签名验证失败)
- 沙箱测试需使用沙箱商家账号配置Webhook,搭配沙箱买家账号完成支付测试
内容的提问来源于stack exchange,提问作者Hijacker
相关产品推荐
相关产品推荐

