PAYATHON 2026

如何通过 API 获取个人用户的流水账单或账户余额?

支付阿杰

结论

可以获取,但目标银行、支付机构或开放银行平台必须提供相应的 API,个人用户也要完成实名授权。普通开发者不能仅凭姓名、手机号或银行卡号查询他人的流水和余额。

商户支付 API 通常只能查询该商户参与的交易,无法读取用户完整的个人账单或银行卡余额。实际可用的功能,应以相关机构官方开放平台的文档和准入要求为准。

为什么不能直接查询

流水和余额是敏感金融数据,相关接口一般有以下限制:

  • 用户需要明确授权,部分场景还要求完成身份认证。
  • 调用方需要申请相应的数据访问权限。
  • 接口凭证需要与授权用户、账户和权限范围绑定。
  • 授权通常有有效期,用户也可以随时撤销。
  • 部分地区要求调用方持有金融牌照,或通过持牌数据服务机构接入。

因此,没有一个能查询所有个人银行账户的通用公开 API。

推荐的接入流程

1. 确认数据来源

先确定要查询哪家机构的数据,例如银行账户、电子钱包或第三方支付账户,然后检查其开放平台是否支持:

  • 账户列表查询
  • 账户余额查询
  • 交易明细或账单查询
  • OAuth 2.0 用户授权
  • Webhook 数据变更通知

还要确认该 API 是否向普通企业开放,是否需要签约、资质审核或付费。

2. 申请应用和权限

在开放平台注册应用,获取 client_id、客户端密钥或签名证书,并申请所需权限,例如:

accounts.read
balances.read
transactions.read

这些权限名称只是常见示例,接入时必须使用目标平台文档中定义的实际值。

3. 引导用户授权

常见流程是将用户跳转到金融机构的授权页面。用户登录后选择账户并确认授权,平台再将其重定向到预先登记的 redirect_uri,同时返回一次性授权码 code。

https://provider.example/authorize
  ?response_type=code
  &client_id=YOUR_CLIENT_ID
  &redirect_uri=https%3A%2F%2Fyour.example%2Fcallback
  &scope=accounts.read%20balances.read%20transactions.read
  &state=RANDOM_STATE

这里的域名和参数仅用于演示 OAuth 2.0 流程,并不对应任何真实机构的接口。

4. 换取访问令牌

后端收到授权码后,向令牌端点换取 access_token:

curl -X POST "https://api.provider.example/oauth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "grant_type=authorization_code" \
  --data-urlencode "code=AUTHORIZATION_CODE" \
  --data-urlencode "redirect_uri=https://your.example/callback" \
  --data-urlencode "client_id=YOUR_CLIENT_ID" \
  --data-urlencode "client_secret=YOUR_CLIENT_SECRET"

客户端密钥必须保存在服务端,不能写入网页、App 安装包或公开代码仓库。

5. 查询账户和余额

一般要先获取用户已经授权的账户标识,再查询对应账户的余额:

const response = await fetch(
  `https://api.provider.example/accounts/${encodeURIComponent(accountId)}/balance`,
  {
    headers: {
      Authorization: `Bearer ${accessToken}`,
      Accept: "application/json"
    }
  }
);

if (!response.ok) {
  throw new Error(`Balance request failed: ${response.status}`);
}

const balance = await response.json();
console.log(balance);

不同平台可能分别返回账面余额、可用余额和冻结金额等字段。核对字段定义之前,不能把这些数据视为同一个数值。

6. 分页查询交易流水

流水接口通常要求指定时间范围,并使用游标或页码分页:

async function getTransactions(accountId, accessToken, startDate, endDate) {
  const url = new URL(
    `https://api.provider.example/accounts/${encodeURIComponent(accountId)}/transactions`
  );

  url.searchParams.set("start_date", startDate);
  url.searchParams.set("end_date", endDate);
  url.searchParams.set("page_size", "100");

  const response = await fetch(url, {
    headers: {
      Authorization: `Bearer ${accessToken}`,
      Accept: "application/json"
    }
  });

  if (!response.ok) {
    throw new Error(`Transaction request failed: ${response.status}`);
  }

  return response.json();
}

示例中的路径、日期参数和分页方式都是通用演示。正式接入时,需要替换为实际平台规定的端点和字段。

如果平台没有个人账户 API

如果官方开放平台只提供支付、退款或商户账单接口,就不能通过该平台读取用户完整的个人流水或余额。可以改用以下方式:

  • 让用户从银行或钱包导出账单,再主动上传。
  • 接入当地合规的开放银行或账户信息服务商。
  • 只查询自身业务系统中的支付记录。
  • 使用银行提供的企业银企直连接口,但这类接口通常只适用于企业账户。

不要使用爬虫模拟登录网银,也不要要求用户提交网银密码、短信验证码或支付密码。

注意事项

  • 向用户明确说明查询目的、数据范围、保存期限和撤销方式。
  • 只申请业务必需的最小权限,不要默认申请全部账户和历史流水。
  • 在服务端加密保存令牌,并设置访问控制、审计和密钥轮换机制。
  • 妥善处理令牌过期、授权撤销、频率限制、分页和重复交易。
  • 金额应使用最小货币单位的整数或高精度十进制类型,以免产生浮点误差。
  • 流水可能有”处理中”、“已入账”、“已撤销”等状态,不能只根据交易时间判断最终结果。
  • 上线前核对当地关于隐私、网络安全和金融数据的监管要求。

接口能否调用、如何调用,取决于具体银行、支付机构、所在地区和调用方资质。只有确定目标平台后,才能给出准确的接口名称、请求参数和签名方式。

备注:内容仅供参考。