PayPal订阅到期/过期时BILLING.SUBSCRIPTION.EXPIRED Webhook未触发咨询
PayPal
BILLING.SUBSCRIPTION.EXPIRED 事件未触发问题解答 核心触发规则
这不是你的配置错误,是PayPal Webhook的触发逻辑和多数开发者的默认认知不一致:
BILLING.SUBSCRIPTION.EXPIRED从来不会在订阅自然走完服务周期、无任何主动操作的场景下自动推送,它的合法触发场景只有两个:- 商户主动调用取消订阅API,且明确设置取消规则为「当前计费周期结束后生效」,等周期真正结束时会触发该事件
- 带自动续费的订阅,下一期费用扣款失败后,经过PayPal全流程重试仍然扣款不成功,才会触发该事件
- 如果你创建的是不带自动续费条款的固定时长订阅,服务周期自然结束时,PayPal不会推送任何到期相关的Webhook,哪怕你在沙盒后台已经看到订阅状态被标记为「已过期」。
沙盒测试的已知问题
沙盒环境对时间驱动的事件支持本身就不稳定:
- 就算是符合上述触发条件的场景,沙盒也经常出现后台状态已更新、但Webhook完全不推送的情况,这是沙盒的长期已知问题,和你的代码、配置无关,也不代表生产环境会出现同样问题。
- 测试EXPIRED事件接收逻辑时,不要等沙盒订阅自然走完周期,直接在沙盒后台手动触发订阅过期、模拟连续扣款失败到重试上限的场景,才能稳定收到对应推送。
实际落地建议
绝对不要单靠Webhook维护订阅状态,必须补充主动校验逻辑:
- 写定时cron任务,固定频率(建议每天1次)调用PayPal订阅查询接口,拉取所有有效订阅的最新状态,和本地存储的订阅状态做对齐同步
- Webhook只用来做状态变更的实时触发,所有收到的Webhook payload都要和接口查询到的官方状态做二次校验,避免漏推、伪造请求、推送延迟导致的业务状态错乱。
内容的提问来源于stack exchange,提问作者Robin Schambach
相关产品推荐
相关产品推荐

