跳到正文
PayHub开发者文档

API 参考

16 个开放 API 接口的总览,以及认证与环境、请求头、数据格式、分页、兼容性、限流和 8 类对象的字段说明。

最后更新于 2026-10-16 · 契约 v1.0.0

概览

开放 API 共 16 个接口。字段、约束、枚举与示例都由接口契约生成;点击接口进入详情页。

资源接口摘要权限范围幂等键
支付POST/v1/payments创建支付payments:write必填
支付GET/v1/payments查询支付列表payments:read—
支付GET/v1/payments/{payment_id}查询支付详情payments:read—
支付POST/v1/payments/{payment_id}/confirm确认支付payments:write必填
支付POST/v1/payments/{payment_id}/cancel取消支付payments:write必填
收银会话POST/v1/checkout/sessions创建托管收银会话payments:write必填
收银会话GET/v1/checkout/sessions/{session_id}查询收银会话payments:read—
退款POST/v1/refunds创建退款refunds:write必填
退款GET/v1/refunds查询退款列表refunds:read—
退款GET/v1/refunds/{refund_id}查询退款refunds:read—
余额与流水GET/v1/balances查询余额finance:read—
余额与流水GET/v1/balance-transactions查询账务流水finance:read—
结算与打款GET/v1/settlements查询结算单列表finance:read—
结算与打款GET/v1/settlements/{settlement_id}查询结算单详情finance:read—
结算与打款GET/v1/payouts/{payout_id}查询打款结果finance:read—
事件GET/v1/events/{event_id}查询事件按事件所属业务校验—

说明

收款账户变更、费率修改、余额调整与执行打款不提供 API,请在商户后台操作或联系平台。

注意

API Key 只能用于你的服务端。浏览器端请走托管收银台,或经你自己的服务端代理调用;文档站不提供在线调试。

基础约定

  • 使用 HTTPS 与 JSON(UTF-8),路径带版本 /v1。
  • API 地址:https://api.payhub.example。测试与生产使用同一个地址,环境由 API Key 决定。
  • 每个响应体都带 request_id:排查问题时提供给技术支持,也可以在商户后台按它查调用记录(API 调用记录(在新标签页打开商户后台)(需要所有者、管理员或开发者))。
  • 请求中没有、也不接受商户号字段:商户与环境只由 API Key 推导。

认证与环境

请求头 Authorization: Bearer <API_KEY>。密钥缺失、无效、已撤销或已过期返回 401 unauthenticated。

  • 测试 Key 以 sk_test_ 开头,只能访问测试对象;生产 Key 以 sk_live_ 开头。用测试 Key 查询生产对象返回 404,平台不会透露对象是否存在。
  • 每个接口需要的权限范围(scope)写在接口页的标题区;Key 缺少所需 scope 返回 403 forbidden。
权限范围可调用的接口
payments:readlistPayments、getPayment、getCheckoutSession;getEvent 中的 payment.*、dispute.* 事件
payments:writecreatePayment、confirmPayment、cancelPayment、createCheckoutSession
refunds:readlistRefunds、getRefund;getEvent 中的 refund.* 事件
refunds:writecreateRefund
finance:readlistBalances、listBalanceTransactions、listSettlements、getSettlement、getPayout;getEvent 中的 settlement.* 事件

谁能创建带哪些 scope 的 Key:

创建者可选的权限范围
所有者、管理员全部 5 项
开发者其“可授予 API 范围”内的项目(默认 payments:read、payments:write、refunds:read)
财务、只读人员不能创建

finance:read 默认不在开发者的可授予范围内,需要所有者或管理员创建的 Key。直接传卡还需要平台为你开通“直接传卡”能力,与 scope 无关。获取测试 Key:商户后台 API Key(在新标签页打开商户后台)(测试环境;需要所有者、管理员或开发者)。

请求头

请求头适用接口必填说明
Authorization全部 16 个是Bearer <API_KEY>;服务端密钥只能在服务端使用
Content-TypecreatePayment、confirmPayment、createCheckoutSession、createRefund是application/json;cancelPayment 没有请求体,不需要
Idempotency-KeycreatePayment、confirmPayment、cancelPayment、createCheckoutSession、createRefund是1–255 个字符;缺失返回 400(error.field 为 Idempotency-Key)。一次提交一个键,网络重试沿用原键,换卡等新的提交用新键,详见幂等、重试与查单

