PAYATHON 2026

商家账单数据查询及下载接口能否查询已授权商户的数据?

支付阿杰

明确结论

可以查询已授权商户的数据。通常不需要在请求参数中传入商家标识,平台会根据商户的授权凭证判断数据属于谁。

第三方应用需要分别保存每个授权商户的信息。查询保证金、余额或账单时,应使用目标商户对应的 access_token 发起请求,具体名称以平台文档为准。需要查询其他商户时,更换相应的商户授权凭证即可。

为什么接口没有商家标识字段

保证金、余额等属于商户敏感数据。这类接口一般通过授权上下文识别当前商户,不允许调用方直接提交 merchant_id、shop_id 等字段指定查询对象。

典型调用关系如下:

第三方应用
  ├─ 商户 A 的 access_token → 查询商户 A 的数据
  ├─ 商户 B 的 access_token → 查询商户 B 的数据
  └─ 商户 C 的 access_token → 查询商户 C 的数据

因此,接口没有商家标识字段通常是正常的。即使第三方应用获得了多个商户的授权,也不能只用应用自身的凭证查询所有商户,更不能随意修改商户编号来读取其他商户的数据。

部分平台还会要求提供应用级签名、app_key、时间戳等参数。这些参数用于确认请求来自哪个应用,商户级 access_token 则用于确认当前查询的是哪个已授权商户,两者用途不同。

正确的处理步骤

1. 接收并保存每个商户的授权结果

商户完成授权后,平台通常会返回授权码,应用再用授权码换取商户级访问凭证。建议按商户保存以下信息:

merchant_id
access_token
refresh_token
expires_at
授权状态
已授权权限范围

实际字段名称以及平台是否返回 merchant_id,请以对应开放平台的授权文档为准。

2. 确定本次需要查询的商户

业务系统发起账单查询前,应先确定目标商户,再从安全存储中读取该商户对应的有效 access_token。

选择商户不是在账单接口中临时添加一个文档未定义的参数,而是由应用内部完成,并通过最终使用的授权凭证体现。

3. 使用目标商户的授权凭证调用接口

以下代码仅展示通用调用方式,不代表任何平台的真实 URL、签名字段或参数名称:

async function queryMerchantBalance(merchantId) {
  const authorization = await loadAuthorizationByMerchantId(merchantId);

  if (!authorization) {
    throw new Error("该商户尚未授权");
  }

  const accessToken = await ensureValidAccessToken(authorization);

  const response = await fetch("https://open.example.com/api/merchant/balance/query", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${accessToken}`
    },
    body: JSON.stringify({
      // 仅填写接口文档规定的业务参数
    })
  });

  if (!response.ok) {
    throw new Error(`接口调用失败:HTTP ${response.status}`);
  }

  return response.json();
}

如果平台要求将令牌放在查询参数、请求体或自定义请求头中,应按官方文档规定的方式传递。例如:

{
  "access_token": "目标商户对应的访问凭证"
}

不要自行添加 merchant_id、shop_id 或其他接口文档未定义的字段。

4. 切换商户时更换授权凭证

查询商户 A 时,使用商户 A 的令牌:

await queryMerchantBalance("merchant_a");

查询商户 B 时,读取并使用商户 B 的令牌:

await queryMerchantBalance("merchant_b");

商户 A 的 access_token 不能用于查询商户 B 的余额,应用级令牌也不能代替商户授权令牌。

如果仍然无法查询

可以依次检查以下事项:

  1. 使用的是商户授权产生的 access_token,而不是应用自身的调用凭证。
  2. 当前令牌确实属于目标商户,没有因为数据库映射错误而串用。
  3. 令牌尚未过期;如果已经过期,是否按平台规则使用 refresh_token 完成刷新。
  4. 商户是否取消了授权。
  5. 应用是否申请并获得账单、余额或保证金接口所需的权限。
  6. 当前应用类型、商户类型和业务场景是否在该接口的开放范围内。
  7. 调用环境与授权环境是否一致,例如不要将正式环境的授权凭证用于沙箱接口。

注意事项

获得商户授权不代表应用可以调用所有财务接口。账单、余额和保证金接口可能需要单独申请权限,也可能对商户主体有额外要求,或只向特定类型的应用开放。最终能否调用,应以目标平台对应接口的权限说明和授权范围为准。

不同开放平台对凭证的命名和传递位置也不相同。在没有明确平台和接口文档的情况下,可以确定的是,这类不提供商家标识参数的接口通常通过商户级授权上下文识别数据。实际使用 access_token、其他授权令牌,还是签名中的授权字段,需要以具体接口文档为准。

备注:内容仅供参考。