← 返回 API 文档

Checkout

用 Checkout 收款

在服务端创建收款会话、打开 Hosted 收银台;确认到账后,再把订单标为已支付并完成发货或开通权益。

用 Checkout 收款

买家需要一次性付清一笔固定金额时(下单、付账单、充值单等),用 Checkout 最合适。

流程很直接:你的服务端创建 Checkout Session → 买家在 Hosted 收银台(pay.doggiepay.com)或通过 Button SDK 付款 → 你收到 webhook checkout.paid(也可以再用服务端查单核对)→ 把订单标为已支付,然后发货或开通权益。

开始前请先读完 快速开始,准备好 Secret Key 和 Request-Id。

你的服务端                 Doggie Pay                  买家
    |                           |                       |
    |-- POST /checkout/sessions -->|                       |
    |<-- hosted_url, id -----------|                       |
    |-- 打开 hosted_url ---------->|---------------------->|
    |                           |<-- 链上 USDC/USDT ------|
    |<-- webhook checkout.paid ----|                       |
    |-- 标已付 → 发货 / 开通权益 ---|                       |

1. 创建 Checkout Session

POST /v1/checkout/sessions
鉴权: Secret 或 Publishable 都可以,但都必须带 Request-Id。

请求体

字段类型必填说明
amountstring是金额字符串,须为正数,例如 "19.99"
currencystring是币种,例如 USDC、USDT
chainstring条件单链,例如 ETH、BASE。与 chains 二选一
chainsstring[]条件多链时使用;会为每条链预占收款地址,供买家选择
success_urlstring否Hosted 支付成功后的回跳地址
cancel_urlstring否取消后的回跳地址
metadataobject否键值均为字符串,用来放你的业务单号等

请求示例

curl -sS https://api.doggiepay.com/v1/checkout/sessions \
  -H "Authorization: Bearer dp_live_sk_YOUR_SECRET" \
  -H "X-DoggiePay-Request-Id: $(uuidgen | tr '[:upper:]' '[:lower:]')" \
  -H "Idempotency-Key: order-1001-pay" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "19.99",
    "currency": "USDC",
    "chain": "BASE",
    "success_url": "https://merchant.example/orders/1001/paid",
    "cancel_url": "https://merchant.example/orders/1001/cancel",
    "metadata": { "order_id": "1001" }
  }'

响应里的 data 字段

字段类型说明
iduuid会话 id,与 payment_id 相同
payment_iduuidPayment 的 id(就是上面的 id)
statusstringpending | paid | expired | cancelled | partial_refund | refunded
amountstring应收金额
currencystring币种
chainstring当前主链 / 选中链
addressstring只选一条链时的收款地址
chain_optionsarray多链时:[{ "chain", "address" }, …]
client_secretstring给 Hosted 或公开轮询用,请当敏感信息保管
hosted_urlstring让买家打开的收银台链接(…/c/{id}#client_secret=…)
expires_atstring过期时间(ISO-8601,有则返回)
success_url / cancel_urlstring创建时传入值的回显
metadataobject创建时传入值的回显
refundablebool当前是否允许退款
cancellablebool当前是否允许取消
tx_hashstring链上确认后可能出现
refunded_amountstring已退累计金额(有退款时)
created_atstring创建时间(ISO-8601)

建议在服务端用 Secret Key 创建会话,再只把 hosted_url(或 id + client_secret)交给前端。

创建失败时常见错误

HTTPerror.code含义
400invalid_amount金额或币种不合法
400invalid_chain链未启用或不存在
400invalid_body请求体不是合法 JSON
503pool_exhausted暂时没有空闲收款地址,可稍后重试
503checkout_unavailableCheckout 能力未就绪
422checkout_create_failed其他创建失败

2. 打开 Hosted 收银台

拿到 hosted_url 后,跳转或 window.open 即可。Hosted 页面在 https://pay.doggiepay.com。

可选:Button SDK

npm install @doggiepay/checkout
import { mountDoggiePayButton } from "@doggiepay/checkout";

mountDoggiePayButton("#pay", {
  hostedUrl,              // 来自服务端 create 响应
  openMode: "new_tab",    // 或 "same_tab"
  onPaid: () => refreshOrder(),
});
选项类型说明
hostedUrlstring推荐直接传 create 返回的完整 URL
sessionId + clientSecretstring没有完整 URL 时的替代写法
openModestringnew_tab(默认)或 same_tab
onPaidfunction前端轮询到 paid 时的回调;是否发货仍以 webhook 为准

3. 查询会话状态

商户侧查询(Secret)

GET /v1/checkout/sessions/{id}

curl -sS "https://api.doggiepay.com/v1/checkout/sessions/SESSION_UUID" \
  -H "Authorization: Bearer dp_live_sk_YOUR_SECRET" \
  -H "X-DoggiePay-Request-Id: $(uuidgen | tr '[:upper:]' '[:lower:]')"

公开轮询(不带 Bearer,给 Hosted 用)

用 query 或 header 带上 client_secret:

GET /v1/checkout/sessions/{id}?client_secret=…
X-DoggiePay-Client-Secret: …

请不要只凭前端跳转就认定「已经付过款」。正式结论请看 Webhooks。

4. 取消会话

POST /v1/checkout/sessions/{id}/cancel
鉴权: Secret,或持有 client_secret(Hosted 上的取消)。

只有 cancellable === true 时能取消,一般是 pending 状态。

取消成功后会推送 checkout.cancelled。

5. 确认到账之后做什么

  1. 以 checkout.paid webhook 作为是否到账的权威信号
  2. 有需要时,再查一次 GET …/sessions/{id},确认 status === "paid"
  3. 用 payment_id 或 metadata.order_id 做幂等,把订单标为已支付,再发货或开通权益
  4. 收到 checkout.expired / checkout.cancelled 时,记得释放库存

6. 退款(可选)

POST /v1/refunds — 需要 Secret。只适用于已支付的 Checkout Payment,不适用于 Customers 入金。

字段必填说明
payment_id是*会话 / payment 的 UUID;也可用别名 checkout_session_id
checkout_session_id是*payment_id 的别名
amount是退款金额(字符串)
currency是须与原支付一致
to_address是买家收款地址
chain是出金所在链(该资产须已启用)
curl -sS https://api.doggiepay.com/v1/refunds \
  -H "Authorization: Bearer dp_live_sk_YOUR_SECRET" \
  -H "X-DoggiePay-Request-Id: $(uuidgen | tr '[:upper:]' '[:lower:]')" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_id": "SESSION_UUID",
    "amount": "19.99",
    "currency": "USDC",
    "chain": "BASE",
    "to_address": "0xBuyer…"
  }'

后续进度可看 refund.* webhook,或调用 GET /v1/refunds。

7. 接下来可以看什么

  • Webhooks — 用 HMAC 校验 checkout.paid
  • Customers 产品线 — App 内长期充值地址与代客提现