转账到支付宝账户报 SECURITY_CHECK_FAILED 如何处理?
结论
当接口返回 40004: Business Failed,且 sub_code 为 SECURITY_CHECK_FAILED 时,说明请求已经到达支付宝,但未通过资金安全检查。这通常与签名格式、接口地址或网络无关,也无法通过修改参数或反复重试解决。
收到该错误后,应立即停止自动重试,保存完整响应和业务单号,并核实付款方、收款方及交易场景。随后由支付宝账户主体拨打客服热线 95188,或通过开放平台服务渠道申请核查。具体拦截规则属于支付宝风控体系,接口响应不会提供详细的命中原因。
错误含义
响应字段的含义如下:
40004:业务处理失败。支付宝已经接收并处理请求,但转账未完成。Business Failed:失败发生在业务处理阶段。SECURITY_CHECK_FAILED:交易未通过安全检查。- “当前操作可能存在风险”:支付宝根据账户状态、交易行为或收付款关系等信息中止了操作。
排查时应重点检查账户和交易的风险状态,不要反复修改签名代码。
可能原因
支付宝不会在该错误中返回具体的风控规则。以下内容只能作为常见排查方向,不能用来判断实际原因:
- 付款支付宝账户受到安全限制,例如登录环境、身份认证或资金操作状态存在异常。
- 收款账户状态异常,或收款信息与实际业务不一致。
- 短时间内的转账次数、金额或收款账户分布发生明显变化。
- 单笔或累计交易特征触发了支付宝的安全策略。
- 交易备注、业务场景或资金用途存在风险特征。
- 商户的实际使用场景不在签约产品允许的业务范围内。
- 商户、付款账户或收款账户需要补充认证或接受进一步的安全核验。
不要根据这些可能性自行拆单、频繁更换收款账户或调整金额来规避检查。这些操作可能触发更多风险控制。
处理步骤
1. 停止重复提交
收到 SECURITY_CHECK_FAILED 后,不要立即更换 out_biz_no,再次提交相同的转账。自动重试无法解除安全限制,还可能产生更多风险记录。
如果调用超时或没有取得明确结果,应先使用对应的查询能力确认原业务单状态。不能直接将其视为失败并重新转账。
2. 保存完整请求和响应信息
至少保留以下内容:
app_id- 接口名称
- 请求时间
out_biz_no- 转账金额
- 收款账户及收款方姓名(注意脱敏)
codesub_codemsgsub_msg- 支付宝返回的其他链路或请求标识(如实际响应中存在)
排查日志不得记录应用私钥、完整身份证号或其他敏感信息。
3. 检查基础业务信息
逐项确认以下内容:
- 付款账户可以正常使用,且没有待处理的安全验证。
- 收款支付宝账户真实有效。
- 收款方姓名与支付宝实名信息一致。
- 转账金额、备注和业务用途真实、合理。
- 当前业务属于”转账到支付宝账户”产品允许的使用范围。
- 商户签约、应用授权和账户绑定关系未发生变化。
如果所有请求都失败,应优先检查付款主体、应用或产品权限。若只有个别收款人或个别交易失败,则应重点检查相应的收款账户和交易特征。这些只是排查思路,最终原因仍以支付宝的核查结果为准。
4. 由账户主体联系支付宝
错误信息已经明确提示拨打 95188。联系支付宝时,建议准备以下信息:
- 支付宝账户信息
- 商户
app_id - 业务单号
out_biz_no - 失败时间
- 转账金额
- 脱敏后的收款账户
- 完整错误码及错误信息
- 实际业务用途说明
涉及账户安全时,支付宝可能只会向账户本人、企业法定代表人或授权经办人提供处理指引。
5. 完成核验后再重试
只有在支付宝确认账户状态正常,或要求完成的验证已经处理完毕后,才能再次发起转账。
重试前必须确认原订单没有成功。是否复用原 out_biz_no,应根据接口的幂等规则和支付宝提供的处理建议决定。不要为了重试而直接生成大量新的业务单号。
Java 处理示例
以下代码只演示如何对响应分类并进行相应的业务处理。具体请求类名称应以项目实际使用的支付宝 SDK 和接口为准。
AlipayFundTransToaccountTransferResponse response =
alipayClient.execute(request);
if (response.isSuccess()) {
// 转账成功,保存支付宝订单号和业务单号
saveSuccess(
response.getOutBizNo(),
response.getOrderId()
);
return;
}
String code = response.getCode();
String subCode = response.getSubCode();
String message = response.getSubMsg();
if ("40004".equals(code)
&& "SECURITY_CHECK_FAILED".equals(subCode)) {
// 风控失败不能自动重试,也不要通过拆单、更换账号等方式规避
saveManualReview(
request.getBizContent(),
code,
subCode,
message
);
alertOperator(
"支付宝安全检查失败,请核实原订单状态并联系 95188。"
);
return;
}
// 其他失败应根据 code 和 sub_code 分别处理
saveFailure(
request.getBizContent(),
code,
subCode,
message
);
生产系统可以将该错误标记为”人工处理”或”不可自动重试”,防止通用重试机制持续提交请求:
private boolean isRetryable(
String code,
String subCode) {
if ("SECURITY_CHECK_FAILED".equals(subCode)) {
return false;
}
// 其他错误是否允许重试,应按照对应接口文档和查询结果判断
return false;
}
注意事项
- 修改签名算法、字符集或请求网关通常无法解决该错误。此类配置异常一般会返回其他错误码。
- 不要通过拆分金额、修改备注或轮换收款账户等方式规避安全检查。
- 不要只根据客户端超时或异常判断转账失败。资金类接口应先查询原业务单状态。
out_biz_no是商户侧的重要幂等标识,必须保持唯一并持久化保存。- 不要向收款方承诺”稍后一定到账”。应先完成账户核验并确认交易结果。
- 风控规则可能随账户和交易情况动态变化,公开文档通常不会列出具体的命中条件。最终处理方式应以支付宝客服或开放平台对该笔交易的核查结果为准。
备注:内容仅供参考。