数据格式

  • ID:形如“前缀_随机串”,最长 64 字符。按不透明、区分大小写的字符串存储,不要解析。常见前缀:pay_ 支付、pat_ 支付尝试、auth_ 认证会话、cs_ 收银会话、ref_ 退款、dsp_ 争议、stl_ 结算单、po_ 打款、btx_ 账务流水、ltx_ 账务凭证、evt_ 事件、del_ 投递、mer_ 商户、req_ 请求。
  • 时间:带时区的 ISO 8601,默认 UTC,例如 2026-09-23T09:00:00Z;period_start / period_end 是业务时区的日期。
  • 金额:最小货币单位的整数,永远与 currency 一起出现。USD 10000 表示 100.00,JPY 10000 表示 10,000。有符号金额只出现在 BalanceTransaction.amount、SettlementItem.amount 与 Balance.net_position。
  • 币种:大写三字母代码;只能使用为你启用的币种。不同币种的金额不能相加。
  • metadata:最多 20 个键,键最长 40 字符,值为最长 200 字符的字符串;不得放卡号等敏感信息,命中会被拒绝。

分页

  • 列表默认每页 20 条,最多 100 条(limit)。
  • next_cursor 是不透明字符串,不要解析或拼接;翻页时必须带与首页相同的过滤条件。
  • 按创建时间倒序、同一时间再按唯一 ID 倒序,结果稳定(账务流水按 booked_at)。
  • 时间区间半开:created_gte 含,created_lt 不含。例如 created_gte=2026-09-23T00:00:00Z&created_lt=2026-09-24T00:00:00Z 恰好覆盖 9 月 23 日(UTC)一整天。
Node.js:遍历一整天的支付
const API_BASE = 'https://api.payhub.example';

// 遍历 2026-09-23(UTC)一整天的支付:has_more 为 true 时用 next_cursor 继续,并带相同的过滤条件
export async function* listPaymentsOfDay() {
  const filters = {
    created_gte: '2026-09-23T00:00:00Z',
    created_lt: '2026-09-24T00:00:00Z',
    limit: '100'
  };
  let cursor;
  do {
    const query = new URLSearchParams({ ...filters, ...(cursor ? { cursor } : {}) });
    const res = await fetch(`${API_BASE}/v1/payments?${query}`, {
      headers: { Authorization: `Bearer ${process.env.PAYHUB_API_KEY}` },
      signal: AbortSignal.timeout(20_000)
    });
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    const page = await res.json();
    yield* page.data;
    cursor = page.has_more ? page.next_cursor : undefined; // 不透明字符串,不要解析或拼接
  } while (cursor);
}

兼容性与版本

客户端必须:

  1. 忽略未知的新增字段;
  2. 不把未知的 status 当成功;
  3. 容忍未知错误码(按 HTTP 状态处理)、未知事件类型(返回 2xx 并忽略)与新的 next_action.type(按“未完成”处理并查询支付)。

版本策略:新增字段、枚举值、事件类型、错误码、可选参数属于兼容变更,不升级 /v1;删除或改名字段、改变语义、新增必填参数属于不兼容变更,会以新版本发布并提前通知。

限流与超时

  • 429 rate_limited:本次请求没有执行。等待 Retry-After(秒)后用原幂等键重试。换 Key 不能绕过商户的总限额。平台不公布具体限流数值。
  • 503 temporarily_unavailable:本次请求同样没有受理(平台暂停了该通道的新交易),稍后用原幂等键重试。其他 5xx 按结果未知处理,见错误码与 HTTP 状态。
  • 客户端超时:创建、确认支付建议不少于 20 秒。平台同步等待上游约 15 秒,超出会返回 202 processing,之后通过查询或通知得到结果。

对象

Payment 支付

与一个商户业务订单一一对应的支付主对象。一个 Payment 可以有多次尝试,但最多一笔正常成功扣款。 status 之外还有独立的结果字段;version 在每次有效业务变更时递增,用于通知去重与并发控制。

名称类型必填说明
id
string必填

平台支付号。

示例:pay_demo_001

merchant_order_no
string必填

商户订单号,按原值区分大小写。

示例:ORDER-DEMO-001

environment
string必填

环境:test 为测试,live 为生产。测试与生产对象相互隔离。

  • test
  • live
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:test

amount
integer(int64)必填

订单金额,最小货币单位。首次提交上游后不可修改。

约束:≥ 1

