API ที่เข้ากันได้กับ NOWPayments

เปิดใน ChatGPTเปิดใน Claude

พาธ เฮดเดอร์ x-api-key ฟิลด์คำขอและการตอบกลับ สถานะ และลายเซ็น IPN x-nowpayments-sig เป็นไปตามเอกสารของ NOWPayments โค้ดเดิมจึงมักต้องการเพียง base URL, API key และ IPN secret ใหม่ ย้ายมาจากที่อื่น? ดูภาพรวมการย้าย

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

สามขั้นตอน

  1. สมัครบัญชีร้านค้า (ขอใช้งานที่หน้าแรก) และเพิ่มโดเมนของคุณที่ “โดเมนเว็บไซต์” ใน “นักพัฒนา › การเชื่อมต่อและคีย์” ของแดชบอร์ด URL callback (ipn_callback_url) และ URL เปลี่ยนเส้นทาง (success_url / cancel_url / redirect_url) ต้องอยู่ในโดเมนเหล่านั้นหรือโดเมนของ URL callback ของคุณ คีย์ที่รั่วไหลจึงชี้ Webhook ไปที่อื่นไม่ได้
  2. สร้างข้อมูลรับรองที่เข้ากันได้ในแดชบอร์ดร้านค้าที่ “นักพัฒนา › การเชื่อมต่อและคีย์” ชุดใช้งานจริงและชุดทดสอบอย่างละชุด: NOWPayments ได้ API key + IPN secret ส่ง Coinbase Commerce ได้ API key + webhook shared secret แสดงเพียงครั้งเดียว เราเก็บเฉพาะค่าแฮช / ข้อความเข้ารหัส
  3. ชี้โค้ดของคุณไปที่ base URL ด้านล่างและใช้คีย์ใหม่ รันบนเทสต์เน็ตด้วยข้อมูลรับรองทดสอบก่อน แล้วค่อยสลับเป็นใช้งานจริง
ก่อนหลังเฮดเดอร์การยืนยันตัวตนลายเซ็น Webhook
https://api.nowpayments.io/v1https://blockwallets.io/nowpayments/v1x-api-keyx-nowpayments-sig (HMAC-SHA512)

NOWPayments

JavaScript
- const NP = "https://api.nowpayments.io/v1";
+ const NP = "https://blockwallets.io/nowpayments/v1";

const res = await fetch(`${NP}/payment`, {
  method: "POST",
  headers: { "x-api-key": process.env.NOWPAYMENTS_API_KEY, "content-type": "application/json" },
  body: JSON.stringify({
    price_amount: 49.9, price_currency: "usd", pay_currency: "usdttrc20",
    order_id: "A-1001", order_description: "Pro plan",
    ipn_callback_url: "https://shop.example/ipn/nowpayments",
  }),
});
const { payment_id, pay_address, pay_amount } = await res.json();

Endpoint ที่รองรับ

Endpointหมายเหตุ
GET /status{"message":"OK"} ไม่ต้องใช้คีย์
GET /currencies · /merchant/coins · /full-currenciesเหรียญที่รับได้ตอนนี้ (สัญลักษณ์ด้านล่าง) fixed_rate ถูกเมิน
GET /min-amount · GET /estimateยอดขั้นต่ำและการประเมิน กำหนดราคาเป็น USD เท่านั้น (USDT / USDC คิด 1:1)
POST /paymentสร้างการชำระ คืน pay_address / pay_amount ทันที (white-label)
POST /invoiceสร้างใบแจ้งหนี้ invoice_url คือหน้าชำระเงินที่เราโฮสต์ ลูกค้าเลือกเหรียญและเครือข่ายเอง
POST /invoice-paymentเลือกเหรียญสำหรับใบแจ้งหนี้ คืนการชำระ
GET /payment/:idสถานะการชำระ
GET /payment/รายการ: limit (1–500) / page / orderBy / dateFrom / dateTo / invoiceId ส่วน sortBy ใช้ได้เฉพาะ created_at
POST /authรายการต้องใช้เพียง x-api-key ไม่ต้องใช้ JWT endpoint นี้คืนโทเค็นตัวแทนที่ไม่ได้ตรวจสอบ เพื่อให้โค้ดแบบ “เข้าสู่ระบบก่อนแล้วค่อยดูรายการ” ยังทำงานได้ (ไม่ตรวจอีเมล / รหัสผ่าน)

ไม่มี: การจ่ายออก การแปลงสกุล sub-partner แบบฝากเก็บ การสมัครสมาชิกแบบรายคาบ update-merchant-estimate การชำระด้วยเงินตรา เส้นทางเหล่านี้ตอบ 404

IPN callback

