JDH API
本文档面向接入方(代理商 / 平台),说明如何通过 Gateway 调用充值提现相关接口。
所有对外接口统一挂载在 /ext/p2c/* 路径下。
鉴权
所有 /ext/p2c/* 接口(除 /ext/p2c/health 外)均须在请求头携带 API Key。Gateway 校验 Key 有效性、代理商状态及 IP 访问策略。
x-atp-key: <your-api-key>Authorization: Bearer <your-api-key>- 每个 API Key 与唯一代理商编号(
agentCode)绑定,Gateway 自动识别调用方身份。 - 请求体中的
agentCode应填写该 Key 所属代理商编号。 - 代理商被禁用或风控暂停时,对应 Key 自动失效。
获取与管理 API Key
| 角色 | 操作 | 说明 |
|---|---|---|
| 平台管理员 | 创建代理商 | 创建成功后弹窗一次性展示完整 Key,请立即保存 |
| 平台管理员 | 代理商详情 → 轮换 Key | 生成新 Key,旧 Key 立即失效;新 Key 同样仅展示一次 |
| 代理商主账号 | 系统设置 → Gateway API Key | 查看脱敏 Key 与 Header 用法(无法查看完整 Key) |
正式 Key 格式为 atp_ 前缀 + 64 位十六进制字符(示例:atp_a1b2c3d4...f0e1)。
AG001 可使用测试 Key
dev-atp-key-change-me。若已在管理后台轮换过 Key,请以后台显示的
atp_... 为准。完整 Key 丢失时只能轮换,无法找回。
环境地址
| 环境 | REST Base URL |
|---|---|
| 本地开发 | http://localhost:8080 |
| 生产(示例) | https://<your-domain> |
响应格式
无论成功或失败,HTTP 状态码均为 200。请根据 JSON 中的 code 判断业务结果。
{
"code": "0",
"message": "success",
"data": { }
}
| 字段 | 类型 | 说明 |
|---|---|---|
code | string | "0" 表示成功,其他为业务错误码 |
message | string | 人类可读说明 |
data | object | array | null | 业务数据,失败时通常为 null |
充值流程
玩家发起充值后,系统优先匹配提款池中的待提款单;若无匹配则路由至代理商银行卡收款。
- 同一玩家同时只能有一笔进行中的充值单。
- 成功时返回收款账户信息(提款方或银行卡)。
- 上传水单后图片 Base64 直接存入管理后台数据库,并触发 凭证验真服务 验真(可配置模拟模式)。
- 验单异步处理;凭证拒绝或需重传时,平台会向代理商配置的
callbackUrl推送事件(见事件回调)。 - 可通过
deposit-active查询进行中订单,deposit-cancel取消。
提现进池流程
玩家提现申请进入代理商提款池,等待充值方匹配。
- 创建提款单时会冻结代理商池子对应额度。
- 充值方
deposit-match匹配成功时推送withdraw_matched;关联充值验单到账后推送withdraw_settled(部分)或withdraw_completed(全部)。 - 总等待时间到期未完全匹配时,系统将过期并释放冻结额度,推送
withdraw_timeout。 - 后台人工释放或重新排队时推送
withdraw_released/withdraw_requeued(见事件回调)。
P2C 存款流程(AutoPeer 兼容)
适用于传统 P2C 存款场景,订单由 Gateway 本地管理,与充值为独立流程。
充值接口
创建充值单并尝试提款池。无匹配时分配代理商银行卡。
请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
agentCode | string | 是 | 代理商编号 |
memberId | string | 是 | 玩家 ID |
amount | number | 是 | 充值金额(泰铢),须 > 0 |
bankCode | string | 否 | 付款银行代码,如 SCB、KBANK |
响应 data 主要字段
| 字段 | 说明 |
|---|---|
orderNo | 充值订单号(后续上传水单、取消时使用) |
matchedWithdraw | 是否到提款单 |
targetType | 收款类型:withdrawal_match 或 agent_bank_account |
bankCode / accountNo / accountName | 收款账户信息 |
status | 订单状态,初始为 waiting_payment |
expiresAt | 支付截止时间 |
查询玩家当前进行中的充值单(用于 H5 页面恢复状态)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
memberId | string | 是 | 玩家 ID |
取消充值单。取消后 3 分钟内不可再次发起(防刷)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
memberId | string | 是 | 玩家 ID |
ref | string | 否 | 订单号;不传则取消当前进行中订单 |
提现接口
玩家提现申请,进入代理商提款池。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
agentCode | string | 是 | 代理商编号 |
memberId | string | 是 | 玩家 ID |
amount | number | 是 | 提现金额 |
bankCode | string | 是 | 收款银行代码 |
accountNo | string | 是 | 收款账号 |
accountName | string | 否 | 收款人姓名 |
响应 data 主要字段
| 字段 | 说明 |
|---|---|
orderNo | 提款订单号 |
status | 初始为 waiting_match |
expiresAt | 截止时间 |
poolAvailable | 代理商池子可用额度 |
提款状态回调(平台 → Gateway),用于同步外部提款状态变更。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
refid | string | 是 | 关联订单号 |
status | string | 是 | 状态,如 WITHDRAW |
amount | number | 是 | 金额 |
beforeTransfer | string | 是 | 转账前状态 |
afterTransfer | string | 是 | 转账后状态 |
withdrawAmount | number | 条件 | status=WITHDRAW 时必填 |
水单上传接口
提交转账凭证 Base64,图片存入管理后台数据库并触发 凭证验真服务 自动验单。接口同步返回成功仅表示「已接收」;验单结果通过 事件回调 异步通知,验单通过或金额不符自动完成也会推送对应事件。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
ref | string | 是 | 充值订单号 orderNo |
base64Data | string | 是 | 图片 Base64,支持纯 Base64 或 data:image/...;base64,... |
contentType | string | 否 | 默认 image/jpeg,如 image/png |
验单后系统行为(摘要)
| 验单结果 | 系统处理 | 回调 event |
|---|---|---|
| 通过 | 订单自动完成 | deposit_voucher_completed |
| 账号不符 / 银行订单已使用 | 释放匹配或银行占用,订单拒绝 | deposit_voucher_rejected |
| 金额不符 | 按识别金额自动调整并完成(少付释放差额,超额扣代理池) | deposit_voucher_amount_mismatch |
| 识别失败 | 重置为可上传,允许玩家重新提交 | deposit_voucher_reupload_required |
| 验单服务不可用 | 保持验单中,可稍后重传 | deposit_voucher_service_unavailable |
| 其他需人工审核 | 进入人工审核队列 | deposit_voucher_manual_review |
已弃用(水单场景):充值水单请直接使用 submit-voucher。本接口仍可用于其他需 MinIO 存储的场景。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
base64Data | string | 是 | 图片 Base64(不含 data: 前缀) |
contentType | string | 是 | 如 image/jpeg |
fileName | string | 否 | 文件名 |
bizType | string | 否 | 默认 voucher |
bizRef | string | 否 | 业务关联号 |
P2C 流程专用:一步上传 Base64 水单(Gateway 本地订单)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
ref | string | 是 | P2C 订单 ref |
imgVoucher | string | 是 | 水单图片 Base64 |
P2C 存款接口
创建 P2C 存款订单。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
memberId | string | 是 | 玩家 ID |
amount | number | 是 | 金额 |
bankCode | string | 否 | 付款银行 |
accountNo | string | 否 | 付款账号 |
remark | string | 否 | 备注 |
查询存款状态。请求体传 ref 或 memberId 之一。
查询玩家待转账的存款列表。
为指定订单重新生成访问令牌。请求体:{ "ref": "..." }
生成 Payment Link。请求体含 memberId、amount,可选 bankCode、returnUrl。
强制完成转账。请求体:{ "refs": ["ref1", "ref2"] }
请求取消存款(取消后 3 分钟封禁)。请求体:{ "refs": ["ref1"] }
通用接口
获取支持的泰国银行列表。响应为数组,每项含 code、name、nameEn。
服务健康检查。响应 data.db 为 ok 或 bad。
事件回调(callbackUrl)
平台在特定业务节点向代理商配置的 回调 URL 主动发起 HTTP 请求。
方向为 平台 → 代理商,与 Gateway 对外 API 相反。
请在管理后台「代理商」编辑页填写 callbackUrl(HTTPS 推荐)。
- 请求方式:
POST,Content-Type: application/json - 所有 payload 顶层均含
event字段,用于区分事件类型 - 未配置或留空
callbackUrl时静默跳过,不发送 - 每次回调写入管理后台
agent_callback_logs,便于排查 - 接入方应返回 HTTP 2xx 表示接收成功;非 2xx 会记为失败但仍保留业务结果
事件一览
| event | 触发时机 | 典型用途 |
|---|---|---|
withdraw_timeout |
提款单总等待时间到期,自动过期 | 通知 H5 / 平台释放玩家提现单、展示超时 |
withdraw_matched |
充值单与提款单匹配成功(额度预占) | 提示玩家等待充值方转账 |
withdraw_settled |
关联充值到账,提款仍有剩余待匹配 | 更新已到账 / 剩余金额 |
withdraw_completed |
提款全部到账完成 | 通知 H5 提现成功 |
withdraw_released |
后台人工释放提款单、返还剩余冻结 | 关闭提现单 |
withdraw_requeued |
过期后人工重新进入匹配池 | 延长等待、继续撮合 |
deposit_voucher_completed |
充值凭证验单通过或人工审核通过,订单完成 | 通知 H5 充值成功、给玩家加款 |
deposit_voucher_amount_mismatch |
金额不符且已自动调整并完成(少付 / 多付) | 按实际结算金额通知 H5 |
deposit_voucher_rejected |
充值凭证验单拒绝:账号不符、重复凭证、人工拒绝等 | 提示玩家凭证无效、引导重新充值 |
deposit_voucher_reupload_required |
充值凭证验单:识别失败(OCR / 凭证无法识别) | 通知 H5 重新上传水单 |
deposit_voucher_manual_review |
验单结果需人工审核 | 可选:提示玩家等待审核 |
deposit_voucher_service_unavailable |
验单服务不可用(限流、网络等) | 提示稍后重传凭证 |
deposit_cancelled |
玩家取消充值 | 关闭 H5 充值页、释放占用 |
deposit_expired |
支付超时,充值单过期 | 提示玩家重新发起充值 |
充值回调公共字段
所有充值相关回调 payload 均包含以下字段(部分可选):
| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 事件类型 |
orderNo | string | 充值订单号 |
playerId | string | 玩家 ID |
agentCode | string | 代理商编号 |
amount | number | 订单金额(金额不符完成时可能已调整为实付金额) |
detectedAmount | number | 可选,凭证识别金额 |
targetType | string | 可选,收款类型如 withdraw_match / agent_bank_account |
transactionId | string | 可选,银行流水号 |
status | string | 订单状态 |
voucherStatus | string | 凭证状态 |
issueType | string | 可选,验单问题类型 |
reviewStatus | string | 可选,审核状态 |
message | string | 可选,说明文案(英文) |
completedAt | string | 可选,完成时间(ISO-8601) |
verifiedAt | string | 可选,验单时间(ISO-8601) |
提现回调公共字段
所有提现相关回调 payload 均包含以下字段(部分可选):
| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 事件类型 |
orderNo | string | 提款订单号 |
playerId | string | 玩家 ID |
agentCode | string | 代理商编号 |
totalAmount | number | 提款总金额 |
remainingAmount | number | 剩余未匹配 / 未到账金额 |
matchedAmount | number | 已匹配金额(total − remaining) |
status | string | 订单状态 |
poolFreezeStatus | string | 池冻结状态 |
depositOrderNo | string | 可选,本次关联充值单号(matched / settled) |
matchAmount / settledAmount | number | 可选,本次匹配或到账金额 |
completedAt / expiredAt / expiresAt | string | 可选,ISO-8601 时间 |
matches | array | 可选,已匹配充值单列表 |
message | string | 可选,说明文案(英文) |
提款订单超过总等待时间仍未完全匹配时触发。
Payload 字段
| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 固定 withdraw_timeout |
orderNo | string | 提款订单号 |
playerId | string | 玩家 ID |
agentCode | string | 代理商编号 |
totalAmount | number | 提款总金额 |
remainingAmount | number | 过期时剩余未匹配金额 |
matchedAmount | number | 已匹配金额合计 |
status | string | 订单状态,通常为 expired |
expiredAt | string | 过期时间(ISO-8601) |
matches | array | 已匹配充值单,每项含 depositOrderNo、amount、matchedAt |
示例
{
"event": "withdraw_timeout",
"orderNo": "W202605260001",
"playerId": "P10001",
"agentCode": "AG001",
"totalAmount": 5000,
"remainingAmount": 2000,
"matchedAmount": 3000,
"status": "expired",
"expiredAt": "2026-05-26T10:30:00Z",
"matches": [
{
"depositOrderNo": "D202605260010",
"amount": 3000,
"matchedAt": "2026-05-26T10:15:00Z"
}
]
}
充值凭证验单失败且不可重传:收款账号不符(account_mismatch)或 凭证/ 银行流水已被使用(duplicate)。系统将释放提款匹配占用或银行账户预占,并将充值单置为 rejected。
Payload 字段
| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 固定 deposit_voucher_rejected |
orderNo | string | 充值订单号 |
playerId | string | 玩家 ID |
agentCode | string | 代理商编号 |
amount | number | 订单金额 |
issueType | string | account_mismatch、duplicate 或 manual_reject 等 |
message | string | 验单说明 |
status | string | 固定 rejected |
示例
{
"event": "deposit_voucher_rejected",
"orderNo": "D202605260001",
"playerId": "P10001",
"agentCode": "AG001",
"amount": 1000,
"issueType": "account_mismatch",
"message": "收款账号与订单不一致",
"status": "rejected"
}
充值凭证无法识别(recognition_failed)。订单重置为 waiting_payment、凭证状态为 not_uploaded,玩家可再次调用 submit-voucher 上传。
Payload 字段
| 字段 | 类型 | 说明 |
|---|---|---|
event | string | 固定 deposit_voucher_reupload_required |
orderNo | string | 充值订单号 |
playerId | string | 玩家 ID |
agentCode | string | 代理商编号 |
amount | number | 订单金额 |
message | string | 识别失败原因 |
status | string | waiting_payment |
voucherStatus | string | not_uploaded |
示例
{
"event": "deposit_voucher_reupload_required",
"orderNo": "D202605260001",
"playerId": "P10001",
"agentCode": "AG001",
"amount": 1000,
"message": "凭证 OCR 识别失败,请重新上传清晰凭证",
"status": "waiting_payment",
"voucherStatus": "not_uploaded"
}
接入建议
- 回调接口应幂等:同一订单可能因重试收到重复通知,请按
event+orderNo去重。 - 收到
deposit_voucher_completed或deposit_voucher_amount_mismatch后,按amount给玩家加款。 - 收到
deposit_voucher_reupload_required或deposit_voucher_service_unavailable后,H5 应保留当前充值单并重新打开上传入口,无需重新deposit-match。 - 收到
deposit_voucher_rejected、deposit_cancelled或deposit_expired后,充值单已关闭,玩家需重新发起充值。 - 收到
deposit_voucher_manual_review后,订单等待后台人工处理,完成后会再推送deposit_voucher_completed或deposit_voucher_rejected。 - 收到
withdraw_matched后,表示已有充值方接单,提现玩家等待对方转账。 - 收到
withdraw_settled或withdraw_completed后,按到账进度更新 H5 展示。 - 收到
withdraw_timeout或withdraw_released后,提现单已关闭,玩家需重新发起。 - 收到
withdraw_requeued后,提现单已重新进入匹配池,可继续等待撮合。
常见错误码
| code | 说明 | 场景 |
|---|---|---|
0 | 成功 | — |
80000 | 账户无效 | API Key 无效、已失效或代理商不存在 |
80005 | 无权使用此功能 | IP 不在白名单 / 在黑名单,或其他权限拒绝 |
80006 | 请登录以验证用户 | 未携带 API Key |
60002 | 存在进行中的交易 | 重复发起充值 |
60003 | 会话已过期 | 订单超时 |
60004 | 取消后 3 分钟内不可发起 | 取消冷却期 |
60007 | 无待处理项 | 提款池无匹配 |
14002 | 金额不在允许范围 | 金额校验失败 |
50002 | 转账凭证无效 | 水单验真失败 |
50004 | 凭证已被使用 | 重复水单 |
50008 | 收款方不一致 | 水单账号与订单不匹配 |
88003 | 余额不足 | 池子额度不够 |
99002 | 参数校验失败 | 缺少必填字段 |
调用示例
以下示例使用本地开发 Key dev-atp-key-change-me(代理商 AG001)。生产环境请替换为管理后台获取的 atp_... Key。
充值
curl -s -X POST http://localhost:8080/ext/p2c/deposit-match \
-H 'Content-Type: application/json' \
-H 'x-atp-key: dev-atp-key-change-me' \
-d '{
"agentCode": "AG001",
"memberId": "P10001",
"amount": 1000,
"bankCode": "SCB"
}'
# 或使用 Bearer 方式
# -H 'Authorization: Bearer dev-atp-key-change-me'
上传水单并提交验单
curl -s -X POST http://localhost:8080/ext/p2c/submit-voucher \
-H 'Content-Type: application/json' \
-H 'x-atp-key: dev-atp-key-change-me' \
-d '{
"ref": "D202605260001",
"base64Data": "<BASE64>",
"contentType": "image/jpeg"
}'
玩家提现进池
curl -s -X POST http://localhost:8080/ext/p2c/withdraw-request \
-H 'Content-Type: application/json' \
-H 'x-atp-key: dev-atp-key-change-me' \
-d '{
"agentCode": "AG001",
"memberId": "P10001",
"amount": 5000,
"bankCode": "SCB",
"accountNo": "1234567890",
"accountName": "Somchai S"
}'
银行列表
curl -s http://localhost:8080/ext/p2c/bank-list \
-H 'x-atp-key: dev-atp-key-change-me'