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。
请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
amount | string | 是 | 金额字符串,须为正数,例如 "19.99" |
currency | string | 是 | 币种,例如 USDC、USDT |
chain | string | 条件 | 单链,例如 ETH、BASE。与 chains 二选一 |
chains | string[] | 条件 | 多链时使用;会为每条链预占收款地址,供买家选择 |
success_url | string | 否 | Hosted 支付成功后的回跳地址 |
cancel_url | string | 否 | 取消后的回跳地址 |
metadata | object | 否 | 键值均为字符串,用来放你的业务单号等 |
请求示例
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 字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | uuid | 会话 id,与 payment_id 相同 |
payment_id | uuid | Payment 的 id(就是上面的 id) |
status | string | pending | paid | expired | cancelled | partial_refund | refunded |
amount | string | 应收金额 |
currency | string | 币种 |
chain | string | 当前主链 / 选中链 |
address | string | 只选一条链时的收款地址 |
chain_options | array | 多链时:[{ "chain", "address" }, …] |
client_secret | string | 给 Hosted 或公开轮询用,请当敏感信息保管 |
hosted_url | string | 让买家打开的收银台链接(…/c/{id}#client_secret=…) |
expires_at | string | 过期时间(ISO-8601,有则返回) |
success_url / cancel_url | string | 创建时传入值的回显 |
metadata | object | 创建时传入值的回显 |
refundable | bool | 当前是否允许退款 |
cancellable | bool | 当前是否允许取消 |
tx_hash | string | 链上确认后可能出现 |
refunded_amount | string | 已退累计金额(有退款时) |
created_at | string | 创建时间(ISO-8601) |
建议在服务端用 Secret Key 创建会话,再只把 hosted_url(或 id + client_secret)交给前端。
创建失败时常见错误
| HTTP | error.code | 含义 |
|---|---|---|
| 400 | invalid_amount | 金额或币种不合法 |
| 400 | invalid_chain | 链未启用或不存在 |
| 400 | invalid_body | 请求体不是合法 JSON |
| 503 | pool_exhausted | 暂时没有空闲收款地址,可稍后重试 |
| 503 | checkout_unavailable | Checkout 能力未就绪 |
| 422 | checkout_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(),
});
| 选项 | 类型 | 说明 |
|---|---|---|
hostedUrl | string | 推荐直接传 create 返回的完整 URL |
sessionId + clientSecret | string | 没有完整 URL 时的替代写法 |
openMode | string | new_tab(默认)或 same_tab |
onPaid | function | 前端轮询到 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. 确认到账之后做什么
- 以
checkout.paidwebhook 作为是否到账的权威信号 - 有需要时,再查一次
GET …/sessions/{id},确认status === "paid" - 用
payment_id或metadata.order_id做幂等,把订单标为已支付,再发货或开通权益 - 收到
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 内长期充值地址与代客提现
