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}")
关键注意点
- 参数类型转换:Stripe要求验证金额是整数(单位为分),如果你的
request._post返回的是字符串,一定要先转成int,否则可能会触发额外的类型错误。 - 异常捕获顺序:要先捕获具体的
CardError,再捕获通用的StripeError,最后用Exception兜底,避免更具体的异常被覆盖。 - Stripe版本检查:如果你的Stripe SDK版本比较旧,可能异常结构有差异,建议升级到最新版本:
pip install --upgrade stripe
为什么之前捕获失败?
大概率是这两个原因:
- 没有导入
stripe.error.CardError,导致except块找不到这个异常类,直接跳过; - 没有把
verify的调用放在try块范围内(比如之前可能只包裹了retrieve,但错误出在verify)。
内容的提问来源于stack exchange,提问作者Micah Pearce
相关产品推荐
相关产品推荐

