客户在银行侧撤销SEPA授权后 Stripe 如何停止后续扣款
客户向开户银行撤销 SEPA 直接借记授权后,Stripe 并不会即时收到一条独立的撤销通知,而是在下一次扣款尝试失败时才得知这一变化,随后把该授权标记为 inactive 并发出 mandate.updated 事件;要彻底阻止这个支付方式被再次使用,还需要把 PaymentMethod 从 Customer 上解绑,之后的付款必须取得新的授权。平台侧看到的不是“撤销通知”,而是一次失败的扣款加上一次授权状态的更新,这就是银行侧撤销在系统里的落地方式。
任务:在一次扣款失败后把授权状态与支付方式处理干净
假设平台已经通过 SEPA 直接借记向某客户扣过款,客户随后联系银行撤销了授权。平台要做的不是等待某条专门的撤销消息,而是按下面的机制处理。
第一步是识别失败原因。SEPA 直接借记可能因余额不足、账户关闭或受限、银行信息无效、授权被撤销或缺失、银行处理错误等原因失败。平台应读取 Charge.failure_code 与 Charge.failure_message 判断具体原因,与授权撤销相关的情形会体现在失败信息里。多数失败发生在发起扣款后的 6 个工作日内,少数情况下会更晚出现,并以争议的形式呈现。因此文档的谨慎提示是:至少等待 6 个工作日,再把一笔 SEPA 直接借记视为成功。这个时间限定只用于判断扣款结果,不应被理解为银行通知 Stripe 的时效。
第二步是确认 Stripe 已经更新授权状态。当银行侧的撤销导致扣款尝试失败时,Stripe 会把对应的 Mandate 标记为 inactive,并发送 mandate.updated webhook 事件。平台应监听该事件并据此更新自己系统里的授权记录,而不是继续把旧授权当作可用状态。需要注意,Mandate 的详细信息不在 Dashboard 中展示;要查看某个授权,先从 Charge.payment_method_details.sepa_debit.mandate 取得 mandate ID,再用它检索 Mandate。
第三步是阻止该支付方式被继续使用。把授权标记为 inactive 只反映状态,并不自动让这个 PaymentMethod 无法再被发起扣款。要防止后续使用,需要在 Dashboard 中或通过 PaymentMethods API 把该 PaymentMethod 从 Customer 上解绑(detach)。完成解绑后,若客户仍要使用 SEPA 直接借记,必须重新建立新的授权。
平台侧应落实的两个动作
把上述机制落到运营上,平台需要做两件事。一是把 mandate.updated 纳入 webhook 处理流程,收到后核对对应 Mandate 的状态并同步到本地授权表,避免用失效授权继续排期扣款。二是把“解绑 PaymentMethod”作为撤销处理的标准步骤,而不是只依赖授权状态字段;文档明确指出,解绑才是防止该支付方式未来被使用的动作。
边界说明
以上描述的是 Stripe 在扣款失败时得知银行侧撤销、更新授权并发出事件的处理机制,以及平台应配合的解绑动作。它不涉及银行在客户撤销后多久通知 Stripe,也不构成对任何具体账户、地区或版本的时效承诺;实际失败时点与结果仍以 Charge.failure_code、Charge.failure_message 和对应 Mandate 的状态为准。