示例:10000

currency
string必填

大写三字母币种代码。

约束:格式 ^[A-Z]{3}$

示例:USD

status
string必填

Payment 状态。客户端不得把未知状态当作成功。

  • created:订单已建立,尚未提交有效扣款尝试;有效期内允许新尝试
  • processing:已提交,正在处理或结果尚未确认;不允许新尝试
  • requires_action:当前尝试需要付款人完成认证等动作;不允许新尝试
  • failed:最近一次尝试已明确失败;不是终态,满足期限、次数与风控条件时可显式重试
  • succeeded:已确认支付成功
  • canceled:已确认安全取消
  • expired:没有未解决的尝试且订单已到期关闭
  • created:订单已建立,尚未提交有效扣款尝试;有效期内允许新尝试
  • processing:已提交,正在处理或结果尚未确认;不允许新尝试
  • requires_action:当前尝试需要付款人完成认证等动作;不允许新尝试
  • failed:最近一次尝试已明确失败;不是终态,满足期限、次数与风控条件时可显式重试
  • succeeded:已确认支付成功
  • canceled:已确认安全取消
  • expired:没有未解决的尝试且订单已到期关闭
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:requires_action

resolution_status
string必填

结果确认程度。

  • known:结果已确认
  • needs_query:结果未知,平台正在用原标识向上游查证
  • manual_review:超过自动查询窗口,转人工跟进;不会自动判失败
  • known:结果已确认
  • needs_query:结果未知,平台正在用原标识向上游查证
  • manual_review:超过自动查询窗口,转人工跟进;不会自动判失败
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:known

captured_amount
integer(int64)必填

已确认扣款金额;成功时等于 amount。

约束:≥ 0

示例:0

refunded_amount
integer(int64)必填

已确认的有效退款本金,即成功退款累计减去已确认的退款退回;不含处理中的退款,也不含平台异常退款。

约束:≥ 0

示例:0

refund_returned_amount
integer(int64)必填

已确认退回的退款本金累计。

约束:≥ 0

示例:0

refund_reserved_amount
integer(int64)必填

审核中及处理中退款的本金占用。

约束:≥ 0

示例:0

refund_status
string必填

按有效退款本金 refunded_amount 派生的退款汇总状态:none、partial、full。

  • none
  • partial
  • full
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:none

authentication_status
string可为空必填

当前尝试的 3DS 认证状态,取认证会话状态:not_required、pending、challenge、authenticated、failed、abandoned、expired,须容忍新增取值。 认证成功(authenticated)不等于扣款成功,不要据此判断支付结果。尚无尝试或未进入认证时为 null。

示例:challenge

reconciliation_status
ReconciliationStatus必填

平台资金处理进度,仅供对账参考,不代表支付是否成功,也不代表何时打款。

  • pending
  • matched
  • difference
  • resolved
  • 将来可能新增取值;不认识的状态不要当作成功。
upstream_receipt_status
UpstreamReceiptStatus必填

平台资金处理进度,仅供对账参考,不代表支付是否成功,也不代表何时打款。

  • not_received
  • partially_received
  • received
  • reversed
  • 将来可能新增取值;不认识的状态不要当作成功。
latest_attempt_id
string可为空必填

最近一次支付尝试号;尚未提交尝试时为 null。

示例:pat_demo_001

attempt_count
integer(int32)必填

已发起的尝试次数;默认最多 3 次。

约束:≥ 0

示例:1

version
integer(int64)必填

对象版本,每次有效业务变更递增。比较版本来丢弃旧事件,不要按状态名排序。

约束:≥ 1

示例:2

next_action
NextAction可为空必填

status=requires_action 时需要付款人完成的动作,其他情况为 null。

type
string必填

首期公共 API 只开放 redirect_to_url。客户端须容忍未来新增的类型。

  • redirect_to_url
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:redirect_to_url

authentication_session_id
string必填

认证会话号,关联具体的支付尝试。

示例:auth_demo_001

url
string(uri)必填

平台认证承载页地址。

示例:https://pay.payhub.example/auth/<SHORT_LIVED_TOKEN>

expires_at
string(date-time)必填

认证访问的失效时间(最长 10 分钟)。

示例:2026-09-23T09:10:00Z

failure
PaymentFailure可为空必填

latest_attempt_id 所指尝试明确失败时的原因,否则为 null。

code
string必填

失败原因码。

示例:card_declined

message
string必填

