You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Stripe测试与生产模式异常:Supabase边缘函数收不到支付成功事件

排查Supabase边缘函数在Stripe生产模式下无法接收支付成功事件的问题

针对你遇到的测试模式正常、生产模式仅支付成功事件无法触发Supabase边缘函数,退款事件正常,且使用Stripe Connect的问题,可以从以下几个方向逐一排查:

1. 核对Stripe生产环境Webhook配置

  • 确认生产Webhook已订阅支付成功相关事件:比如payment_intent.succeeded(核心支付完成事件)、charge.succeeded,如果是Connect场景,还要确认是否勾选了针对连接账户的该类事件(在Stripe Dashboard的Webhook设置里,Connect标签下的事件订阅)。
  • 检查Webhook签名密钥:必须使用Stripe生产环境的webhook secret,测试环境的密钥在生产模式下会导致签名验证失败,直接丢弃请求。
  • 查看Stripe事件日志:进入Stripe生产Dashboard的「Events」页面,搜索支付成功的事件,查看「Delivery status」:
    • 若显示「Failed」,点击详情查看失败原因(比如超时、签名错误、返回非2xx状态码);
    • 若显示「Success」,说明Stripe已发送请求,但函数未处理,需转向Supabase端排查。

2. 确认Stripe Connect事件的传递路径

  • 支付成功事件的归属:如果是连接账户发起的支付,事件可能默认发送到连接账户的Webhook,而非平台账户。你需要在Stripe Connect设置中开启「将所有连接账户事件转发到平台Webhook」,或者为连接账户单独配置Webhook端点(如果业务需要)。
  • 检查事件的account字段:生产环境的支付成功事件中,event.account会显示对应的连接账户ID,确认你的函数逻辑是否正确处理了带该字段的Connect事件,有没有遗漏判断导致跳过处理。

3. Supabase边缘函数生产环境排查

  • 查看生产环境函数日志:进入Supabase Dashboard的「Functions」页面,选中对应函数,切换到「Production」标签查看日志——注意生产日志可能不会实时显示,需要手动刷新或确认日志留存配置。
  • 验证签名验证逻辑:检查代码中是否正确读取了生产环境的STRIPE_WEBHOOK_SECRET环境变量,避免硬编码测试密钥的情况。如果签名验证失败,函数会直接返回400且不生成日志(除非你在catch块中添加了日志输出)。
  • 排查事件类型判断逻辑:确认代码中payment_intent.succeeded或对应支付事件的处理分支没有语法错误,比如拼写错误(比如写成payment_intent.success),或者有针对测试事件ID的过滤逻辑(比如判断event.id.startsWith('evt_test_')),导致生产事件被跳过。
  • 测试函数端点可用性:用curl模拟发送生产格式的事件请求到函数生产端点,验证是否能触发日志和数据库更新。示例curl命令(替换成你的参数):
curl -X POST https://<your-project-id>.functions.supabase.co/<your-function> \
  -H "Content-Type: application/json" \
  -H "Stripe-Signature: <your-test-signature>" \
  -d '{"id": "evt_123456789", "type": "payment_intent.succeeded", ...}'

4. 检查数据库与权限问题

  • 确认生产环境数据库角色权限:边缘函数使用的数据库角色是否有足够的权限执行更新操作?比如是否有UPDATE目标表的权限,测试环境的角色权限可能和生产不一致,导致更新失败但未抛出错误。
  • 检查函数返回状态码:Stripe要求Webhook返回2xx状态码,如果函数在处理支付成功事件时抛出未捕获的错误,会返回5xx,Stripe会重试,但如果是静默错误(比如返回200但未执行更新),需要在处理逻辑中添加日志输出,定位问题。

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

火山引擎 最新活动