API ที่เข้ากันได้กับ Coinbase Commerce
endpoint ของ charge เฮดเดอร์ X-CC-Api-Key อ็อบเจกต์ charge และ webhook ที่เซ็นด้วย X-CC-Webhook-Signature เป็นไปตามเอกสารของ Coinbase Commerce SDK ทางการจึงใช้ได้หลังเปลี่ยนเพียงบรรทัดเดียว Coinbase Commerce หยุดให้บริการร้านค้านอกสหรัฐอเมริกาและสิงคโปร์ตั้งแต่ 2026-03-31 ย้ายมาจากที่อื่น? ดูภาพรวมการย้าย
ภายในเป็นใบแจ้งหนี้ blockwallets ปกติ: ที่อยู่รับเงินเป็นของคุณ หน้าชำระเงินคือหน้าชำระเงินที่เราโฮสต์ และการชำระจะนับก็ต่อเมื่อยืนยันบนเชนแล้วและตรวจไขว้กับโหนดที่สอง ต่อไปนี้: สามขั้นตอน จากนั้นสิ่งที่แต่ละ API รองรับและต่างจากต้นฉบับอย่างไร พารามิเตอร์ที่เราไม่ได้ทำจะตอบข้อผิดพลาด ไม่ถูกเมินไปเงียบ ๆ
สามขั้นตอน
- สมัครบัญชีร้านค้า (ขอใช้งานที่หน้าแรก) และเพิ่มโดเมนของคุณที่ “โดเมนเว็บไซต์” ใน “นักพัฒนา › การเชื่อมต่อและคีย์” ของแดชบอร์ด 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: เปลี่ยนบรรทัดเดียว (ระวัง / ท้ายสุด):
// 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 -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
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 ของชุดทดสอบ แยกจากใช้งานจริงโดยสิ้นเชิง: คีย์ทดสอบมองไม่เห็นการชำระจริง
ส่วนที่เหลือทั้งหมด (หน้าชำระเงิน การยืนยัน เครือข่ายและยอดขั้นต่ำ การคืนเงิน) ทำงานเหมือนในเอกสารหลัก