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

PHP集成Stripe Webhooks实现IPN功能异常求助

排查Stripe Webhooks(IPN替代方案)失效的分步指南

嘿,我来帮你理一理这个问题——首先得明确:Stripe官方的Webhooks就是用来替代传统IPN的方案,咱们一步步排查哪里出了问题:


1. 先理清前端表单和Webhooks的区别

你现在用的是旧版Stripe Checkout(checkout.js),这个前端组件会在用户完成支付后,把数据提交到你指定的stripe.php,但这不是Webhooks——Webhooks是Stripe服务器主动推送给你后端的通知,和前端表单提交完全是两码事。

首先要确认你的stripe.php后端有没有正确完成支付流程:

  • 你必须用Stripe PHP SDK在后端调用支付创建/确认接口,比如旧版的\Stripe\Charge::create(),或者新版的\Stripe\PaymentIntent::confirm(),只靠前端表单提交是没法完成完整支付的。
  • 如果后端没正确生成支付记录,Stripe根本不会触发对应的Webhook事件(比如charge.succeeded或payment_intent.succeeded)。

2. 检查Webhook的基础配置是否正确

这是最容易踩坑的地方:

  • 确认端点URL和事件订阅:
    登录Stripe Dashboard,进入「开发者 > Webhooks」,检查你添加的端点URL是否和实际接收地址一致(比如https://你的域名/ipn/stripe/webhook.php),注意测试环境可以用内网穿透工具,生产环境必须用HTTPS。同时要确保你勾选了需要监听的事件(比如支付成功的事件)。
  • 必须验证Webhook签名:
    Stripe会给每个Webhook请求带上Stripe-Signature头,你必须在后端验证这个签名,防止伪造请求。你的Webhook处理代码(比如webhook.php)一定要包含签名验证逻辑,示例代码如下:
    require_once 'vendor/autoload.php';
    \Stripe\Stripe::setApiKey('你的测试密钥sk_test_xxx');
    
    // 获取原始请求体,不能用$_POST!
    $payload = @file_get_contents('php://input');
    $sigHeader = $_SERVER['HTTP_STRIPE_SIGNATURE'];
    $webhookSecret = '从Stripe Dashboard复制的Webhook签名密钥';
    
    try {
        $event = \Stripe\Webhook::constructEvent(
            $payload, $sigHeader, $webhookSecret
        );
    } catch (\UnexpectedValueException $e) {
        // 请求体无效,返回400
        http_response_code(400);
        exit;
    } catch (\Stripe\Exception\SignatureVerificationException $e) {
        // 签名验证失败,返回400
        http_response_code(400);
        exit;
    }
    
    // 处理不同类型的事件
    switch ($event->type) {
        case 'payment_intent.succeeded':
            $paymentIntent = $event->data->object;
            // 这里写你的业务逻辑,比如更新订单状态、给用户发通知
            break;
        // 可以添加其他需要处理的事件类型
    }
    
    // 一定要返回200,告诉Stripe你已经收到通知
    http_response_code(200);
    
    重点提醒:必须用php://input获取原始请求体,$_POST无法解析Stripe发送的JSON格式请求。

3. 测试Webhook是否能正常接收请求

  • 用Stripe Dashboard发送测试事件:
    在Webhook端点详情页,点击「发送测试事件」,选择一个测试事件(比如payment_intent.succeeded),发送后查看你的后端是否收到请求,并且返回200状态码。如果返回4xx/5xx,说明后端代码有报错。
  • 查看服务器日志:
    检查你的服务器访问日志和错误日志,看看Stripe的请求是否到达了后端,有没有PHP语法错误、权限不足之类的问题。

4. 验证前端Checkout配置是否正确

你的前端代码里,data-amount必须是以分为单位的整数(比如10美元要写1000),如果格式错误,可能导致支付无法完成,自然不会触发Webhook事件。另外要确保data-key是正确的测试公钥(pk_test_开头)。


最后提个小建议:旧版的checkout.js已经被Stripe弃用了,建议后续迁移到新版的Stripe Elements,它更灵活也更安全,但上面的Webhook排查步骤对新版同样适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:08