脱敏说明。

示例:发卡行拒绝了该交易。

attempt_id
string必填

失败的支付尝试号。

示例:pat_demo_001

description
string否

订单摘要。

约束:最长 256

示例:示例订单

customer_reference
string否

商户侧客户标识。

约束:最长 128

示例:CUSTOMER-DEMO-001

metadata
object否

商户自定义键值,最多 20 个键;键最长 40 字符,值为最长 200 字符的字符串。禁止放入卡号等敏感数据,平台会做检查并拒绝。

约束:最多 20 个键值最长 200

示例:{"business_order_type":"one_time_purchase"}

card
CardSummary可为空必填

最近一次尝试所用卡的脱敏信息;尚无卡信息时为 null。

brand
string必填

卡品牌。

示例:visa

last4
string必填

卡号后四位。

约束:格式 ^[0-9]{4}$

示例:1234

created_at
string(date-time)必填

创建时间。

示例:2026-09-23T09:00:00Z

succeeded_at
string(date-time)可为空必填

确认支付成功的时间;未成功时为 null。

示例:null

expires_at
string(date-time)必填

可发起新尝试的截止时间,创建时确定(默认创建后 30 分钟,平台可在 5–120 分钟之间调整,以本字段为准)。到期只关闭新的付款入口,不否定已提交的支付。

示例:2026-09-23T09:30:00Z

  • failed 不是终态:满足有效期、尝试次数与风控条件时可以发起新尝试并最终成功;succeeded 后发生退款,支付状态仍为 succeeded,退款看 refund_status。
  • resolution_status=needs_query 表示结果未知、平台正在用原标识向上游查证;manual_review 表示超过自动查询窗口转人工,不会自动判失败。
  • authentication_status 是 3DS 认证状态,认证成功不等于扣款成功,不要据此判断支付结果。
  • version 每次有效业务变更递增:用它丢弃旧事件,不要按状态名排序。
  • reconciliation_status、upstream_receipt_status 是平台资金处理进度,仅供对账参考,不代表支付是否成功,也不代表何时打款。
  • expires_at 是可发起新尝试的截止时间(默认创建后 30 分钟),到期只关闭新入口,不否定已提交的支付。
支付状态流转
支付状态流转
  1. failed 之后付款人可以重试,所以事件和状态都不能按状态名排序,要比较 version。
  2. succeeded 的支付发生退款后支付状态不变,退款以 Refund 对象和 refund_status 表达。

Refund 退款

对原支付的一次退款申请;同一支付支持多次部分退款,各有独立的退款号。

名称类型必填说明
id
string必填

平台退款号。

示例:ref_demo_001

version
integer(int64)必填

对象版本,每次有效业务变更递增(状态、失败原因、退回金额)。比较版本来丢弃旧事件,不要按状态名排序。

约束:≥ 1

示例:1

payment_id
string必填

原支付号。

示例:pay_demo_001

merchant_refund_no
string必填

商户退款号,同一商户同一环境内唯一。

示例:REFUND-DEMO-001

amount
integer(int64)必填

退款本金,最小货币单位。

约束:≥ 1

示例:4000

currency
string必填

退款币种,继承原支付。

约束:格式 ^[A-Z]{3}$

示例:USD

status
string必填

退款状态。

  • pending_review:已受理,等待审核;保持资金占用
  • processing:已批准并提交,或正在确认上游结果;保持占用
  • succeeded:上游已确认退款成功;占用转为正式扣减
  • failed:已明确退款未成功;解除占用
  • rejected:审核驳回,未提交上游;解除占用
  • canceled:提交上游前被有权限的人员取消;解除占用
  • returned:曾确认成功的退款之后全部或部分资金被真实退回
  • pending_review:已受理,等待审核;保持资金占用
  • processing:已批准并提交,或正在确认上游结果;保持占用
  • succeeded:上游已确认退款成功;占用转为正式扣减
  • failed:已明确退款未成功;解除占用
  • rejected:审核驳回,未提交上游;解除占用
  • canceled:提交上游前被有权限的人员取消;解除占用
  • returned:曾确认成功的退款之后全部或部分资金被真实退回
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:pending_review

reason
string必填

退款原因。

示例:requested_by_customer

returned_amount
integer(int64)必填

退款成功后被真实退回的本金累计。

约束:≥ 0

示例:0

failure
RefundFailure可为空必填

