快速开始
快速开始
注册商户、准备密钥,并按规范发出你的第一次 API 请求。
快速开始
本文面向需要在自己的服务端对接 Doggie Pay 的开发者。读完后,你可以:
- 分清 Checkout 与 Customers 两条产品线,选对接入方式
- 正确使用密钥与请求头
- 成功发出一次只读调用,确认环境可用
接口根地址
https://api.doggiepay.com
对接用接口都在 /v1/* 下。注意不要打到 /v1/portal/*(商户门户专用),也不要使用内部运维接口。
1. 先选产品线
| 产品线 | 适合什么场景 | 核心对象 | 常见 Webhook |
|---|---|---|---|
| Checkout | 一笔订单、一张账单,收一次款 | Checkout Session(即 Payment) | checkout.paid、checkout.expired、checkout.cancelled |
| Customers | App 里给用户充值、代用户提现 | Customer、长期充值地址 | deposit.credited、withdrawal.* |
- 走 Checkout → 下一篇:用 Checkout 收款
- 走 Customers → 另有专文(创建客户、入金、提现)
- 两条线共用鉴权、Request-Id,以及 Webhooks
有一点很重要:链上资金进入的是你的商户余额。如果产品里还有「用户余额」,需要由你自己的系统记账。
2. 接入前准备
- 到 merchant.doggiepay.com 注册商户
- 在门户创建 Secret Key(形如
dp_live_sk_…),只放在服务端(环境变量或 KMS) - 如需浏览器调用白名单接口,再创建 Publishable Key(
dp_live_pk_…) - 配置 Webhook URL,并立刻保存页面上只展示一次的
webhook_secret(whsec_…)。详见 Webhooks
Secret Key 不要写进 App、前端页面或公开仓库。
3. 怎么鉴权
三种凭证
| 凭证 | 格式 | 放哪里 | 做什么 |
|---|---|---|---|
| Secret Key | Bearer dp_live_sk_… | 仅服务端 | 对接默认方式;写操作和敏感查询都用它 |
| Publishable Key | Bearer dp_live_pk_… | 服务端,或白名单场景下的浏览器 | 只能调下表中的接口 |
| 门户登录 JWT | Google 登录会话 | 仅商户门户 | 只用于 /v1/portal/*,不能当对接密钥用 |
Publishable Key 能调哪些接口
| Method | Path |
|---|---|
GET | /v1/merchant/me |
GET | /v1/chains |
GET | /v1/tokens |
GET | /v1/wallets/{external_user_id} |
POST | /v1/checkout/sessions |
除此之外的对接接口,一律需要 Secret Key。
对接请求必带的头
Authorization: Bearer dp_live_sk_YOUR_SECRET
X-DoggiePay-Request-Id: 550e8400-e29b-41d4-a716-446655440000
Content-Type: application/json
| Header | 是否必填 | 说明 |
|---|---|---|
Authorization | 必填 | Bearer 加上 Secret 或 Publishable |
X-DoggiePay-Request-Id | 必填 | UUID v4;响应头会原样回显,方便排障 |
Idempotency-Key | 写操作建议带 | 优先用它做幂等;不传时退回用 Request-Id |
Content-Type | 有 JSON 正文时 | 填 application/json |
关于重试: 创建、更新类请求如果超时需要重试,请使用同一个 Request-Id(或 Idempotency-Key),并且 body 保持不变。同一 ID、不同 body,会返回 409 request_id_conflict。
4. 统一响应格式
成功时大致是:
{
"data": { },
"error": null
}
失败时大致是:
{
"data": null,
"error": {
"code": "unauthorized",
"message": "Bearer token required"
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
data | object | array | null | 成功时的业务数据 |
error | object | null | 失败时才有 |
error.code | string | 稳定、可编程判断的错误码 |
error.message | string | 给人看的说明 |
5. 发出第一次请求
先查当前已启用的链(Secret、Publishable 都可以):
curl -sS https://api.doggiepay.com/v1/chains \
-H "Authorization: Bearer dp_live_sk_YOUR_SECRET" \
-H "X-DoggiePay-Request-Id: $(uuidgen | tr '[:upper:]' '[:lower:]')"
返回的 data 可能类似:
{
"chains": ["ETH", "BASE"]
}
也可以查代币列表(可加 ?currency=USDC):
curl -sS "https://api.doggiepay.com/v1/tokens?currency=USDC" \
-H "Authorization: Bearer dp_live_sk_YOUR_SECRET" \
-H "X-DoggiePay-Request-Id: $(uuidgen | tr '[:upper:]' '[:lower:]')"
6. 常见错误码
| HTTP | error.code | 通常表示 |
|---|---|---|
| 401 | unauthorized | 没带或带错 Bearer |
| 401 | portal_token_not_allowed | 对接接口用了门户 JWT |
| 403 | secret_key_required | 该接口需要 Secret,却用了 Publishable |
| 403 | merchant_disabled | 商户已被禁用 |
| 400 | request_id_required | 缺少 X-DoggiePay-Request-Id |
| 400 | invalid_request_id | Request-Id 不是合法 UUID |
| 409 | request_id_conflict | 同一 Request-Id,但 body 前后不一致 |
7. 接下来可以看什么
- 用 Checkout 收款 — 创建收款会话,打开 Hosted 收银台
- Webhooks — 验签;收到
checkout.paid后再把订单标为已支付 - 前端需要支付按钮时,安装
@doggiepay/checkout
常用域名
| 域名 | 用途 |
|---|---|
https://api.doggiepay.com | REST API |
https://merchant.doggiepay.com | 商户门户(密钥、Webhook、余额) |
https://pay.doggiepay.com | Hosted 收银台 / Claim 页面 |
