ACH 返回码 R01–R85:支付系统里每一条失败该怎么处理
ACH 支付失败时,你的 API 不会只返回一个笼统错误。美国自动清算协会(Nacha)定义了 85 个特定返回码——每个都精确告诉你一笔借记或贷记条目为什么被拒绝。理解这些码是构建可靠支付系统的前提:让系统优雅恢复,而不是把钱留在悬空状态。
为什么 ACH 返回码重要
ACH 以两天结算周期运作。你今天发起的支付可能明天或后天被退回。退回时,系统必须判断问题是临时的(可重试)、永久的(改道其他渠道)、还是需要客户操作(催缴)。Nacha 返回码范围是 R01 到 R85,每个码是三字符字符串,对应特定拒绝原因。分不清 R01(余额不足)和 R03(无此账户)的区别,意味着你会无限重试永远不可能成功的支付,或漏掉本可以重试成功的支付。
常见返回码速查
| 码 | 原因 | 可重试? | 动作 |
|---|---|---|---|
| R01 | 余额不足 | 是 | 3–5 天后重试或催缴 |
| R02 | 账户已关闭 | 否 | 更新客户信息,改道其他渠道 |
| R03 | 无账户/无效账户 | 否 | 与客户核对账户信息 |
| R04 | 无效账户类型 | 否 | 确认是支票/储蓄账户 |
| R05 | 账户冻结 | 否 | 客户解冻后升级处理 |
| R07 | 授权被撤销 | 否 | 重新授权或用新账户 |
| R10 | 客户告知未授权 | 否 | 争议或重新授权 |
| R14 | 收款人已故 | 否 | 升级,可能需要法律行动 |
| R16 | 账户涉法律程序 | 否 | 升级到合规 |
| R20 | 非交易账户 | 否 | 改道替代支付方式 |
| R29 | 企业客户告知未授权 | 否 | 企业层面重新授权 |
处理 R01:余额不足
R01 是最常见的返回。客户余额在授权和结算之间跌了。正确响应:记录返回(带时间戳和原始条目 ID);3–5 个工作日后重试一次(资金可能已入账);重试再失败就触发催缴——邮件客户、提议重试或建议更小金额;2–3 次失败后把账户标记为高风险,未来打款需人工审批。
程序化解码:可重试 vs 不可重试
def handle_ach_return(return_code, payout_id, receiver_account):
"""Decode ACH return and decide next action."""
if return_code == "R01":
# Insufficient funds: retry-able
schedule_retry(payout_id, delay_days=3)
send_dunning_email(receiver_account)
return {"status": "retry_scheduled", "next_attempt": "+3 days"}
elif return_code in ["R02", "R03", "R04"]:
# Account closed or invalid: not retry-able
flag_account_invalid(receiver_account)
notify_customer_verify_account(receiver_account)
return {"status": "account_invalid", "action": "manual_review"}
elif return_code == "R10":
# Customer advises not authorized
flag_dispute(payout_id, return_code)
escalate_to_compliance(payout_id)
return {"status": "dispute_flagged"}
else:
# Other codes: escalate
escalate_to_support(payout_id, return_code)
return {"status": "escalated", "code": return_code}
不可重试码需要替代渠道
R02(账户已关闭)、R03(无账户)、R05(账户冻结)这类码意味着 ACH 对这个收款人永远不会有效。支付系统应:把账户标记为 ACH 不适用;提供替代方案——Visa Direct、RTP、支票或电汇;记录决策供审计和对账。
对账与时机
ACH 返回批量到达,通常在结算日后 1–2 个工作日。对账任务必须:解析返回文件(Nacha 格式或通过处理器 API);用 trace number 把返回条目匹配到原始打款记录;解码返回码并触发对应处理器;更新支付状态(如 status = "returned", return_code = "R01")。多数处理器提供返回通知的 webhook 或 API 端点,接上它,把返回处理放进自动化流程而不是人工盯。
工程要点总结:返回处理的核心是把"可重试/不可重试/需客户动作"三分清楚,重试有上限、失败有升级路径、对账有可审计记录——三条都做到,ACH 失败就从事故变成日常流程。
来源:ACH Return Codes Explained: R01–R85 and How to Handle Them in Production - DEV Community