支付综合体即积分如何获取小B商户交易信息
结论
仅凭“商圈圈选关系”,不能直接获取所有小B商户的支付宝交易成功信息。
支付宝会按照商户、应用和服务商授权关系隔离交易数据。如果小B商户使用自己的直连或间连支付渠道,交易并非由己方应用发起,那么:
- 交易成功通知不会发送到己方应用网关。
- 己方无法为其他支付应用指定
notify_url。 - 交易查询接口也不能用于遍历这些商户的全部交易。
要实现即时积分,相关商户或其支付服务商必须参与数据接入。实时场景通常需要统一接入支付链路,再转发交易通知;如果允许延迟入账,也可以在商户授权后下载账单,作为非实时补偿。
为什么收不到交易通知
notify_url 是支付请求的公共参数,由发起交易的应用或支付服务商在调用支付接口时指定。支付宝根据该笔交易所属的应用、商户和授权关系发送通知。
把小B商户加入商圈,并不会让支付宝自动把该商户的交易通知复制给商圈运营方。即使订阅了交易成功类消息,也只能收到当前应用有权接收的事件,无法跨应用监听其他商户的独立交易。
这既取决于支付产品的链路设计,也受到交易数据权限和隐私隔离要求的限制。
推荐方案:统一接入或由支付渠道转发
实时积分场景下,可以让参与商户的支付交易经过统一的支付服务商、收银系统或可控的支付接入层。
处理流程如下:
- 小B商户接入统一支付应用,或授权服务商代为调用支付接口。
- 发起支付时,把
notify_url设置为统一的支付回调地址。 - 回调服务验签,并核对交易状态、金额和商户身份。
- 根据支付宝商户号等标识,将交易映射到商圈内对应的小B商户。
- 生成积分流水,通过幂等机制防止重复发放。
- 定时调用交易查询或账单接口,完成对账和补偿。
如果小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必须由实际发起支付的一方配置,积分平台不能事后追加。- 不要通过轮询单笔查询接口扫描全部交易,该接口没有全量枚举条件。
- 异步通知可能重复、延迟或乱序,积分流水必须支持幂等处理。
- 退款、撤销和部分退款会影响最终积分,需要同时设计积分扣减或冻结规则。
- 支付宝交易号、用户标识和金额等属于敏感业务数据,应取得必要授权,并控制其存储、使用和传输范围。
- 如果“支付综合体即积分”产品提供专用交易回流接口,应以当前应用实际开通的接口清单为准,不能把普通消息订阅能力当作跨商户交易汇总能力。
备注:内容仅供参考。
