You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:如何捕获并处理Stripe的ACH验证错误

解决Stripe ACH验证错误无法捕获的问题

看起来你遇到的核心问题是没有正确捕获Stripe抛出的自定义异常。Stripe的API错误都是它自己定义的异常类,不是普通的Exception,如果没导入对应的异常类或者捕获范围不对,就抓不到这些错误。

第一步:导入Stripe的异常类

首先要确保你在代码顶部导入了Stripe的错误类,尤其是你看到的CardError(虽然这里是ACH验证,但Stripe会用这个类处理支付相关的验证错误):

from stripe.error import CardError, StripeError

第二步:用try-except包裹验证逻辑

把你的verify调用放在try块里,针对性捕获Stripe的异常。这里要注意,verify方法是直接抛出异常的,所以必须把它放在try范围内:

# 先获取银行账户对象
bank_account_response = customer.sources.retrieve(request.stripe_id)

try:
    # 注意:Stripe要求验证金额是整数(单位为分,比如$0.05要传5),所以先转换参数类型
    deposit_1 = int(request._post['deposit_1'])
    deposit_2 = int(request._post['deposit_2'])
    bank_account_response.verify(amounts=[deposit_1, deposit_2])
except CardError as e:
    # 处理金额不匹配这类具体的验证错误
    print(f"ACH验证失败:{e.user_message}")
    # 这里可以添加日志记录、返回友好错误提示给用户等逻辑
except StripeError as e:
    # 捕获其他Stripe API相关错误(比如权限问题、网络超时)
    print(f"Stripe API请求错误:{e}")
except Exception as e:
    # 兜底捕获非Stripe的其他错误(比如参数转换失败)
    print(f"未知错误:{e}")

关键注意点

  1. 参数类型转换:Stripe要求验证金额是整数(单位为分),如果你的request._post返回的是字符串,一定要先转成int,否则可能会触发额外的类型错误。
  2. 异常捕获顺序:要先捕获具体的CardError,再捕获通用的StripeError,最后用Exception兜底,避免更具体的异常被覆盖。
  3. Stripe版本检查:如果你的Stripe SDK版本比较旧,可能异常结构有差异,建议升级到最新版本:
    pip install --upgrade stripe
    

为什么之前捕获失败?

大概率是这两个原因:

  • 没有导入stripe.error.CardError,导致except块找不到这个异常类,直接跳过;
  • 没有把verify的调用放在try块范围内(比如之前可能只包裹了retrieve,但错误出在verify)。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:37