PAYATHON 2026

手机网站支付中如何及时发现支付宝商户账户被风控?

支付小周

结论

alipay.trade.wap.pay 调用成功并生成支付链接,只能说明请求参数、签名和网关调用基本正常,不能证明商户账户当前可以正常收款。账户限额、投诉处置和其他风控措施,可能要到用户进入收银台、提交付款或后续处理时才会生效。

所以,不能用“成功取得支付链接”检查账户是否健康。建议采用以下方案:

  1. 接收并校验支付宝同步响应中的错误信息;
  2. 根据异步通知和 alipay.trade.query 查询结果监控实际支付结果;
  3. 针对连续支付失败、成功率骤降、订单长期未支付等情况设置告警和熔断;
  4. 接入支付宝商家平台提供的站内信、短信和邮件等通知;
  5. 如果需要确认账户级风控状态,应向支付宝核实当前签约产品是否提供专门的通知或查询能力,不要自行假设存在通用的“风控状态查询接口”。

为什么生成支付链接时发现不了风控

手机网站支付接口主要负责生成收银台跳转页面。调用接口时,支付宝可能只检查以下内容:

  • 应用身份和签名是否合法;
  • 必填参数是否完整;
  • 请求格式是否正确;
  • 商户和应用是否具备基本的产品调用权限。

具体的交易检查可能要等到用户打开收银台或确认付款时才会执行,例如:

  • 当前商户账户或交易超过限额;
  • 账户因投诉被限制部分收款能力;
  • 某类交易触发实时风控;
  • 买家、设备、资金渠道或交易环境受到限制。

即使 pageExecute 成功返回 HTML 或跳转地址,也不能证明后续付款一定可以完成。

建议的监控流程

1. 完整记录支付接口响应

调用 alipay.trade.wap.pay 时,应记录:

  • out_trade_no;
  • 商户账户或支付宝应用标识;
  • 调用时间;
  • 网关返回的 code、sub_code、msg、sub_msg;
  • SDK 抛出的异常;
  • 请求链路追踪 ID。

出现同步返回错误时,不要只看 HTTP 状态码。分析支付宝业务错误通常还需要结合 code 和 sub_code。

不能根据某个未经确认的错误码直接认定账户受到风控。错误码的具体含义应以实际响应和当前支付宝官方文档为准。

2. 以异步通知作为支付成功的主要依据

订单支付成功后,通过 notify_url 接收支付宝异步通知并完成签名校验。验签通过后,还要确认商户号、金额、订单号等重要字段与本地记录一致,才能更新订单状态。

Map<String, String> params = request.getParameterMap().entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> entry.getValue()[0]
    ));

boolean verified = AlipaySignature.rsaCheckV1(
    params,
    alipayPublicKey,
    StandardCharsets.UTF_8.name(),
    signType
);

if (!verified) {
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    return;
}

String outTradeNo = params.get("out_trade_no");
String tradeStatus = params.get("trade_status");
String totalAmount = params.get("total_amount");
String appId = params.get("app_id");
String sellerId = params.get("seller_id");

// 还应校验 app_id、seller_id、total_amount 与本地订单是否一致。
if ("TRADE_SUCCESS".equals(tradeStatus)
        || "TRADE_FINISHED".equals(tradeStatus)) {
    markOrderPaidIdempotently(outTradeNo, params.get("trade_no"));
}

response.getWriter().write("success");

异步通知只能证明已经完成的交易状态。没有收到通知,不等于账户受到风控。用户未付款、网络延迟或通知投递异常也可能造成这种情况。

3. 对未完成订单主动调用交易查询

如果用户已经打开收银台,但订单在预期时间内仍未收到支付成功通知,可以调用 alipay.trade.query 补查。

AlipayTradeQueryRequest queryRequest = new AlipayTradeQueryRequest();
queryRequest.setBizContent(
    "{\"out_trade_no\":\"" + escapeJson(outTradeNo) + "\"}"
);

AlipayTradeQueryResponse queryResponse = alipayClient.execute(queryRequest);

