# API ที่เข้ากันได้กับ Coinbase Commerce

> ย้ายจาก Coinbase Commerce มา blockwallets ด้วยการเปลี่ยน base URL ของ SDK และคีย์: endpoint ของ charge ที่รองรับ Webhook และลายเซ็น และข้อแตกต่าง
>
> HTML: https://blockwallets.io/docs/coinbase-commerce?lang=th · English: https://blockwallets.io/docs/coinbase-commerce.md?lang=en

## API ที่เข้ากันได้กับ Coinbase Commerce

endpoint ของ charge เฮดเดอร์ `X-CC-Api-Key` อ็อบเจกต์ charge และ webhook ที่เซ็นด้วย `X-CC-Webhook-Signature` เป็นไปตามเอกสารของ Coinbase Commerce SDK ทางการจึงใช้ได้หลังเปลี่ยนเพียงบรรทัดเดียว Coinbase Commerce หยุดให้บริการร้านค้านอกสหรัฐอเมริกาและสิงคโปร์ตั้งแต่ 2026-03-31 ย้ายมาจากที่อื่น? ดู[ภาพรวมการย้าย](https://blockwallets.io/docs/migrate?lang=th)

ภายในเป็นใบแจ้งหนี้ blockwallets ปกติ: ที่อยู่รับเงินเป็นของคุณ หน้าชำระเงินคือหน้าชำระเงินที่เราโฮสต์ และการชำระจะนับก็ต่อเมื่อยืนยันบนเชนแล้วและตรวจไขว้กับโหนดที่สอง ต่อไปนี้: สามขั้นตอน จากนั้นสิ่งที่แต่ละ API รองรับและ**ต่างจากต้นฉบับอย่างไร** พารามิเตอร์ที่เราไม่ได้ทำจะตอบข้อผิดพลาด ไม่ถูกเมินไปเงียบ ๆ

### สามขั้นตอน

- สมัครบัญชีร้านค้า ([ขอใช้งานที่หน้าแรก](https://blockwallets.io/?lang=th#join)) และเพิ่มโดเมนของคุณที่ “โดเมนเว็บไซต์” ใน “นักพัฒนา › การเชื่อมต่อและคีย์” ของแดชบอร์ด URL callback (`ipn_callback_url`) และ URL เปลี่ยนเส้นทาง (`success_url` / `cancel_url` / `redirect_url`) ต้องอยู่ในโดเมนเหล่านั้นหรือโดเมนของ URL callback ของคุณ คีย์ที่รั่วไหลจึงชี้ Webhook ไปที่อื่นไม่ได้

- สร้างข้อมูลรับรองที่เข้ากันได้ในแดชบอร์ดร้านค้าที่ “นักพัฒนา › การเชื่อมต่อและคีย์” ชุดใช้งานจริงและชุดทดสอบอย่างละชุด: NOWPayments ได้ **API key + IPN secret** ส่ง Coinbase Commerce ได้ **API key + webhook shared secret** แสดงเพียงครั้งเดียว เราเก็บเฉพาะค่าแฮช / ข้อความเข้ารหัส

- ชี้โค้ดของคุณไปที่ base URL ด้านล่างและใช้คีย์ใหม่ รันบนเทสต์เน็ตด้วยข้อมูลรับรองทดสอบก่อน แล้วค่อยสลับเป็นใช้งานจริง

| ก่อน | หลัง | เฮดเดอร์การยืนยันตัวตน | ลายเซ็น Webhook |
| --- | --- | --- | --- |
| `https://api.commerce.coinbase.com` | `https://blockwallets.io/coinbase/` | `X-CC-Api-Key` | `X-CC-Webhook-Signature` (HMAC-SHA256) |

### Coinbase Commerce

SDK ทางการทุกตัวรับ base URL: เปลี่ยนบรรทัดเดียว (ระวัง `/` ท้ายสุด):

```sdk
// Node(coinbase-commerce-node)
const { Client } = require("coinbase-commerce-node");
- Client.init(process.env.COINBASE_COMMERCE_API_KEY);
+ Client.init(process.env.COINBASE_COMMERCE_API_KEY, "https://blockwallets.io/coinbase/");

# Python(coinbase-commerce)
- client = Client(api_key=API_KEY)
+ client = Client(api_key=API_KEY, base_api_uri="https://blockwallets.io/coinbase/")

// PHP(coinbase/coinbase-commerce)
- ApiClient::init($apiKey);
+ ApiClient::init($apiKey, 'https://blockwallets.io/coinbase/');
```

```curl
curl -X POST https://blockwallets.io/coinbase/charges \
  -H "X-CC-Api-Key: $COINBASE_COMMERCE_API_KEY" -H "X-CC-Version: 2018-03-22" \
  -H "content-type: application/json" \
  -d '{"name":"Order #12345","description":"Pro plan","pricing_type":"fixed_price",
       "local_price":{"amount":"100.00","currency":"USD"},
       "redirect_url":"https://shop.example/success","cancel_url":"https://shop.example/cancel",
       "metadata":{"order_id":"12345"}}'
# → 201 {"data": {"id": "…", "code": "7C7V5ECK", "hosted_url": "https://blockwallets.io/pay/inv_…", "timeline": [{"status": "NEW", …}], …}}
```

#### Endpoint ที่รองรับ

| Endpoint | หมายเหตุ |
| --- | --- |
| `POST /charges` | สร้าง charge `hosted_url` คือหน้าชำระเงินที่เราโฮสต์ มีอายุ 1 ชั่วโมง |
| `GET /charges/:code_or_id` | ค้นด้วยรหัส 8 ตัวอักษรหรือ id |
| `GET /charges` | รายการ: `limit` (≤100) / `starting_after` / `ending_before` / `order` พร้อมอ็อบเจกต์ `pagination` เดียวกัน |
| `POST /charges/:code_or_id/cancel` | ยกเลิก charge ที่ยังไม่พบการชำระ |

ไม่มี: `/charges/:code/resolve` (400 ให้จัดการ charge ที่จ่ายขาดในแดชบอร์ด), `/checkouts`, `/events`, `/invoices` (404)

#### Webhook

Webhook ของ Coinbase ระดับบัญชี ของเราก็เช่นกัน: ส่งไปที่ **URL callback** ที่ตั้งในแดชบอร์ดของคุณ (charge ที่สร้างด้วยข้อมูลรับรองทดสอบจะส่งไป URL callback ทดสอบ) เนื้อหาเป็นรูปแบบของ Coinbase `{id, scheduled_for, attempt_number, event: {id, type, api_version, created_at, data}}` โดย charge เต็มอยู่ใน `data` และ `X-CC-Webhook-Signature` = HMAC-SHA256(shared secret, เนื้อหาดิบ) ดังนั้น `Webhook.verifyEventBody` ของ SDK ใช้ได้ทันที เมื่อลองใหม่ `event.id` เท่าเดิมและ `attempt_number` เพิ่มขึ้น: กรองซ้ำด้วย `event.id`

```nodejs
import crypto from "node:crypto";

// Same as the SDK's Webhook.verifySigHeader: HMAC-SHA256(shared secret, raw body)
function verifyWebhook(rawBody, sig, sharedSecret) {
  const hmac = crypto.createHmac("sha256", sharedSecret).update(rawBody, "utf8").digest("hex");
  return crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(sig || ""));
}
// verifyWebhook(rawBody, req.headers["x-cc-webhook-signature"], process.env.COINBASE_WEBHOOK_SECRET)
// or with the official SDK:Webhook.verifyEventBody(rawBody, signature, sharedSecret)
```

| เหตุการณ์ | เมื่อ | รายการล่าสุดใน timeline |
| --- | --- | --- |
| `charge:confirmed` | ชำระแล้ว (ยืนยันบนเชนและตรวจไขว้แล้ว รวมจ่ายเกิน) | `COMPLETED` |
| `charge:failed` | หมดอายุโดยไม่มีการชำระ / คุณยกเลิก / หมดอายุแบบจ่ายขาด | `EXPIRED` / `CANCELED` / `UNRESOLVED` (context `UNDERPAID`) |

เมื่อค้นสถานะ คุณจะเห็น `NEW` (รอการชำระ) และ `PENDING` (พบการชำระบนเชน กำลังยืนยัน) ด้วย **ให้ดำเนินการเมื่อได้รับ `charge:confirmed`**: เราไม่ส่ง `charge:created`, `charge:pending`, `charge:delayed` หรือ `charge:resolved`

#### ข้อแตกต่างจาก Coinbase Commerce

- `pricing_type` ต้องเป็น `fixed_price` และ `local_price.currency` ต้องเป็น USD (USDC / USDT ที่ 1:1) `no_price` และเงินตราอื่นตอบ 400

- ที่อยู่ปรากฏเมื่อลูกค้าเลือกเหรียญและเครือข่ายที่หน้าชำระเงิน: `addresses` มีเฉพาะเครือข่ายนั้น `pricing` มีเฉพาะ `local` บวก `settlement` เมื่อเลือกแล้ว ไม่มี `exchange_rates`, `checkout` หรือฟิลด์แบรนด์

- `metadata` ถูกเก็บและคืนตามที่เป็น (สูงสุด 4 KB)

- การคืนเงินไม่ปรากฏใน timeline ให้ดูในแดชบอร์ด

### โหมดทดสอบ

charge และการชำระที่สร้างด้วยข้อมูลรับรองทดสอบรันบนเทสต์เน็ตของแต่ละเชน และ Webhook ของมันเซ็นด้วย IPN secret / shared secret ของชุดทดสอบ แยกจากใช้งานจริงโดยสิ้นเชิง: คีย์ทดสอบมองไม่เห็นการชำระจริง

ส่วนที่เหลือทั้งหมด (หน้าชำระเงิน การยืนยัน เครือข่ายและยอดขั้นต่ำ การคืนเงิน) ทำงานเหมือนใน[เอกสารหลัก](https://blockwallets.io/docs/cryptomus?lang=th)
