Wat je kunt ontvangen
Lightning ontvangt BTC, geen stablecoins of overdrachten naar on-chainadressen. Elk afrekenverzoek heeft een eigen bedrag, betalingshash en verloop. De klant betaalt de volledige Lightning-factuur.
On-chain Bitcoin-betalingenStel je winkel in
Voeg in Instellingen → Blockchainverbindingen LND via HTTPS of Nostr Wallet Connect via WSS toe en schakel die verbinding daarna in de winkel in. Het huidige verbindingsbeleid vereist openbaar bereikbare endpoints; een adres dat alleen via LAN of Tor bereikbaar is, werkt niet rechtstreeks.
Inloggegevens en bewaring
Gebruik beperkte ontvangstreferenties, nooit een LND-admin- of uitgavenmacaroon. NWC beschrijft de verbinding, niet de bewaring: controleer of de gekozen wallet de sleutels voor je bewaart.
Waar je betalingen aankomen
De QR bevat een BOLT11-Lightning-factuur, geen Bitcoin-adres. Verzend nooit een on-chaintransactie om die te betalen. Maak een nieuwe factuur aan als het verzoek is verlopen; de deadline kan niet zomaar worden verlengd.
Wanneer is de betaling voltooid?
Wholly Crypto verifieert de voldoening die de verbonden wallet meldt. Een open factuur of vastgehouden HTLC is geen betaling. Voor een Lightning-ontvangst gelden geen blokbevestigingen of openbare transactielink naar een explorer.
Verplaats middelen wanneer je er klaar voor bent
Gebruik de externe wallet of node voor uitgaande betalingen, kanaalliquiditeit en back-ups. De on-chain Sweep van Wholly Crypto verplaatst geen Lightning-saldi. Een projectwalletexport maakt geen back-up van die externe wallet.
Lightning-wallethandleidingBetalingsproblemen oplossen
Als een betaling geen route vindt, controleer inkomende liquiditeit, walletbeschikbaarheid en verzoekverloop. Een gezonde API is geen routegarantie. Verifieer na een onzekere betaling de voldoening voordat je de klant vraagt opnieuw te proberen.
Kosten en verificatie
De standaardverwerkingskosten zijn 1% van de fiatwaarde van de factuur, betaald uit afzonderlijk tegoed. Je toegewezen tarief is van toepassing. Netwerkkosten en serverkosten staan hier los van.
Openbare providers kunnen storingen of snelheidslimieten hebben. Een ingediende transactie of terugkeerdoorverwijzing is geen betalingsbewijs. Gebruik de geverifieerde factuurstatus en ondertekende meldingen.
Verwerkingstegoed API, IPN & webhooksKoerscalculator
Een bedrag omrekenen
Een schatting, geen prijsopgave voor een betaling. Netwerkkosten, beurskosten en handelaarsopslagen zijn niet inbegrepen.
Waar komen de koersen vandaan?
Cryptoschattingen gebruiken gecachte publieke Kraken-prijzen, aangevuld met Binance waar beschikbaar. Sommige Binance-prijzen gebruiken USDT als USD-referentie. Fiatkoersen komen van Frankfurter en zijn dagelijkse referentiekoersen, geen live handelskoersen.
De momentopname wordt automatisch vernieuwd. Controleer de brondatums onder je resultaat. Het ingevoerde bedrag blijft in je browser. Een vermelding van een actief garandeert geen betaalondersteuning.
Kraken · Binance · Frankfurter · Namen & pictogrammen van activa: CoinGecko
Maak een factuur aan met de API
Voer deze voorbeelden op je server uit. Vervang de API-host, het project-ID en winkel-ID en houd de referentie geheim. Bedragen zijn decimale tekenreeksen.
Schakel de methode eerst in de winkel in. Selectie beperkt ingeschakelde methoden; ze voegt geen activa toe. Als niets overeenkomt, gelden de winkelstandaarden. Controleer de geretourneerde methoden voordat je de afrekenpagina toont.
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "bitcoin",
"payment_rail": "lightning"
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "bitcoin",
"payment_rail": "lightning"
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "bitcoin",
"payment_rail": "lightning"
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "bitcoin",
"payment_rail": "lightning"
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))