if (!queryResponse.isSuccess()) {
    recordQueryFailure(
        merchantAccountId,
        outTradeNo,
        queryResponse.getCode(),
        queryResponse.getSubCode(),
        queryResponse.getMsg(),
        queryResponse.getSubMsg()
    );
} else {
    switch (queryResponse.getTradeStatus()) {
        case "TRADE_SUCCESS":
        case "TRADE_FINISHED":
            markOrderPaidIdempotently(
                outTradeNo,
                queryResponse.getTradeNo()
            );
            break;
        case "WAIT_BUYER_PAY":
            keepOrderPending(outTradeNo);
            break;
        case "TRADE_CLOSED":
            markOrderClosed(outTradeNo);
            break;
        default:
            recordUnknownTradeStatus(
                outTradeNo,
                queryResponse.getTradeStatus()
            );
    }
}

查询任务应限制重试次数并采用退避策略,避免高频轮询每笔未支付订单。

建立账户级异常检测

单笔支付失败不能直接证明商户账户受到风控。可以为每个商户账户设置滚动时间窗口,统计:

  • 支付链接生成次数;
  • 收银台访问次数;
  • 成功支付笔数;
  • 支付成功率;
  • 同类 sub_code 的出现次数;
  • WAIT_BUYER_PAY 超时比例;
  • 与历史基线相比的成功率跌幅;
  • 多个不同买家是否同时出现相同异常。

例如,可以组合以下条件:

最近 5 分钟有效支付尝试 >= 20
AND 支付成功率较历史基线显著下降
AND 相同业务错误在多个不同订单中连续出现

达到告警阈值后,先把账户标记为 SUSPECTED。只有收到明确的账户限制信息,或异常持续并达到更严格的阈值时,才切换为 DISABLED。

if (metrics.hasConfirmedAccountRestriction()) {
    disableMerchantAccount(accountId, "confirmed_alipay_restriction");
} else if (metrics.hasRepeatedCrossOrderFailures()
        && metrics.hasAbnormalSuccessRateDrop()) {
    markMerchantAccountSuspected(accountId);
    alertOnCall(accountId, metrics);
}

阈值应根据商户自身的交易量和正常转化率设定。低交易量账户不适合只按百分比判断,否则用户主动放弃一两笔付款就可能触发误报。

熔断后的处理

账户被判定异常后,可以使用可恢复的状态机:

ACTIVE → SUSPECTED → DISABLED → MANUAL_REVIEW → ACTIVE

进入 DISABLED 后,可以采取以下措施:

  • 停止创建新的支付宝支付订单;
  • 向用户显示“当前支付渠道暂不可用”;
  • 切换到已经完成签约且合规的备用支付渠道;
  • 继续处理已有订单的异步通知和查询任务;
  • 通知运营人员登录支付宝商家平台核实情况;
  • 经人工确认恢复后,再以小流量逐步放开。

不要通过频繁更换账户、拆分交易或其他方式规避支付宝的风险控制。备用账户和备用渠道必须具备合法的主体关系、有效签约和相应业务资质。

平台通知与官方能力

技术监控可以较快发现“交易表现异常”,但不一定能准确判断具体的风控原因。还应检查支付宝商家平台提供的以下信息:

  • 站内通知;
  • 风险或投诉提醒;
  • 短信、邮件通知;
  • 账户限额及产品权限提示;
  • 客服或工单反馈。

不同商户主体、签约产品和接入模式支持的通知能力可能不同。如果业务要求在用户付款前准确获知账户级限制状态,应向支付宝技术支持或签约渠道确认,当前产品是否有适用的专用接口、消息通知或服务能力。在得到官方确认前,不要把交易查询接口当作账户风控查询接口。

注意事项

  • 不要把 alipay.trade.wap.pay 能否成功生成链接作为健康判断依据。
  • 不要只依赖前端 return_url,用户可能关闭页面,也可能伪造请求。
  • 异步通知必须验签,同时校验订单号、金额、应用和收款方信息。
  • 更新支付状态时必须保证幂等。
  • 监控数据应按商户账户、应用和支付渠道分别聚合。
  • 原始错误响应应在脱敏后保存,以便排查问题和提交支付宝工单。
  • 自动熔断必须提供人工恢复入口,避免短时网络故障导致账户长期停用。
  • 不要通过自动发起真实付款探测账户状态,以免造成虚假交易、资金损失或合规风险。

备注:内容仅供参考。