PAYATHON 2026

支付综合体即积分如何获取小B商户交易信息

支付阿杰

结论

仅凭“商圈圈选关系”,不能直接获取所有小B商户的支付宝交易成功信息。

支付宝会按照商户、应用和服务商授权关系隔离交易数据。如果小B商户使用自己的直连或间连支付渠道,交易并非由己方应用发起,那么:

  • 交易成功通知不会发送到己方应用网关。
  • 己方无法为其他支付应用指定 notify_url。
  • 交易查询接口也不能用于遍历这些商户的全部交易。

要实现即时积分,相关商户或其支付服务商必须参与数据接入。实时场景通常需要统一接入支付链路,再转发交易通知;如果允许延迟入账,也可以在商户授权后下载账单,作为非实时补偿。

为什么收不到交易通知

notify_url 是支付请求的公共参数,由发起交易的应用或支付服务商在调用支付接口时指定。支付宝根据该笔交易所属的应用、商户和授权关系发送通知。

把小B商户加入商圈,并不会让支付宝自动把该商户的交易通知复制给商圈运营方。即使订阅了交易成功类消息,也只能收到当前应用有权接收的事件,无法跨应用监听其他商户的独立交易。

这既取决于支付产品的链路设计,也受到交易数据权限和隐私隔离要求的限制。

推荐方案:统一接入或由支付渠道转发

实时积分场景下,可以让参与商户的支付交易经过统一的支付服务商、收银系统或可控的支付接入层。

处理流程如下:

  1. 小B商户接入统一支付应用,或授权服务商代为调用支付接口。
  2. 发起支付时,把 notify_url 设置为统一的支付回调地址。
  3. 回调服务验签,并核对交易状态、金额和商户身份。
  4. 根据支付宝商户号等标识,将交易映射到商圈内对应的小B商户。
  5. 生成积分流水,通过幂等机制防止重复发放。
  6. 定时调用交易查询或账单接口,完成对账和补偿。

如果小B商户必须沿用现有渠道,就需要渠道服务商先接收支付宝通知,再把经过授权的交易结果转发给积分平台。转发接口应包含交易号、商户标识、实付金额、支付时间、退款状态等必要字段,并进行签名认证。

如果原有渠道无法改造,平台无法取得商户授权,渠道方也不提供数据转发,就没有合规的技术手段实时获取这些交易。

异步通知处理示例

下面是 Java SDK 的典型验签方式。实际字段和 SDK 调用方式应以当前接入产品及支付宝开放平台文档为准。

@PostMapping("/alipay/notify")
public String handleNotify(HttpServletRequest request) throws Exception {
    Map<String, String> params = new HashMap<>();

    request.getParameterMap().forEach((key, values) -> {
        if (values != null && values.length > 0) {
            params.put(key, values[0]);
        }
    });

    boolean verified = AlipaySignature.rsaCheckV1(
        params,
        ALIPAY_PUBLIC_KEY,
        "UTF-8",
        "RSA2"
    );

    if (!verified) {
        return "failure";
    }

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

    if ("TRADE_SUCCESS".equals(tradeStatus)
            || "TRADE_FINISHED".equals(tradeStatus)) {

        // 1. 根据 sellerId 等信息确认商户属于目标商圈
        // 2. 校验 app_id、金额、订单号和收款方
        // 3. 以 tradeNo 或业务流水号执行幂等处理
        // 4. 写入交易流水并发放积分
    }

    return "success";
}

验签并检查 trade_status 还不够,至少还要核对:

  • app_id 是否为预期应用。
  • seller_id 是否属于已授权、已入驻的商户。
  • out_trade_no 是否存在于己方业务系统。
  • total_amount 是否与订单金额一致。
  • trade_no 是否已经处理。
  • 通知对应的商圈和积分规则是否仍然有效。

只有业务处理成功后,才能返回字符串 success。否则,支付宝可能继续重试通知。

商户授权后的交易核验

如果平台已经获得小B商户授权,并持有有效的 app_auth_token,可以在已知 trade_no 或 out_trade_no 时调用 alipay.trade.query 核验交易:

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
  "trade_no": "2026xxxxxxxxxxxxxxxx"
}
""");

AlipayTradeQueryResponse response =
    alipayClient.execute(request, null, appAuthToken);

if (response.isSuccess()) {
    String tradeStatus = response.getTradeStatus();
    String totalAmount = response.getTotalAmount();
    String sellerId = response.getSellerId();

    // 核对交易状态、金额和收款商户后,再决定是否发放积分
}

这是单笔查询接口。调用前需要知道支付宝交易号或商户订单号,不能用它枚举某个商户的全部交易。

非实时补偿:授权后下载账单

如果业务允许延迟入账,可以让每个商户授权服务商应用,再按商户申请交易账单下载地址:

AlipayDataDataserviceBillDownloadurlQueryRequest request =
    new AlipayDataDataserviceBillDownloadurlQueryRequest();

request.setBizContent("""
{
  "bill_type": "trade",
  "bill_date": "2026-09-08"
}
""");

AlipayDataDataserviceBillDownloadurlQueryResponse response =
    alipayClient.execute(request, null, appAuthToken);

if (response.isSuccess()) {
    String downloadUrl = response.getBillDownloadUrl();

    // 及时下载并解析账单
    // 按商户、交易号和业务日期执行对账及积分补发
}

账单下载适合用于对账、漏单补偿和延迟积分,不能替代实时支付成功通知。账单的开放范围、可查询日期和授权要求,应以对应应用实际获批的能力为准。

直连与间连场景的处理差异

直连商户通常需要逐户完成第三方应用授权,积分平台再使用相应的 app_auth_token 调用已获授权的接口。

间连商户的交易可能由支付服务商应用发起,此时应由该服务商提供交易通知转发、订单查询或对账数据接口。即使小B商户已经同意接入,也不代表积分平台一定能直接查询其上游服务商应用中的交易。还需要确认支付链路中实际使用的应用主体、收款主体和接口权限。

注意事项

  • 商户授权只解决接口访问权限,不会自动修改已有交易的 notify_url。
  • notify_url 必须由实际发起支付的一方配置,积分平台不能事后追加。
  • 不要通过轮询单笔查询接口扫描全部交易,该接口没有全量枚举条件。
  • 异步通知可能重复、延迟或乱序,积分流水必须支持幂等处理。
  • 退款、撤销和部分退款会影响最终积分,需要同时设计积分扣减或冻结规则。
  • 支付宝交易号、用户标识和金额等属于敏感业务数据,应取得必要授权,并控制其存储、使用和传输范围。
  • 如果“支付综合体即积分”产品提供专用交易回流接口,应以当前应用实际开通的接口清单为准,不能把普通消息订阅能力当作跨商户交易汇总能力。

备注:内容仅供参考。