status 为 failed 或 rejected 时的原因,否则为 null。

code
string必填

失败原因码。

示例:refund_rejected

message
string必填

脱敏说明。

示例:退款申请未通过审核。

metadata
object否

商户自定义键值,最多 20 个键;键最长 40 字符,值为最长 200 字符的字符串。禁止放入卡号等敏感数据,平台会做检查并拒绝。

约束:最多 20 个键值最长 200

示例:{"business_order_type":"one_time_purchase"}

created_at
string(date-time)必填

受理时间。

示例:2026-09-23T10:00:00Z

completed_at
string(date-time)可为空必填

进入 succeeded、failed、rejected 或 canceled 的时间;尚未结束时为 null。

示例:null

  • reason 建议使用原因码:requested_by_customer、duplicate、fraudulent、order_canceled、other。
  • returned 表示曾确认成功的退款之后发生真实资金退回,原成功事实保留,returned_amount 为已退回本金。
  • 平台异常退款(平台向持卡人原路退还重复扣款或金额不符多扣的款项)不通过开放 API 返回,也不计入支付的 refunded_amount、refund_status;平台另以站内信和邮件通知你。
退款状态流转
退款状态流转

processing 的退款结果未知时资金持续占用,平台持续查证,不会在本地取消。

CheckoutSession 收银会话

托管收银会话,关联统一的 Payment,不单独形成第二份支付订单。

名称类型必填说明
id
string必填

收银会话号。

示例:cs_demo_002

payment_id
string必填

关联的 Payment。

示例:pay_demo_002

status
string必填

收银会话状态。

  • open:可提交支付
  • completed:仅在关联 Payment 成功后出现
  • expired:不再允许新提交;不代表关联支付失败
  • open:可提交支付
  • completed:仅在关联 Payment 成功后出现
  • expired:不再允许新提交;不代表关联支付失败
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:open

checkout_url
string(uri)必填

收银页地址,携带只绑定本会话的短时凭据,不含商户服务端密钥。只用于让付款人浏览器整页跳转:不要写入日志、分析工具或错误上报,也不要分享给他人。

示例:https://pay.payhub.example/checkout/<SHORT_LIVED_TOKEN>

expires_at
string(date-time)必填

会话失效时间,创建时确定:最长 30 分钟(平台可调短)且不超过订单剩余可支付期。过期后的只读期内(创建时确定,默认且最长 24 小时)付款人仍可用原链接查看会话与支付结果(只读,不能提交),之后链接失效。

示例:2026-09-23T09:30:00Z

return_url
string(uri)必填

支付结束后的商户返回地址。

示例:https://merchant.example/payment/return

cancel_url
string(uri)可为空必填

付款人点击“返回商户”时的地址;点击它不等于撤销已提交的扣款。未提供时为 null。

示例:https://merchant.example/payment/cancel

locale
string必填

收银页语言。

示例:zh-CN

created_at
string(date-time)必填

创建时间。

示例:2026-09-23T09:00:00Z

  • checkout_url 含收银令牌,只用于让付款人浏览器整页跳转:不要写入日志、分析工具或错误上报,也不要分享给他人。
  • 会话最长 30 分钟且不超过订单剩余可支付期;过期后进入只读期(默认且最长 24 小时),链接只能查看结果、不能提交,之后失效。
  • 点击“返回商户”(cancel_url)不等于撤销扣款。

Balance 余额

单一币种的商户余额分桶。同一金额只处于一个桶;待追偿是单独的债权,不以负数隐藏在其他桶中。不同币种不得相加。

名称类型必填说明
currency
string必填

币种。

约束:格式 ^[A-Z]{3}$

示例:USD

pending
integer(int64)必填

待结算:支付已成功,但到账、账期或对账条件未全部满足的净额;不可打款。

约束:≥ 0

示例:9650

available
integer(int64)必填

可结算:已满足释放条件且未被占用的金额;唯一可用于打款的桶。

约束:≥ 0

示例:8650

reserve
integer(int64)必填

保证金:按规则留存、等待释放的金额。

约束:≥ 0

示例:1000

risk_hold
integer(int64)必填

风险冻结:与具体风险处置或争议关联的冻结金额。

约束:≥ 0

示例:0

refund_pending
integer(int64)必填

退款占用:被审核中或处理中退款占用的金额。

约束:≥ 0

示例:0

payout_pending
integer(int64)必填

打款占用:被有效结算单占用、尚未确认打款完成的金额。

