Ce que tu peux recevoir
Lightning reçoit BTC, pas de stablecoins ni de transferts on-chain. Chaque demande a son montant, hash et expiration. Le client paie la facture Lightning entière.
Paiements Bitcoin on-chainConfigure ta boutique
Dans Paramètres → Connexions de réseaux, ajoute LND via HTTPS ou NWC via WSS, puis active-le dans la boutique. Il faut un endpoint public ; une adresse seulement LAN ou Tor ne fonctionne pas directement.
Identifiants et garde des fonds
Utilise des droits de réception limités, jamais un macaroon LND admin ou de dépense. NWC décrit la connexion, pas la garde : vérifie qui détient les clés.
Où arrivent tes paiements
Le QR contient une facture BOLT11, pas une adresse Bitcoin. Ne la paie jamais on-chain. Après expiration, crée une nouvelle facture ; prolonger le délai ne suffit pas.
Quand le paiement est-il terminé ?
Wholly Crypto vérifie le règlement signalé par le wallet. Facture ouverte ou HTLC retenu ne signifie pas paiement. Pas de confirmations de blocs ni de lien public de transaction pour Lightning.
Déplace les fonds quand tu veux
Utilise le wallet ou nœud externe pour envois, liquidité et backups. Le sweep on-chain ne déplace pas Lightning. L'export du wallet du projet ne sauvegarde pas le wallet externe.
Guide du wallet LightningRésoudre un problème de paiement
Sans route, vérifie liquidité entrante, disponibilité du wallet et expiration. Une API saine ne garantit pas la route. En cas d'incertitude, vérifie le règlement avant de demander de réessayer.
Frais et vérification
Les frais par défaut sont de 1 % du montant fiat de la facture, payés avec des crédits séparés. Ton tarif attribué s'applique. Réseau et serveur sont facturés à part.
Les fournisseurs publics peuvent tomber en panne ou limiter les requêtes. Une transaction envoyée ou une redirection ne prouvent pas le paiement. Utilise le statut vérifié et les notifications signées.
Crédits de traitement API, IPN et webhooksConvertisseur de devises
Convertir un montant
Une estimation, pas un devis de paiement. Les frais réseau, les frais de plateforme et les spreads du commerçant ne sont pas inclus.
D'où viennent les taux ?
Les estimations crypto utilisent les prix publics Kraken en cache, avec Binance lorsque disponible. Certains prix Binance utilisent l'USDT comme référence USD. Les taux fiat viennent de Frankfurter : ce sont des taux de référence quotidiens, pas des cours de marché en direct.
L'instantané s'actualise automatiquement. Vérifie les dates des sources sous ton résultat. Le montant saisi reste dans ton navigateur. La présence d'un actif ne garantit pas sa prise en charge pour les paiements.
Kraken · Binance · Frankfurter · Noms et icônes des actifs : CoinGecko
Crée une facture avec l'API
Exécute les exemples sur ton serveur. Remplace l'hôte API et les ID de projet et boutique. Garde la clé privée. Les montants sont des chaînes décimales.
Active d'abord la méthode dans la boutique. La sélection filtre les méthodes actives sans ajouter d'actifs. Sans correspondance, les choix par défaut s'appliquent. Vérifie les méthodes renvoyées avant le checkout.
: "${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))