自动 + 0 小时:回调成功后立即自动分;自动 + 24 / 48 小时:先记 SCHEDULED,到期由 Cron 自动分;手动:到账后 PENDING,等后台点“立即分账”;不分账:订单不带分账配置。自动分账的费率在录入分账配置时定死,改费率后已录入的自动配置要重新录入才用新费率;手动 / 延迟分账在生成分账单时用新费率。
| 场景 | 方式 | 说明 |
|---|---|---|
| 商户接口 | X-Api-Key: pk_… | 注册时只显示一次,库里只存 SHA-256 哈希,丢了用重置接口换新的 |
| 后台接口 | X-Admin-Key: … | 生产必须设 Worker Secret ADMIN_KEY,本地未设时可空 |
| 支付回调 | YunGouOS 签名 | 用 payKey 做 MD5 验签,金额不一致或过期直接返回 FAIL,不记 PAID |
| 字段 | 必填 | 说明 |
|---|---|---|
| 是 | 商户邮箱,唯一 | |
| 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}
verify:{email, token};login:{email, password};reset-api-key:{email, password},返回新 api_key。邮箱验证码在未配发信 API 时仅本地返回,生产必须走 Resend / SendGrid / MailChannels 这类 HTTP 发信,Worker 不能直连 SMTP 465。
注册时没给实名姓名,或要换对方账号时用这个接口补录。参数:{recipient_alipay, recipient_name, reason?}。成功返回 201,含 config_no;失败返回 502,含 provider_error。
最近 20 条分账配置,对方账号已脱敏。
| 字段 | 说明 |
|---|---|
| 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
前者查订单;后者是二维码支付页,每秒倒计时、每 5 秒轮询状态,10 分钟未支付自动关闭(Cron 每分钟扫过期单)。
查该订单的两条分账:PLATFORM_FEE(平台,自动时 RETAINED)与 COUNTERPART(对方,AUTO_PENDING / SCHEDULED / PENDING / DONE / FAILED)。
手动分账兜底:订单必须是 PAID,调 createBillV2 + sendPay,成功才变 DONE。mock 下直接变 DONE,仅演示。
仅演示,需 ALLOW_MOCK_PAY=1。参数:{order_no}。自动模式下对方分账变 AUTO_PENDING,延迟模式下变 SCHEDULED,手动模式下变 PENDING,真支付模式下不要用。
支付回调:验签通过、code=1、金额一致、未过期才记 PAID;重复回调靠 provider_trade_no 幂等,不会重复分账。成功返回 SUCCESS,失败返回 FAIL。
分账回调:按 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 |
| 401 | Api-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 元实测一笔再放开。