服务商如何查询入驻商户的实时交易订单?
结论
服务商查询某个入驻商户的实时交易订单,一般要调用支付平台开放的“交易查询接口”。请求时,服务商使用自己的应用或机构身份完成鉴权,并指定入驻商户编号,同时传入商户订单号或平台交易号。
如果要持续、近实时地获取新订单,应以支付平台发送的交易结果通知为主,不宜频繁轮询查询接口。收到通知后,可以再调用查询接口核实订单状态。
问题中没有指定支付平台,因此无法确定具体的接口名称、请求地址和参数名。以下是通用实现方式,接入时应以对应平台的官方接口文档为准。
查询前提
服务商通常需要满足以下条件:
- 完成服务商或机构身份认证。
- 创建并配置开放平台应用。
- 入驻商户已与服务商建立授权、签约或绑定关系。
- 应用已获得交易查询权限。
- 配置好签名密钥、证书或访问令牌。
- 保存商户订单号、平台交易号和入驻商户编号之间的对应关系。
如果入驻商户没有授权服务商访问交易数据,即使服务商知道商户编号,通常也不能直接查询该商户的订单。
具体查询方式
1. 按商户订单号查询
创建交易时,服务商应保存自己生成的商户订单号。查询时一般需要提交:
- 服务商应用标识;
- 入驻商户编号;
- 商户订单号;
- 时间戳、随机数等公共参数;
- 请求签名或访问令牌。
这种方式适用于查询服务商系统中已有记录的订单。
2. 按平台交易号查询
支付平台成功受理交易后,通常会返回平台交易号。服务商保存该编号后,可以用它查询订单详情。
与商户订单号相比,平台交易号一般在支付平台内具有更明确的唯一性,但前提是服务商已经保存该编号。
3. 通过交易通知获取实时结果
交易支付成功、关闭或退款后,支付平台通常会向预先配置的通知地址推送结果。服务商收到通知后,应按以下步骤处理:
- 验证签名或证书。
- 检查通知中的入驻商户编号。
- 校验订单金额、币种和商户订单号。
- 对通知进行幂等处理。
- 更新本地订单状态。
- 对关键订单调用查询接口进行二次确认。
“实时订单”通常通过异步通知获取。查询接口更适合主动核验、补偿处理和状态恢复。
通用请求示例
以下示例只用于展示请求结构。接口地址和字段名称均为占位符,不能直接用于某个特定支付平台:
curl -X POST 'https://api.example.com/v1/trade/query' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"service_provider_id": "PROVIDER_ID",
"sub_merchant_id": "SUB_MERCHANT_ID",
"merchant_order_no": "ORDER_202609140001",
"timestamp": 1789344000,
"nonce": "RANDOM_STRING",
"signature": "REQUEST_SIGNATURE"
}'
服务端可以封装查询方法:
public TradeOrder queryOrder(
String subMerchantId,
String merchantOrderNo) {
TradeQueryRequest request = new TradeQueryRequest();
request.setSubMerchantId(subMerchantId);
request.setMerchantOrderNo(merchantOrderNo);
// 使用所接入支付平台提供的 SDK 发起请求。
TradeQueryResponse response = paymentClient.queryTrade(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
"订单查询失败:" + response.getErrorCode()
);
}
return response.getOrder();
}
其中,TradeQueryRequest、paymentClient.queryTrade() 等都是示意名称。实际接入时,需要替换为支付平台 SDK 中真实存在的类和方法。
查询结果处理
收到查询结果后,至少要核对以下内容:
- 入驻商户编号是否与目标商户一致;
- 商户订单号和平台交易号是否匹配;
- 订单金额及币种是否正确;
- 交易状态是支付成功、处理中、关闭还是失败;
- 支付时间和订单创建时间是否合理;
- 返回报文的签名或证书是否合法。
不能只根据 HTTP 状态码判断支付结果。HTTP 请求成功只能说明接口调用成功,并不代表订单已经支付。
如果需要查询订单列表
有些支付平台只支持“按订单号查询单笔交易”,不允许服务商按商户实时拉取全部订单。遇到这种情况,应在创建交易和接收通知时,将订单同步保存到服务商自己的数据库,再根据入驻商户编号、交易时间和状态进行查询。
如果平台提供交易账单或订单列表接口,也要留意数据可能存在延迟。这类接口通常更适合对账和历史统计,未必适合实时业务判断。
注意事项
- 不要绕过授权查询其他入驻商户的交易数据。
- 不要用高频轮询模拟实时通知,以免触发接口限流。
- 查询“处理中”的订单时,应采用退避重试,例如逐步延长重试间隔。
- 支付通知可能重复发送,业务处理必须保证幂等。
- 查询接口返回异常时,不要立即将订单判定为支付失败。
- 金额应使用整数最小货币单位或精确小数类型,避免浮点误差。
- 不得将访问令牌、私钥和证书写入前端代码或提交到代码仓库。
- 最终使用的接口地址、签名规则、商户标识字段及授权范围,必须以对应支付平台当前的官方文档为准。
备注:内容仅供参考。