เมื่อการชำระถึงสถานะสุดท้าย เราส่ง POST ไปที่ ipn_callback_url ที่ระบุตอนสร้าง โดย x-nowpayments-sig = HMAC-SHA512(IPN secret, JSON ที่เรียงตามคีย์แบบเรียกซ้ำ) ซึ่งตรงกับโค้ดตรวจสอบของ NOWPayments ทุกประการ เนื้อหาที่เราส่งเรียงลำดับและกะทัดรัดอยู่แล้ว จึงใช้ HMAC บนเนื้อหาดิบก็ได้เช่นกัน (และปลอดภัยที่สุดใน PHP / Python ที่การเข้ารหัสใหม่ของทศนิยมที่เล็กมากอาจต่างจาก JS) callback ที่ล้มเหลวจะลองใหม่หลัง 1 นาที, 5 นาที, 30 นาที, … รวม 8 ครั้ง

Node.js
import crypto from "node:crypto";

// Same as the NOWPayments docs (our body is already sorted, so hashing the raw body works too)
function sortObject(obj) {
  return Object.keys(obj).sort().reduce((r, k) => {
    r[k] = obj[k] && typeof obj[k] === "object" ? sortObject(obj[k]) : obj[k];
    return r;
  }, {});
}
function verifyIpn(params, sig, ipnSecret) {
  const hmac = crypto.createHmac("sha512", ipnSecret).update(JSON.stringify(sortObject(params))).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(sig || ""));
}
// verifyIpn(req.body, req.headers["x-nowpayments-sig"], process.env.NOWPAYMENTS_IPN_SECRET)
PHP
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
tksort($data);  // the recursive ksort from the NOWPayments docs
$hmac = hash_hmac('sha512', json_encode($data, JSON_UNESCAPED_SLASHES), trim($ipnSecret));
$ok = hash_equals($hmac, $_SERVER['HTTP_X_NOWPAYMENTS_SIG'] ?? '');
payment_statusเมื่อIPN ที่ส่ง
waitingรอการชำระ (รวมใบแจ้งหนี้ที่ยังไม่ได้เลือกเหรียญ)—
confirmingพบการชำระบนเชน รอการยืนยัน— (เห็นได้เมื่อค้นสถานะ)
finishedชำระแล้ว (รวมจ่ายเกิน actually_paid คือยอดที่เข้ามาจริง)✓
partially_paidจ่ายขาด: ลูกค้ายังเติมเข้าที่อยู่เดิมได้ก่อนหมดอายุ (ส่งครั้งเดียวเมื่อพบการจ่ายขาดครั้งแรก) และส่งอีกครั้งหากหมดอายุแล้วยังขาด✓
expiredหมดอายุโดยไม่มีการชำระ✓
refundedคุณคืนเงินการชำระทั้งหมดจากแดชบอร์ดและส่งออกแล้ว— (เห็นได้เมื่อค้นสถานะ)

confirmed, sending และ failed ไม่เคยปรากฏ: เมื่อยืนยันแล้วเป็น finished และบันทึกเข้ายอดคงเหลือของคุณ ไม่มีการโอนต่อ

สัญลักษณ์เหรียญ

เหรียญเครือข่ายpay_currencynetworkขั้นต่ำ
USDTTRONusdttrc20trx$1
USDTBNB Chainusdtbsc usdtbep20bsc$1
USDCBNB Chainusdcbsc usdcbep20bsc$1
USDTEthereumusdterc20eth$5
USDCEthereumusdc usdcerc20eth$5
USDCBaseusdcbasebase$1
USDTPolygonusdtmatic usdtpolygonmatic$1
USDCPolygonusdcmatic usdcpolygonmatic$1
USDTArbitrumusdtarbarbitrum$1
USDCArbitrumusdcarbarbitrum$1
USDTOptimismusdtopop$1
USDCOptimismusdcopop$1
USDTAvalancheusdtarc20 usdtavax / usdtavaxcavaxc$1
USDCAvalancheusdcarc20 usdcavax / usdcavaxcavaxc$1
USDTX Layerusdtxlayerxlayer$1
USDCX Layerusdcxlayerxlayer$1
USD1BNB Chainusd1bscbsc$1
FDUSDBNB Chainfdusdbscbsc$1
DAIEthereumdai daierc20eth$5
DAIArbitrumdaiarbarbitrum$1
DAIBasedaibasebase$1
BTCBitcoinbtcbtc$5
LTCLitecoinltcltc$1
DOGEDogecoindogedoge$1
BCHBitcoin Cashbchbch$1
TRXTRONtrxtrx$1
BNBBNB Chainbnbbsc bnbbsc$1
ETHEthereumetheth$5
ETHBaseethbasebase$1
ETHArbitrumetharbarbitrum$1
ETHOptimismethopop$1
POLPolygonmaticmainnet pol / polmainnet / maticmatic$1
AVAXAvalancheavaxc avaxavaxc$1
OKBX Layerokbxlayerxlayer$1
USDTSolanausdtsolsol$1
USDCSolanausdcsolsol$1
SOLSolanasolsol$1
USDTTONusdttonton$1
TONTONtonton$1

ข้อแตกต่างจาก NOWPayments

โหมดทดสอบ

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

ส่วนที่เหลือทั้งหมด (หน้าชำระเงิน การยืนยัน เครือข่ายและยอดขั้นต่ำ การคืนเงิน) ทำงานเหมือนในเอกสารหลัก