Ce que tu peux recevoir
KAS natif exige une source REST de transactions compatible et des preuves de chaîne acceptée. La progression du DAG n'est pas un paiement confirmé. Les tokens KRC-20 ne sont pas des actifs de factures.
Configure ta boutique
- Installe Wholly Crypto, crée un projet et une boutique, puis garde une sauvegarde privée du wallet.
- Vérifie les connexions compatibles avec le scanner et active la blockchain et les actifs dans Store → Payment methods.
- Règle les confirmations et l'expiration. Teste une petite facture et vérifie le règlement avant de livrer les commandes.
Où arrivent tes paiements
Les factures utilisent des adresses séparées. Garde backup complet, liste d'adresses et dérivation : un wallet importé peut ne pas tout retrouver immédiatement.
Guide de configuration du walletDéplace les fonds quand tu veux
Envois et sweeps regroupent les sorties disponibles. Beaucoup de petits reçus peuvent augmenter taille et frais. Vérifie l'aperçu et reste sur le même réseau.
Tutoriel de sweep automatiqueRésoudre un problème de paiement
Vérifie d'abord ce réseau
Un DAG score qui monte ne prouve pas le paiement. Vérifie les sorties acceptées à l'adresse. L'envoi nécessite les transactions parentes brutes et la fee mass chez le fournisseur.
Un paiement manque ou tarde
Vérifie réseau, adresse, actif et référence de la facture, puis le scanner et les confirmations. Ne demande pas un second paiement avant d'avoir vérifié le premier.
Guide de réceptionRestaure des wallets ou regroupe les fonds
Garde ton backup privé et les chemins de dérivation. Une autre app peut ne pas afficher toutes les adresses. L'envoi et la récupération dépendent du réseau et du format ; importer les mots ne les garantit pas.
Sauvegarde et restaurationFrais 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": "kaspa",
"asset_tickers": [
"KAS"
]
}
]
}'// 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": "kaspa",
"asset_tickers": [
"KAS"
]
}
]
}`;
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": "kaspa",
"asset_tickers": [
"KAS"
]
}
]
}
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": "kaspa",
"asset_tickers": [
"KAS"
]
}
]
}""".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))