PayPal订阅场景下,PAYMENT.SALE.COMPLETED能否传递plan_id与custom_id?
PayPal Webhook 事件参数与订阅关联方案
核心参数归属问题
PAYMENT.SALE.COMPLETED事件不会直接返回plan_id和custom_id,这两个字段仅在BILLING.SUBSCRIPTION.*系列事件(如BILLING.SUBSCRIPTION.CREATED、BILLING.SUBSCRIPTION.PAYMENT.COMPLETED等)中携带。
自动计费场景的数据库更新方案
不用纠结PAYMENT.SALE.COMPLETED,结合订阅专属事件处理更可靠:
- 先通过
BILLING.SUBSCRIPTION.CREATED记录关联关系- 用户首次订阅时,该事件会返回
plan_id、custom_id(你前端设置的用户标识)和关键的subscription_id。 - 把这三个值关联存入数据库,比如建一张
subscriptions表,字段包含subscription_id、user_id(对应custom_id)、plan_id等。
- 用户首次订阅时,该事件会返回
- 用
BILLING.SUBSCRIPTION.PAYMENT.COMPLETED处理自动扣款更新- 订阅周期扣款成功后,PayPal会触发这个事件,且携带
subscription_id。 - 通过
subscription_id直接从数据库查询对应的用户和计划信息,完成数据库更新(比如更新最后支付时间、延长会员有效期)。 - 这个事件完全贴合订阅场景,比
PAYMENT.SALE.COMPLETED更直接高效。
- 订阅周期扣款成功后,PayPal会触发这个事件,且携带
试用期无法测试的解决办法
如果当前环境没法触发实际支付事件:
- 用PayPal开发者后台的沙盒环境,模拟订阅全流程,包括试用期结束后的自动扣款,以此测试所有事件的参数返回。
- 暂时用
BILLING.SUBSCRIPTION.ACTIVATED过渡,当订阅从试用期转为正式计费时会触发该事件,同样能拿到subscription_id关联用户。
若必须使用PAYMENT.SALE.COMPLETED的关联方式
如果一定要依赖这个事件,可通过以下步骤关联:
- 事件返回的
parent_payment字段是支付ID,调用PayPal支付详情API(GET /v1/payments/payment/{payment_id}),从结果中提取subscription_id,再通过它关联到用户和计划。 - 这种方法需要额外API调用,不如订阅专属事件高效,仅作为备选方案。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

