PAYATHON 2026

手机网站支付收款笔数是否存在并发限制?

支付阿杰

明确结论

手机网站支付没有一个通用的“每秒最多收款多少笔”限制。每秒 10 余笔订单出现异常,不能说明支付产品存在固定的并发上限。问题更可能出在商户系统容量、接口调用方式、订单号冲突、数据库锁竞争等方面,也可能是支付平台针对特定商户、应用或接口设置了限流或风控。

具体限额取决于支付平台、接口类型、商户资质和应用配置。如果公开文档没有说明,就不要自行推断固定 TPS。先结合请求日志和错误码定位异常环节,再联系相应负责人处理。

优先排查哪些环节

先确认故障发生在支付链路的哪一侧:

  1. 商户订单创建失败
    检查应用服务器的 CPU、内存、线程池、连接池、数据库连接数和反向代理配置。

  2. 支付接口调用失败
    保存支付平台返回的错误码、错误信息、请求时间和请求标识,确认是否遇到限流、签名失败、重复订单或风控拦截。

  3. 支付成功但订单状态未更新
    检查异步通知处理、验签、幂等控制、数据库事务和回调响应时间。

  4. 部分请求超时
    分清是商户接口、支付网关还是前端等待超时。不能只根据用户页面显示的“支付失败”判断真实支付结果。

  5. 同一订单被并发提交
    每笔交易都要使用唯一的商户订单号,同时防止用户重复点击或客户端自动重试生成重复请求。

建议的解决步骤

1. 收集完整的异常证据

至少记录以下信息:

  • 异常发生时间,精确到秒;
  • 商户号、应用 ID 和接口名称;
  • 商户订单号;
  • 支付平台交易号;
  • HTTP 状态码;
  • 平台返回的业务错误码和错误信息;
  • 请求标识或链路追踪 ID;
  • 请求耗时;
  • 同一秒内的请求数、成功数、失败数和超时数。

日志中不要保存私钥、完整支付密码、完整银行卡号等敏感信息。

2. 进行可控的并发测试

使用彼此独立的测试订单号,从较低并发开始逐级增加,并观察:

  • 商户接口的平均耗时及 P95、P99 耗时;
  • 数据库连接池是否耗尽;
  • 是否出现锁等待、死锁或唯一键冲突;
  • Web 服务器是否返回 502、503、504;
  • 支付平台是否返回限流类错误;
  • 异步通知是否积压。

测试必须在获得授权的环境和时段内进行,不要直接对生产支付链路进行无控制压测。

3. 检查订单创建与回调逻辑

支付请求和异步通知都要具备幂等性。异步通知可能重复发送,也可能乱序到达,因此“收到一次通知”不等于“业务只处理一次”。

下面是一个简化的幂等处理示例:

@Transactional
public void handlePaymentNotification(PaymentNotification notification) {
    // 1. 必须先使用支付平台提供的验签方法验证通知
    verifySignature(notification);

    Order order = orderRepository.findByOrderNoForUpdate(
        notification.getOutTradeNo()
    );

    if (order == null) {
        throw new IllegalArgumentException("Order not found");
    }

    // 2. 校验商户、金额、币种和订单号
    if (!order.getAmount().equals(notification.getTotalAmount())) {
        throw new IllegalStateException("Payment amount mismatch");
    }

    // 3. 已处理的通知直接返回,保证幂等
    if (order.getStatus() == OrderStatus.PAID) {
        return;
    }

    // 4. 仅在平台明确表示支付成功时更新订单
    if (notification.isPaymentSuccessful()) {
        order.markPaid(notification.getTradeNo());
        orderRepository.save(order);
    }
}

实际项目应使用支付平台官方 SDK 验签,并按照对应接口文档返回规定的成功响应。示例中的字段名和成功状态判断不能直接照搬。

4. 检查基础设施容量

如果支付平台还没有收到请求,问题通常在商户侧。需要重点检查:

  • Nginx、网关或负载均衡器的连接数和超时配置;
  • 应用线程池和 HTTP 客户端连接池;
  • 数据库最大连接数和慢 SQL;
  • Redis 连接池和分布式锁;
  • 同步调用的库存、优惠券、短信等下游服务;
  • 容器实例数量和自动扩容策略。

不要靠无限增加线程数来解决问题。如果线程数超过数据库或下游服务的承载能力,超时和请求积压反而会更严重。

5. 通过查询接口确认最终状态

支付请求超时不代表交易失败。遇到超时或状态未知时,应调用支付平台提供的订单查询接口确认最终结果,并通过定时补偿任务处理未完成订单。

结果尚未确认时,不要立即更换商户订单号再次扣款,否则可能导致重复支付。

应该联系谁

如果异常发生在商户服务器、数据库或网关,应先由商户的后端研发、运维和数据库负责人排查。

如果日志表明请求已经到达支付平台,并持续返回限流、系统繁忙、风控或其他平台侧错误,应通过支付平台官方商户客服或开放平台技术支持提交工单。工单需要提供:

  • 商户号和应用 ID;
  • 使用的具体支付产品及接口名称;
  • 异常时间范围;
  • 脱敏后的商户订单号;
  • 平台返回码、请求标识和完整错误信息;
  • 每秒请求量和失败比例;
  • 是否可以稳定复现。

只有支付平台能够确认该商户或应用是否配置了特定频控、风控策略或接口容量限制。

注意事项

  • 不要因为前端页面卡顿,就认定支付平台存在并发限制。
  • 不要只统计同步跳转结果。订单状态应以验签后的异步通知或主动查询结果为准。
  • 商户订单号必须唯一,并应建立数据库唯一索引。
  • 重试应采用指数退避并限制次数,防止故障期间出现重试风暴。
  • 支付回调应尽快完成验签和状态落库,耗时业务可以转入消息队列异步执行。
  • 在支付平台明确答复前,不要对外宣称存在固定的“每秒 10 笔”限制。

备注:内容仅供参考。