必须配置stripe webhook端点为/v1/webhooks/stripe,设置stripe_webhook_secret环境变量,启用dify内置stripe扩展,并将stripe customer.id映射到dify用户stripe_customer_id字段,才能实现订阅额度自动更新。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify中实现用户AI会员订阅额度随Stripe付款状态自动变化,必须让Dify后端能接收并验证Stripe发来的Webhook事件,再根据invoice.paid、customer.subscription.updated等事件类型更新对应用户的额度字段。
在Stripe后台配置Webhook端点
登录Stripe Dashboard → Developers → Webhooks → Add endpoint。
Endpoint URL填入你部署Dify服务的公网地址,路径必须为 【/v1/webhooks/stripe】(Dify默认只监听该路径,填错将收不到任何事件)。
选择发送事件:至少勾选 invoice.paid、customer.subscription.created、customer.subscription.updated、customer.subscription.deleted;其他如 payment_intent.succeeded 可选。
点击 “Save endpoint”,Stripe会立即向该URL发送测试签名请求——此时Dify若未启用Webhook路由或密钥未配置,将返回404或401,务必确认日志中有对应接收记录。
获取并配置Stripe webhook signing secret
在刚创建的Webhook详情页,点击 “Click to reveal” 查看 Signing secret,形如 whsec_abc123...xyz。
将该密钥写入Dify部署环境变量:【STRIPE_WEBHOOK_SECRET=whsec_abc123...xyz】;若使用docker-compose.yml,需在environment块中显式声明,漏写会导致所有事件校验失败,Dify直接丢弃请求。
重启Dify服务使环境变量生效——不重启,新密钥不会加载。
启用Dify内置Stripe Webhook处理器
Dify 0.11.0+ 版本已内置Stripe Webhook路由,无需额外开发接口。
确认Dify代码仓库中 api/app/extensions/ext_stripe.py 文件存在且未被注释或删除;若使用精简版镜像,可能默认未包含此扩展,需手动挂载或重建镜像。
检查Dify服务启动日志,搜索 “stripe webhook registered”,出现即表示路由已注册成功;若无此日志,说明扩展未加载,Webhook请求将全部返回404。
映射Stripe客户ID到Dify用户账户
第一步:在用户首次完成Stripe订阅时,调用Stripe API创建Customer对象,并将返回的 customer.id(如 cus_123abc)存入Dify数据库对应用户的 stripe_customer_id 字段。
第二步:确保Dify用户表(如 account 表)有且仅有一个非空、唯一索引字段用于关联,推荐使用 stripe_customer_id;若用邮箱映射,当用户更换邮箱或多个邮箱绑定同一订阅时会出错。
第三步:在Dify管理后台或SQL中验证至少1条真实数据——查一个已订阅用户,其 stripe_customer_id 必须与Stripe Dashboard里该用户Customer ID完全一致,字母大小写和前缀(cus_)都不能错。
第四步:Dify收到 invoice.paid 事件后,会自动解析payload中的 data.object.customer 值,按此ID查Dify用户,再更新其 remaining_quota 或自定义额度字段;若查不到匹配用户,整条事件会被静默忽略,不报错也不告警。
验证Webhook是否真正生效
方法一:在Stripe Dashboard的Webhook页面,找到刚配置的endpoint,点击 “Send test webhook”,选择 invoice.paid 事件类型发送。
方法二:用curl模拟真实请求,关键是要带正确签名头:curl -X POST http://your-dify-domain/v1/webhooks/stripe \ -H "Stripe-Signature: t=123456789,v1=abc...,v0=def..." \ -d '{"type":"invoice.paid","data":{"object":{"customer":"cus_123abc","lines":{"data":[{"plan":{"product":"prod_abc"}}]}}}}'。
方法三:在Dify服务器上运行 tail -f logs/api.log | grep stripe,观察是否输出类似 “Processing invoice.paid for cus_123abc” 的日志行;没有则说明请求未到达或被中间件拦截。
看到日志后,立刻登录Dify数据库,执行 SELECT remaining_quota FROM account WHERE stripe_customer_id = 'cus_123abc';,确认数值已按订阅套餐规则增加——例如月度Pro计划应加10000,错误值说明额度计算逻辑未触发或配置有误。