约束:≥ 0

示例:0

merchant_receivable
integer(int64)必填

待追偿:平台因真实强制扣收等形成的对商户应收债权;不属于商户可用资金。

约束:≥ 0

示例:0

book_payable
integer(int64)必填

商户账面应付余额 = pending + available + reserve + risk_hold + refund_pending + payout_pending。

约束:≥ 0

示例:19300

net_position
integer(int64)必填

商户净头寸(仅展示用途)= book_payable - merchant_receivable,可为负;不能替代 available。

示例:19300

余额桶中文含义可用于打款
pending待结算支付已成功但到账、账期或对账条件未全部满足的商户净额否
available可结算已满足释放条件且未被占用是
reserve保证金按规则留存、等待释放否
risk_hold风险冻结与具体风险处置或争议关联的冻结否
refund_pending退款占用审核中或处理中的退款占用否
payout_pending打款占用被有效结算单占用、尚未确认打款否
merchant_receivable待追偿平台对你的应收(单独列示,不是负余额)不属于可用资金

book_payable = 前 6 个桶之和;net_position = book_payable − merchant_receivable,仅供展示,可为负。

警告

只有 available 可用于打款。不同币种的余额不能相加为“总余额”。

BalanceTransaction 账务流水

一个余额桶的一次增减。已记账流水不可修改,纠错通过冲正和新流水完成。

名称类型必填说明
id
string必填

流水号。

示例:btx_demo_001

type
string必填

记账类型,例如 payment_captured(支付成功入账)、refund_reserved(退款占用)、settlement_reserved(结算占用)、funds_released(资金释放);须容忍新增取值。

示例:payment_captured

source_type
string必填

来源业务对象类型,例如 payment、refund、dispute、settlement、payout、payout_return(退汇)、adjustment。

示例:payment

source_id
string必填

来源业务对象 ID。

示例:pay_demo_001

bucket
string必填

余额桶:pending、available、reserve、risk_hold、refund_pending、payout_pending、merchant_receivable。

  • pending
  • available
  • reserve
  • risk_hold
  • refund_pending
  • payout_pending
  • merchant_receivable
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:available

amount
integer(int64)必填

有符号金额,最小货币单位:正数增加该桶,负数减少该桶。

示例:9650

currency
string必填

币种。

约束:格式 ^[A-Z]{3}$

示例:USD

occurred_at
string(date-time)必填

业务发生时间。

示例:2026-09-23T09:05:00Z

booked_at
string(date-time)必填

记账时间;迟到事实不伪造为按时到达。

示例:2026-09-23T09:05:01Z

ledger_transaction_id
string必填

关联的账务交易(凭证)号;桶间转移的两条流水共用同一个号。

示例:ltx_demo_001

  • amount 有符号:正数增加该余额桶,负数减少。桶间转移是同一 ledger_transaction_id 下一减一增两条流水。
  • 同时给出业务发生时间 occurred_at 与记账时间 booked_at;created_gte / created_lt 作用于 booked_at,迟到的事实按实际记账时间出现,不改写历史。
  • type 是记账类型,例如 payment_captured(支付成功入账)、refund_reserved(退款占用)、settlement_reserved(结算占用)、funds_released(资金释放);须容忍新增取值。

Settlement 结算单

结算单及其来源明细。

名称类型必填说明
id
string必填

结算单号。

示例:stl_demo_001

currency
string必填

结算币种。

约束:格式 ^[A-Z]{3}$

示例:USD

period_start
string(date)必填

账期起始业务日期(含),按商户结算业务时区。

示例:2026-09-21

period_end
string(date)必填

账期结束业务日期(含)。

示例:2026-09-21

status
string必填

结算单状态。

  • pending_review:系统已生成,待审核;已原子占用所选商户余额
  • approved:复核通过,待执行
  • rejected:审核拒绝;释放占用
  • paying:已交付执行或打款结果未确定;保持占用
  • paid:已复核打款成功
  • failed:已明确本次没有成功付款;释放占用
  • canceled:尚未对外执行且按权限撤销;释放占用
  • returned:曾经成功的打款之后发生银行退汇
  • pending_review:系统已生成,待审核;已原子占用所选商户余额
  • approved:复核通过,待执行
  • rejected:审核拒绝;释放占用
  • paying:已交付执行或打款结果未确定;保持占用
  • paid:已复核打款成功
  • failed:已明确本次没有成功付款;释放占用
  • canceled:尚未对外执行且按权限撤销;释放占用
  • returned:曾经成功的打款之后发生银行退汇
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:paid

