NOWPayments-kompatible API

In ChatGPT öffnenIn Claude öffnen

Pfade, der Header x-api-key, Request- und Response-Felder, Status und die IPN-Signatur x-nowpayments-sig folgen der Dokumentation von NOWPayments, sodass vorhandener Code meist nur eine neue Base-URL, einen neuen API key und ein neues IPN secret braucht. Sie kommen von woanders? Siehe die Migrationsübersicht.

Darunter liegt eine ganz normale blockwallets-Rechnung: Die Empfangsadressen gehören Ihnen, die Zahlungsseite ist unser gehosteter Checkout, und eine Zahlung zählt erst, wenn sie on-chain bestätigt und gegen einen zweiten Node geprüft wurde. Unten: drei Schritte, dann was jede API unterstützt und wie sie sich vom Original unterscheidet – Parameter, die wir nicht umsetzen, liefern einen Fehler, statt stillschweigend ignoriert zu werden.

Drei Schritte

  1. Besorgen Sie sich ein Händlerkonto (auf der Startseite beantragen) und tragen Sie im Dashboard unter „Entwickler › Integration & Keys“ bei „Website-Domains“ Ihre Domains ein. Callback-URLs (ipn_callback_url) und Weiterleitungs-URLs (success_url / cancel_url / redirect_url) müssen auf diesen Domains oder der Domain Ihrer Callback-URL liegen – ein geleakter Schlüssel kann Webhooks so nicht woandershin lenken.
  2. Erzeugen Sie kompatible Zugangsdaten im Händler-Dashboard unter „Entwickler › Integration & Keys“, je einen Satz für Live und für Test: NOWPayments erhält einen API key + IPN secret, Coinbase Commerce einen API key + Webhook shared secret. Sie werden nur einmal angezeigt; wir speichern nur Hashes / Chiffretext.
  3. Richten Sie Ihren Code auf die untenstehende Base-URL und nutzen Sie die neuen Schlüssel. Testen Sie zuerst mit den Test-Zugangsdaten auf Testnets und wechseln Sie dann auf Live.
VorherNachherAuth-HeaderWebhook-Signatur
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();

Unterstützte Endpoints

EndpointHinweise
GET /status{"message":"OK"}, kein Schlüssel nötig
GET /currencies · /merchant/coins · /full-currenciesCoins, die Sie derzeit annehmen können (Kürzel unten); fixed_rate wird ignoriert
GET /min-amount · GET /estimateMindestbeträge und Schätzungen; nur Preise in USD (USDT / USDC zählen 1:1)
POST /paymentZahlung erstellen; liefert pay_address / pay_amount sofort (White Label)
POST /invoiceRechnung erstellen; invoice_url ist unser gehosteter Checkout, in dem der Kunde Coin und Netzwerk wählt
POST /invoice-paymentCoin für eine Rechnung wählen, liefert die Zahlung
GET /payment/:idZahlungsstatus
GET /payment/Liste: limit (1–500) / page / orderBy / dateFrom / dateTo / invoiceId; sortBy nur created_at
POST /authDie Liste braucht nur x-api-key, kein JWT; dieser Endpoint liefert ein ungeprüftes Platzhalter-Token, damit Code nach dem Muster „anmelden, dann auflisten“ weiterläuft (E-Mail / Passwort werden nicht geprüft)

Nicht verfügbar: Payouts, Conversions, Custody-Sub-Partner, Abonnements, update-merchant-estimate, Fiat-Zahlungen. Diese Pfade liefern 404.

IPN-Callbacks

Erreicht eine Zahlung einen Endstatus, senden wir ein POST an die beim Erstellen angegebene ipn_callback_url, mit x-nowpayments-sig = HMAC-SHA512(IPN secret, das rekursiv nach Schlüsseln sortierte JSON) – exakt der Prüfcode von NOWPayments. Der gesendete Body ist bereits sortiertes, kompaktes JSON, ein HMAC über den Rohtext funktioniert also ebenfalls (und ist in PHP / Python die sicherste Wahl, da deren erneutes Kodieren sehr kleiner Dezimalzahlen von JS abweichen kann). Fehlgeschlagene Callbacks werden nach 1 Min., 5 Min., 30 Min., … wiederholt – insgesamt 8 Versuche.

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_statusWannGesendete IPN
waitingWartet auf Zahlung (auch eine Rechnung, bei der noch kein Coin gewählt wurde)—
confirmingZahlung on-chain gesehen, wartet auf Bestätigungen— (bei Abfrage sichtbar)
finishedBezahlt (auch überzahlt; actually_paid ist das tatsächlich Eingegangene)✓
partially_paidZu wenig: Der Kunde kann vor Ablauf an dieselbe Adresse nachzahlen (einmal bei der ersten Unterzahlung gesendet) und nochmals, wenn es bei Ablauf noch fehlt✓
expiredUnbezahlt abgelaufen✓
refundedSie haben die gesamte Zahlung im Dashboard erstattet und sie wurde gesendet— (bei Abfrage sichtbar)

confirmed, sending und failed erscheinen nie: Nach der Bestätigung ist es finished und wird Ihrem Guthaben gutgeschrieben; nichts wird weitergeleitet.

Währungskürzel

CoinNetzwerkpay_currencynetworkMinimum
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

Unterschiede zu NOWPayments

Testmodus

Mit Test-Zugangsdaten erstellte Charges und Zahlungen laufen im Testnet der jeweiligen Chain, und ihre Webhooks werden mit dem Test-IPN-secret / shared secret signiert – völlig getrennt von Live: Ein Test-Schlüssel sieht keine Live-Zahlungen.

Alles Übrige (Checkout, Bestätigungen, Netzwerke und Mindestbeträge, Erstattungen) funktioniert wie in der Hauptdokumentation.