支付系统接口文档

Base URL:https://pay.kucloud.top · 当前模式:mock 演示(未配 YunGouOS 密钥,不产生真钱)

统一默认:平台费率 15% · 分账方式自动 · 延迟 0 小时(立即到账)。商户单独设置优先,没有单独设置就跟统一设置。

← 回首页 · 后台管理 → · 商户后台 →

流程

1. 注册(邮箱 + 对方支付宝 + 实名姓名)→2. 自动录入分账账户,拿到 api_key→3. 创建二维码订单→4. 支付页 10 分钟倒计时→5. 到账后按费率 / 方式 / 延迟分账

自动 + 0 小时:回调成功后立即自动分;自动 + 24 / 48 小时:先记 SCHEDULED,到期由 Cron 自动分;手动:到账后 PENDING,等后台点“立即分账”;不分账:订单不带分账配置。自动分账的费率在录入分账配置时定死,改费率后已录入的自动配置要重新录入才用新费率;手动 / 延迟分账在生成分账单时用新费率。

认证

场景方式说明
商户接口X-Api-Key: pk_…注册时只显示一次,库里只存 SHA-256 哈希,丢了用重置接口换新的
后台接口X-Admin-Key: …生产必须设 Worker Secret ADMIN_KEY,本地未设时可空
支付回调YunGouOS 签名用 payKey 做 MD5 验签,金额不一致或过期直接返回 FAIL,不记 PAID

注册与登录

POST /api/auth/register

字段必填说明
email是商户邮箱,唯一
password是至少 8 位,PBKDF2 存储
alipay_account是对方支付宝账号(分账收款方)
recipient_name分账必填对方实名姓名,必须和支付宝账号同名;不给则不自动录入分账账户
fee_bps否平台费率,单位基点,0–3000(0%–30%);不填跟统一(当前 15% = 1500)
curl -X POST /api/auth/register -H 'content-type: application/json' \
  -d '{"email":"merchant@example.com","password":"ChangeMe123","alipay_account":"对方支付宝账号","recipient_name":"对方实名姓名"}'
# 返回:merchant_id, api_key(只显示一次), fee_bps, fee_source, split_config{config_no, status}

POST /api/auth/verify · /api/auth/login · /api/auth/reset-api-key

verify:{email, token};login:{email, password};reset-api-key:{email, password},返回新 api_key。邮箱验证码在未配发信 API 时仅本地返回,生产必须走 Resend / SendGrid / MailChannels 这类 HTTP 发信,Worker 不能直连 SMTP 465。

分账配置

POST /api/split-configs Header: X-Api-Key

注册时没给实名姓名,或要换对方账号时用这个接口补录。参数:{recipient_alipay, recipient_name, reason?}。成功返回 201,含 config_no;失败返回 502,含 provider_error。

GET /api/split-configs Header: X-Api-Key

最近 20 条分账配置,对方账号已脱敏。

订单与支付

POST /api/orders Header: X-Api-Key

字段说明
amount_cents / amount金额,二选一:amount_cents 是分(10000 = 100 元),amount 是元
title商品 / 订单标题,最长 100 字
curl -X POST /api/orders -H 'X-Api-Key: <api_key>' -H 'content-type: application/json' \
  -d '{"amount_cents":10000,"title":"测试商品"}'
# 返回:order_no, amount_yuan, fee_cents(15%时1500), counterpart_cents(8500),
#       split_config_no, auto_split, split_mode, split_delay_hours, pay_url, expires_at

GET /api/orders/:order_no · GET /pay/:order_no

前者查订单;后者是二维码支付页,每秒倒计时、每 5 秒轮询状态,10 分钟未支付自动关闭(Cron 每分钟扫过期单)。

GET /api/orders/:order_no/splits Header: X-Api-Key

查该订单的两条分账:PLATFORM_FEE(平台,自动时 RETAINED)与 COUNTERPART(对方,AUTO_PENDING / SCHEDULED / PENDING / DONE / FAILED)。

POST /api/orders/:order_no/split-manual Header: X-Api-Key

手动分账兜底:订单必须是 PAID,调 createBillV2 + sendPay,成功才变 DONE。mock 下直接变 DONE,仅演示。

POST /api/pay/mock-pay

仅演示,需 ALLOW_MOCK_PAY=1。参数:{order_no}。自动模式下对方分账变 AUTO_PENDING,延迟模式下变 SCHEDULED,手动模式下变 PENDING,真支付模式下不要用。

回调(YunGouOS 调用我们)

POST /api/pay/notify

支付回调:验签通过、code=1、金额一致、未过期才记 PAID;重复回调靠 provider_trade_no 幂等,不会重复分账。成功返回 SUCCESS,失败返回 FAIL。

POST /api/pay/split-notify

分账回调:按 ps_no / 订单号把对方分账从 AUTO_PENDING / PENDING 改成 DONE。分账回调的签名字段与各 Finance 接口的准确 HTTP 路径,仍需对照 YunGouOS 文档做小额实测后确认。

商户端(注册账户,设置支付宝分账账户)

商户门户:GET /merchant/register 注册、GET /merchant/login 登录、GET /merchant 商户后台(登录后可见,未登录跳转登录页)。登录有效期 30 分钟,剩余 10 分钟内访问自动续 30 分钟,超过 30 分钟没访问需重新登录。注册成功后自动登录并直接进入商户主页面,不在注册页显示密钥;需要对接 API 时,商户在主页面自己点“生成密钥”。主页面里有创建订单(填商品名称和金额)、设置支付宝分账账户、分账账户列表、订单与分账记录。