reserved_amount
integer(int64)必填

本结算单从 available 转入 payout_pending 的余额占用 S。

约束:≥ 0

示例:8650

fee_amount
integer(int64)必填

结算手续费 F,默认 0。

约束:≥ 0

示例:0

payout_amount
integer(int64)必填

实际银行打款金额 = S - F。

约束:≥ 0

示例:8650

payout_account
PayoutAccount必填

结算单生成时固化的收款账户脱敏快照。

holder_name
string必填

账户持有人。

示例:Demo Merchant Ltd

bank_name
string必填

银行名称。

示例:Example Bank

account_last4
string必填

账号后四位。

约束:格式 ^[0-9A-Za-z]{4}$

示例:6789

payout_id
string可为空必填

对应的打款记录;尚未执行时为 null。

示例:po_demo_001

created_at
string(date-time)必填

生成时间。

示例:2026-09-22T02:00:00Z

items
array<SettlementItem>必填
source_type
string必填

来源类型,例如 payment、refund、adjustment。

示例:payment

source_id
string必填

来源对象 ID。

示例:pay_demo_001

amount
integer(int64)必填

计入本结算单的有符号金额,币种同结算单。

示例:8650

  • payout_amount = reserved_amount - fee_amount。
  • payout_account 是生成时固化的脱敏快照,之后变更收款账户不影响旧结算单。
  • 退款、拒付、保证金释放不重写历史结算单。

Payout 打款

一次结算对应的对外打款记录,与结算单及唯一参考号关联。

名称类型必填说明
id
string必填

打款记录号。

示例:po_demo_001

settlement_id
string必填

对应的结算单。

示例:stl_demo_001

amount
integer(int64)必填

打款金额,最小货币单位。

约束:≥ 1

示例:8650

currency
string必填

币种。

约束:格式 ^[A-Z]{3}$

示例:USD

status
string必填

打款状态:created、processing、unknown、succeeded、failed、canceled、returned。 unknown 时对应结算单保持 paying,不自动释放资金。

  • created
  • processing
  • unknown
  • succeeded
  • failed
  • canceled
  • returned
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:succeeded

reference
string必填

平台打款唯一参考号,不复用于新的转账。

示例:PAYOUT-REF-DEMO-001

executed_at
string(date-time)可为空必填

交付执行时间;尚未执行时为 null。

示例:2026-09-22T03:00:00Z

completed_at
string(date-time)可为空必填

经复核确认成功或失败的时间;尚未确认时为 null。

示例:2026-09-22T05:00:00Z

  • 开放 API 只能按 ID 查询打款(getPayout),打款号取自结算单的 payout_id;没有打款列表接口,列表在商户后台查看。
  • unknown 表示暂时无法确认银行结果:对应结算单保持 paying、资金不释放,平台先查证,不会重复打款。

Event 事件

商户事件。同一事件重试时 ID 与载荷不变;不含完整卡号、CVC、服务端密钥或认证秘密。

名称类型必填说明
id
string必填

事件 ID,用于去重。

示例:evt_demo_001

type
string必填

事件类型,取值见 webhooks.v1.yaml 的 EventType;客户端须容忍未知类型。

示例:payment.succeeded

api_version
string必填

载荷的 API 版本。

示例:v1

created_at
string(date-time)必填

事件创建时间;不能代替签名时间。

示例:2026-09-23T09:05:00Z

environment
string必填

环境:test 为测试,live 为生产。测试与生产对象相互隔离。

  • test
  • live
  • 将来可能新增取值;不认识的状态不要当作成功。

示例:test

merchant_id
string必填

商户号。

示例:mer_demo_001

data
EventData必填
object
object必填

事件发生时的业务对象快照(Payment、Refund、Dispute 或 Settlement),只含商户有权查看的最小必要数据,含 id 与 version。

示例:{"id":"pay_demo_001","merchant_order_no":"ORDER-DEMO-001","amount":10000,"currency":"USD","status":"succeeded","latest_attempt_id":"pat_demo_001","version":4}

  • type 取值见 Webhook 事件类型,须容忍新类型。
  • created_at 是业务时间,不是签名时间;data.object 是事件发生时的对象快照,至少含 id 与 version。
这页有帮助吗?