JDH API

本文档面向接入方(代理商 / 平台),说明如何通过 Gateway 调用充值提现相关接口。 所有对外接口统一挂载在 /ext/p2c/* 路径下。

REST · JSON HTTP 始终 200 code 为字符串 Gateway :8080

鉴权

所有 /ext/p2c/* 接口(除 /ext/p2c/health 外)均须在请求头携带 API Key。Gateway 校验 Key 有效性、代理商状态及 IP 访问策略。

请求头(推荐)
x-atp-key: <your-api-key>
Bearer Token
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": { }
}
字段类型说明
codestring"0" 表示成功,其他为业务错误码
messagestring人类可读说明
dataobject | array | null业务数据,失败时通常为 null

充值流程

玩家发起充值后,系统优先匹配提款池中的待提款单;若无匹配则路由至代理商银行卡收款。

1. deposit-match 2. 玩家转账 3. submit-voucher 4. 自动验单 / 人工审核 completed
  • 同一玩家同时只能有一笔进行中的充值单。
  • 成功时返回收款账户信息(提款方或银行卡)。
  • 上传水单后图片 Base64 直接存入管理后台数据库,并触发 凭证验真服务 验真(可配置模拟模式)。
  • 验单异步处理;凭证拒绝或需重传时,平台会向代理商配置的 callbackUrl 推送事件(见事件回调)。
  • 可通过 deposit-active 查询进行中订单,deposit-cancel 取消。

提现进池流程

玩家提现申请进入代理商提款池,等待充值方匹配。

1. withdraw-request 2. waiting_match 3. 充值方 deposit-match 4. completed
  • 创建提款单时会冻结代理商池子对应额度。
  • 充值方 deposit-match 匹配成功时推送 withdraw_matched;关联充值验单到账后推送 withdraw_settled(部分)或 withdraw_completed(全部)。
  • 总等待时间到期未完全匹配时,系统将过期并释放冻结额度,推送 withdraw_timeout
  • 后台人工释放或重新排队时推送 withdraw_released / withdraw_requeued(见事件回调)。

P2C 存款流程(AutoPeer 兼容)

适用于传统 P2C 存款场景,订单由 Gateway 本地管理,与充值为独立流程。

deposit upload-voucher / generate-link deposit-status completed

充值接口

POST /ext/p2c/deposit-match

创建充值单并尝试提款池。无匹配时分配代理商银行卡。

请求体

字段类型必填说明
agentCodestring代理商编号
memberIdstring玩家 ID
amountnumber充值金额(泰铢),须 > 0
bankCodestring付款银行代码,如 SCB、KBANK

响应 data 主要字段

字段说明
orderNo充值订单号(后续上传水单、取消时使用)
matchedWithdraw是否到提款单
targetType收款类型:withdrawal_matchagent_bank_account
bankCode / accountNo / accountName收款账户信息
status订单状态,初始为 waiting_payment
expiresAt支付截止时间
POST /ext/p2c/deposit-active

查询玩家当前进行中的充值单(用于 H5 页面恢复状态)。

字段类型必填说明
memberIdstring玩家 ID
POST /ext/p2c/deposit-cancel

取消充值单。取消后 3 分钟内不可再次发起(防刷)。

字段类型必填说明
memberIdstring玩家 ID
refstring订单号;不传则取消当前进行中订单

提现接口

POST /ext/p2c/withdraw-request

玩家提现申请,进入代理商提款池。

字段类型必填说明
agentCodestring代理商编号
memberIdstring玩家 ID
amountnumber提现金额
bankCodestring收款银行代码
accountNostring收款账号
accountNamestring收款人姓名

响应 data 主要字段

字段说明
orderNo提款订单号
status初始为 waiting_match
expiresAt截止时间
poolAvailable代理商池子可用额度
POST /ext/p2c/withdraw

提款状态回调(平台 → Gateway),用于同步外部提款状态变更。

字段类型必填说明
refidstring关联订单号
statusstring状态,如 WITHDRAW
amountnumber金额
beforeTransferstring转账前状态
afterTransferstring转账后状态
withdrawAmountnumber条件status=WITHDRAW 时必填

水单上传接口

POST /ext/p2c/submit-voucher

提交转账凭证 Base64,图片存入管理后台数据库并触发 凭证验真服务 自动验单。接口同步返回成功仅表示「已接收」;验单结果通过 事件回调 异步通知,验单通过或金额不符自动完成也会推送对应事件。

字段类型必填说明
refstring充值订单号 orderNo
base64Datastring图片 Base64,支持纯 Base64 或 data:image/...;base64,...
contentTypestring默认 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
POST /ext/p2c/storage/upload-base64

已弃用(水单场景):充值水单请直接使用 submit-voucher。本接口仍可用于其他需 MinIO 存储的场景。

字段类型必填说明
base64Datastring图片 Base64(不含 data: 前缀)
contentTypestringimage/jpeg
fileNamestring文件名
bizTypestring默认 voucher
bizRefstring业务关联号
POST /ext/p2c/upload-voucher

P2C 流程专用:一步上传 Base64 水单(Gateway 本地订单)。

字段类型必填说明
refstringP2C 订单 ref
imgVoucherstring水单图片 Base64

P2C 存款接口

POST /ext/p2c/deposit

创建 P2C 存款订单。

字段类型必填说明
memberIdstring玩家 ID
amountnumber金额
bankCodestring付款银行
accountNostring付款账号
remarkstring备注
POST /ext/p2c/deposit-status

查询存款状态。请求体传 refmemberId 之一。

POST /ext/p2c/deposit-pending

查询玩家待转账的存款列表。

POST /ext/p2c/generate-token

为指定订单重新生成访问令牌。请求体:{ "ref": "..." }

POST /ext/p2c/generate-link

生成 Payment Link。请求体含 memberIdamount,可选 bankCodereturnUrl

POST /ext/p2c/force-complete-transfer

强制完成转账。请求体:{ "refs": ["ref1", "ref2"] }

POST /ext/p2c/request-cancel-transfer

请求取消存款(取消后 3 分钟封禁)。请求体:{ "refs": ["ref1"] }

通用接口

GET /ext/p2c/bank-list

获取支持的泰国银行列表。响应为数组,每项含 codenamenameEn

GET /ext/p2c/health

服务健康检查。响应 data.dbokbad

事件回调(callbackUrl)

平台在特定业务节点向代理商配置的 回调 URL 主动发起 HTTP 请求。 方向为 平台 → 代理商,与 Gateway 对外 API 相反。 请在管理后台「代理商」编辑页填写 callbackUrl(HTTPS 推荐)。

  • 请求方式:POSTContent-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 均包含以下字段(部分可选):

字段类型说明
eventstring事件类型
orderNostring充值订单号
playerIdstring玩家 ID
agentCodestring代理商编号
amountnumber订单金额(金额不符完成时可能已调整为实付金额)
detectedAmountnumber可选,凭证识别金额
targetTypestring可选,收款类型如 withdraw_match / agent_bank_account
transactionIdstring可选,银行流水号
statusstring订单状态
voucherStatusstring凭证状态
issueTypestring可选,验单问题类型
reviewStatusstring可选,审核状态
messagestring可选,说明文案(英文)
completedAtstring可选,完成时间(ISO-8601)
verifiedAtstring可选,验单时间(ISO-8601)

提现回调公共字段

所有提现相关回调 payload 均包含以下字段(部分可选):

字段类型说明
eventstring事件类型
orderNostring提款订单号
playerIdstring玩家 ID
agentCodestring代理商编号
totalAmountnumber提款总金额
remainingAmountnumber剩余未匹配 / 未到账金额
matchedAmountnumber已匹配金额(total − remaining)
statusstring订单状态
poolFreezeStatusstring池冻结状态
depositOrderNostring可选,本次关联充值单号(matched / settled)
matchAmount / settledAmountnumber可选,本次匹配或到账金额
completedAt / expiredAt / expiresAtstring可选,ISO-8601 时间
matchesarray可选,已匹配充值单列表
messagestring可选,说明文案(英文)
POST 出站 callbackUrl event = withdraw_timeout

提款订单超过总等待时间仍未完全匹配时触发。

Payload 字段

字段类型说明
eventstring固定 withdraw_timeout
orderNostring提款订单号
playerIdstring玩家 ID
agentCodestring代理商编号
totalAmountnumber提款总金额
remainingAmountnumber过期时剩余未匹配金额
matchedAmountnumber已匹配金额合计
statusstring订单状态,通常为 expired
expiredAtstring过期时间(ISO-8601)
matchesarray已匹配充值单,每项含 depositOrderNoamountmatchedAt

示例

{
  "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"
    }
  ]
}
POST 出站 callbackUrl event = deposit_voucher_rejected

充值凭证验单失败且不可重传:收款账号不符(account_mismatch)或 凭证/ 银行流水已被使用(duplicate)。系统将释放提款匹配占用或银行账户预占,并将充值单置为 rejected

Payload 字段

字段类型说明
eventstring固定 deposit_voucher_rejected
orderNostring充值订单号
playerIdstring玩家 ID
agentCodestring代理商编号
amountnumber订单金额
issueTypestringaccount_mismatchduplicatemanual_reject
messagestring验单说明
statusstring固定 rejected

示例

{
  "event": "deposit_voucher_rejected",
  "orderNo": "D202605260001",
  "playerId": "P10001",
  "agentCode": "AG001",
  "amount": 1000,
  "issueType": "account_mismatch",
  "message": "收款账号与订单不一致",
  "status": "rejected"
}
POST 出站 callbackUrl event = deposit_voucher_reupload_required

充值凭证无法识别(recognition_failed)。订单重置为 waiting_payment、凭证状态为 not_uploaded,玩家可再次调用 submit-voucher 上传。

Payload 字段

字段类型说明
eventstring固定 deposit_voucher_reupload_required
orderNostring充值订单号
playerIdstring玩家 ID
agentCodestring代理商编号
amountnumber订单金额
messagestring识别失败原因
statusstringwaiting_payment
voucherStatusstringnot_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_completeddeposit_voucher_amount_mismatch 后,按 amount 给玩家加款。
  • 收到 deposit_voucher_reupload_requireddeposit_voucher_service_unavailable 后,H5 应保留当前充值单并重新打开上传入口,无需重新 deposit-match
  • 收到 deposit_voucher_rejecteddeposit_cancelleddeposit_expired 后,充值单已关闭,玩家需重新发起充值。
  • 收到 deposit_voucher_manual_review 后,订单等待后台人工处理,完成后会再推送 deposit_voucher_completeddeposit_voucher_rejected
  • 收到 withdraw_matched 后,表示已有充值方接单,提现玩家等待对方转账。
  • 收到 withdraw_settledwithdraw_completed 后,按到账进度更新 H5 展示。
  • 收到 withdraw_timeoutwithdraw_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'