接口说明
POST /api/merchant/login商户登录:{email, password},成功发 7 天会话 Cookie;禁止 / 已删除商户拒绝登录
POST /api/merchant/logout退出商户登录
GET /api/merchant/me我的账户、生效费率与分账账户列表(会话)
POST /api/merchant/split-account设置支付宝分账账户:{alipay_account, recipient_name, reason?};先录入新账户成功才替换旧账户,录入失败旧账户保留;实名必须与支付宝实名一致
GET /api/merchant/orders?page=1我的订单(会话,分页,每页 10 条,返回 total / total_pages)
GET /api/merchant/splits?page=1我的分账记录(会话,分页,每页 10 条)
POST /api/merchant/orders商户主页面创建订单(会话,不用 API 密钥):{title 商品名称, amount 金额(元)或 amount_cents(分)},返回订单号与支付页链接
GET /api/merchant/api-keys我的 API 密钥列表(会话,每页 10 条;最多 10 个,含注册主密钥)
POST /api/merchant/api-keys生成 API 密钥(会话):{name?},新密钥只显示一次;已达 10 个时报 409,需先删除旧密钥再创建
DELETE /api/merchant/api-keys/:id删除 API 密钥(会话):立即作废并空出名额;注册主密钥的 id 是 legacy,删它会作废旧主密钥
POST /api/merchant/reset-api-key生成 / 重新生成注册主密钥(会话),新密钥只显示一次,旧主密钥立即失效

注册时填了实名姓名会自动录入分账账户;注册时没填,登录后台在“设置支付宝分账账户”里补设即可。分账账户的商户份额 = 100% − 生效平台费率(默认 15%,商户 85%)。我的分账账户只显示一条有效信息(ACTIVE),已失效(REPLACED / FAILED)的配置不再显示,数据库里仍留作备查。

后台管理(登录后可见)

后台有单独登录页 GET /admin/login:输入管理员密钥登录,成功后发 24 小时 HttpOnly 会话 Cookie,才能打开 GET /admin 看设置;未登录打开 /admin 会跳转到登录页。API 客户端仍可用 X-Admin-Key,后台页本身用 Cookie。退出用 POST /api/admin/logout。

接口说明
GET /admin/login后台登录页(单独页面)
POST /api/admin/login登录:{admin_key},成功发会话 Cookie,24 小时过期
POST /api/admin/logout退出登录,清除会话
GET /admin可视化后台页:统一设置、商户单独设置、待分账列表、商户状态管理
GET /api/admin/settings查统一设置
POST /api/admin/settings改统一设置:{fee_bps, split_mode, split_delay_hours},fee 0–3000,delay 0–720 小时
GET /api/admin/merchants商户列表,含每商户的单独设置与生效设置
POST /api/admin/merchants/:id/settings改某商户单独设置,字段为 null = 恢复统一
POST /api/admin/merchants/:id/status改商户状态:{status, reason?},status = ACTIVE / PAUSED / FROZEN / BANNED / DELETED
GET /api/admin/merchants?status=…按状态筛选商户列表
GET /api/admin/splits待分账列表(PENDING / SCHEDULED / AUTO_PENDING / FAILED)
POST /api/admin/orders/:order_no/split-now后台立即分账(可提前分延迟单)
POST /api/admin/migrate运行时建表(初始部署用,幂等,不删表)
GET /api/admin/rate-check分账比例缺口自查:YunGouOS 文件没有支付宝 app_id / RSA 密钥,调不了直连分账比例查询
GET /api/health健康检查:{ok, provider: mock|yungouos, time}

分账方式取值:auto(自动)、manual(手动)、off(不分账)。延迟只对“自动 + 延迟 > 0”生效。

商户状态:正常 ACTIVE 可下单可分账;暂停 PAUSED 停新单、已付分账照常;冻结 FROZEN 停新单也停分账(延迟分账被 Cron 暂缓);禁止 BANNED 不可登录、不可下单、不可分账;删除 DELETED 是软删除,订单与分账账本保留,商户不可登录,可恢复为正常。

在线试调(只调当前域名,不存密钥)

在下面填 Base URL(默认就是当前域名)和密钥,点按钮直接调接口,结果显示在下方。密钥只存在当前页面,不会发到别处。

结果会显示在这里…

状态与错误

码 / 状态含义
200 / 201成功(201 是注册 / 下单成功)
400参数不对,如金额无效、费率超 0–3000
401Api-Key 或 Admin-Key 不对
404订单 / 商户不存在
409邮箱已注册,或订单不是 PAID / 已不是 CREATED
502上游分账接口失败,含 provider_error,可重试手动分账
订单 CREATED / PAID / CLOSED待支付 / 已支付 / 过期关闭
分账 PENDING / SCHEDULED / AUTO_PENDING / DONE / FAILED / RETAINED待手动分 / 等延迟到期 / 等自动分账回调 / 已分完 / 分账失败 / 平台费留存(不需再转)

真支付上线前仍待确认:YunGouOS 各 Finance 接口的准确 HTTP 路径、分账 rate 的单位、分账回调的签名字段,先用 0.01 元实测一笔再放开。