Documentation API CryptoGate
CryptoGate te permet d'accepter des paiements en cryptomonnaie et par carte bancaire sur ton site ou ton application. Tu peux utiliser notre checkout hébergé (le plus simple) ou construire ta propre interface en interrogeant l'API des moyens disponibles pour ta clé, puis en créant un paiement et en redirigeant vers les URLs documentées.
Authentification
Toutes les requêtes API nécessitent un token Bearer. Tu peux créer tes clés API depuis le dashboard.
Authorization: Bearer cgk_your_api_key_here
URL de base
https://crypto-gate.cc
Toutes les routes documentées ici sont relatives à cette URL.
Créer un paiement
/api/payment-links
Body (JSON)
| Champ | Type | Requis | Description |
|---|---|---|---|
amount | number | oui | Montant du paiement (ex: 49.99) |
currency | string | oui | Devise ISO (EUR, USD) |
email | string | oui | Email du client |
orderId | string | oui | Identifiant unique de ta commande |
label | string | non | Titre affiché sur le checkout |
description | string | non | Description affichée sur le checkout |
Réponse (201 Created)
{
"paymentId": "a1b2c3d4-5678-...",
"checkoutUrl": "https://crypto-gate.cc/checkout/a1b2c3d4-5678-..."
}
Flux d'intégration recommandé
orderId unique que tu nous transmets.
Quand le paiement aboutit, on te renvoie ce même orderId dans le webhook — tu n'as plus qu'à retrouver ta commande et la valider.
- Crée ta commande dans ta base de données (produit, montant, statut "en attente", etc.) et génère un
orderIdunique - Appelle notre API avec cet
orderId+ le montant et l'email du client - Redirige ton client (HTTP 302 ou JavaScript) vers le
checkoutUrlretourné - Le client paye sur notre page hébergée (carte ou crypto)
- Tu reçois un webhook POST sur ta
callbackUrlcontenant leorderIdet le nouveau statut - Retrouve ta commande par
orderIddans ta DB et mets-la à jour (activée, livrée, etc.)
// 1. Créer la commande dans ta DB
app.post('/buy', async (req, res) => {
const order = await db.orders.create({
product: req.body.product,
amount: 49.99,
currency: 'EUR',
email: req.body.email,
status: 'pending', // En attente de paiement
});
// 2. Créer le paiement chez CryptoGate
const response = await fetch('https://crypto-gate.cc/api/payment-links', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.CRYPTOGATE_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: order.amount,
currency: order.currency,
email: order.email,
orderId: order.id, // ← Ton identifiant unique
label: 'Commande #' + order.id,
}),
});
const { checkoutUrl } = await response.json();
// 3. Rediriger le client vers le checkout
res.redirect(checkoutUrl);
});
// 5. Recevoir le webhook quand le paiement est confirmé
app.post('/webhook/cryptogate', express.raw({ type: 'application/json' }), (req, res) => {
const event = JSON.parse(req.body);
if (event.event === 'payment.paid') {
// 6. Retrouver la commande par orderId et la valider
await db.orders.update(
{ id: event.payment.orderId },
{ status: 'paid' }
);
// → Activer l'abonnement, envoyer le produit, etc.
}
res.sendStatus(200);
});
Statuts de paiement
| Statut | Description | Final ? |
|---|---|---|
pending | Paiement créé, en attente du client | Non |
confirming | Transaction crypto détectée, en attente de confirmations blockchain | Non |
paid | Paiement confirmé et reçu | Oui ✓ |
failed | Paiement échoué ou expiré | Oui ✗ |
Flux checkout
La page checkout hébergée gère tout le processus de paiement :
- Sélection — le client choisit entre carte bancaire et cryptomonnaie
- Carte bancaire — redirection vers le prestataire (RampNetwork) qui convertit le fiat en crypto
- Crypto directe — affichage d'un QR code + adresse wallet + montant exact en crypto
- Confirmation — page de succès ou d'erreur, puis callback vers ton serveur
Les cryptomonnaies disponibles et le branding sont configurés dans ton dashboard pour chaque clé API.
Moyens de paiement disponibles (checkout personnalisé)
Pour afficher les mêmes options que notre page checkout, sans deviner la configuration de ta clé,
appelle cette route avec le même Authorization: Bearer que pour créer un paiement.
/api/payment-methods
Query (optionnelle)
| Paramètre | Description |
|---|---|
amount | Montant du panier (nombre positif, max 2 décimales) |
currency | Devise ISO : EUR, USD, GBP, CHF, CAD |
Si tu omets les deux, la réponse liste les moyens configurés pour ta clé sans appliquer les minimums (utile pour une page « nous acceptons… »).
Si tu passes l’un sans l’autre, tu reçois une erreur 400.
Avec amount et currency, les champs methodsUnavailable et crypto.coinsBelowMinimum reflètent le même comportement que le checkout hébergé.
Réponse (200)
La réponse inclut notamment :
methods— moyens sélectionnables (fiat ou agrégat crypto), avecpaygateProviderpour le fiat direct vers PayGatemethodsUnavailable— moyens sous le minimum configurécrypto.coins/crypto.coinsBelowMinimum— détail par actif (providerForApiau formatcrypto:coinId, aligné sur les webhooks)
L’ordre des entrées dans methods suit celui défini pour ta clé dans le dashboard
(Clé API → Moyens de paiement), puis la liste globale de la plateforme si tu n’as rien personnalisé.
Après POST /api/payment-links, les chemins hébergés sont du type
/checkout/{paymentId}/pay/{methodId},
/checkout/{paymentId}/crypto et
/checkout/{paymentId}/crypto/{coinId} (préfixe = URL de base du service).
const r = await fetch('https://crypto-gate.cc/api/payment-methods?amount=49.99¤cy=EUR', {
headers: { 'Authorization': 'Bearer ' + process.env.CRYPTOGATE_KEY },
});
const data = await r.json();
// data.methods → boutons fiat / crypto
// data.crypto.coins → liste des actifs pour liens /checkout/{paymentId}/crypto/{coinId}
GET /api/payment-methods (côté serveur ou après chargement) →
POST /api/payment-links quand le client valide le panier → redirection vers
checkoutUrl ou, pour le fiat seul, nouvelle création avec provider pour obtenir paymentLink (URL PayGate).
Les paiements crypto détaillés utilisent les pages hébergées (QR / adresse), pas l’URL process-payment.
Webhooks — Vue d'ensemble
Les webhooks te permettent de recevoir automatiquement une notification quand un paiement change de statut.
CryptoGate envoie un POST JSON vers la callbackUrl configurée sur ta clé API.
Comment ça marche
- Un paiement change de statut (pending → confirming → paid)
- CryptoGate envoie un POST à ta
callbackUrlavec le payload JSON - Ton serveur vérifie la signature (optionnel mais recommandé) et traite l'événement
- Ton serveur répond
200 OK
Le status checker vérifie aussi les paiements pending toutes les 5 minutes pendant 1 heure après leur création, pour détecter les changements même si le callback initial n'arrive pas.
Extension WooCommerce
L’extension WooCommerce te permet d’intégrer CryptoGate sans développer : au clic “Commander”, WooCommerce crée un paiement via l’API puis redirige le client vers le checkout hébergé. La commande est validée automatiquement via webhook (recommandé).
1) Télécharger et installer
- Depuis le dashboard CryptoGate : Extensions → WooCommerce → Télécharger le plugin
- Sur WordPress : Extensions → Ajouter → Téléverser → active le plugin
2) Configurer WooCommerce
WooCommerce → Réglages → Paiements → CryptoGate :
| Champ | Description |
|---|---|
CryptoGate Base URL | URL de ton instance CryptoGate (ex: https://crypto-gate.cc) |
API Key | Clé cgk_… (header Authorization: Bearer) |
Webhook secret (optionnel) | Si tu actives la signature côté CryptoGate, mets le même secret dans Woo |
3) Webhook (recommandé)
CryptoGate envoie les webhooks vers la callbackUrl configurée sur ta clé API.
Pour WooCommerce, la callback URL est :
https://ton-site.com/wp-json/cryptogate/v1/webhook
orderId correspond à l’ID de commande Woo.
Les webhooks payment.paid / payment.confirming / payment.failed
mettront à jour automatiquement la commande.
Flux technique
- WooCommerce appelle
POST /api/payment-linksavecorderId,amount,currency,email - CryptoGate renvoie
checkoutUrl - Le client est redirigé vers
checkoutUrl - À la confirmation du paiement, CryptoGate envoie un webhook vers WordPress
Format du payload
{
"event": "payment.paid",
"timestamp": "2026-02-07T10:30:00.000Z",
"payment": {
"id": "a1b2c3d4-5678-...",
"orderId": "order-123",
"amount": 49.99,
"currency": "EUR",
"status": "paid",
"provider": "crypto:polygon-usdt",
"createdAt": "2026-02-07T10:00:00.000Z"
}
}
orderId est ton identifiant de commande — c'est exactement celui que tu as envoyé lors de la création du paiement.
Utilise-le pour retrouver la commande correspondante dans ta base de données et mettre à jour son statut.
Champs du payload
| Champ | Description |
|---|---|
event | Type d'événement (payment.paid, payment.failed, etc.) |
timestamp | Date ISO de l'envoi du webhook |
payment.id | UUID du paiement CryptoGate |
payment.orderId | Ton identifiant de commande — celui que tu as transmis à la création |
payment.amount | Montant du paiement |
payment.currency | Devise (EUR, USD…) |
payment.status | Nouveau statut du paiement |
payment.provider | Méthode utilisée (card, crypto:btc, etc.) |
payment.createdAt | Date de création du paiement |
Headers envoyés
| Header | Description |
|---|---|
Content-Type | application/json |
X-Webhook-Event | Type d'événement (payment.paid, etc.) |
X-Webhook-Id | UUID unique de cette livraison |
X-Webhook-Signature | sha256=... (si secret configuré) |
Champ provider
| Valeur | Signification |
|---|---|
card | Paiement par carte (via RampNetwork) |
crypto:btc | Bitcoin direct |
crypto:polygon-usdt | USDT sur Polygon |
crypto:polygon-usdc | USDC sur Polygon |
crypto:sol | Solana (SOL) |
| … etc. | Tout coin activé dans ta config |
Vérification de signature HMAC
Pour garantir que le webhook provient bien de CryptoGate, tu peux activer la signature HMAC-SHA256
dans le dashboard. Chaque requête contiendra un header X-Webhook-Signature.
Algorithme
- Lis le body brut de la requête (string JSON, avant le parsing)
- Calcule
HMAC-SHA256(body, ton_secret) - Compare avec la valeur après
sha256=dans le header
import crypto from 'crypto';
function verifySignature(rawBody, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Dans ton handler Express :
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-webhook-signature'];
if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
// Traiter l'événement…
res.sendStatus(200);
});
import hmac, hashlib
def verify_signature(raw_body: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(), raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, $webhookSecret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('Invalid signature');
}
Événements webhook
| Événement | Quand | Action recommandée |
|---|---|---|
payment.confirming |
Transaction crypto détectée sur la blockchain | Afficher "paiement en cours de confirmation" au client |
payment.paid |
Paiement confirmé et crédité | ✅ Activer l'abonnement / livrer la commande |
payment.failed |
Paiement échoué ou expiré | Notifier le client de l'échec |
payment.id + event pour dédupliquer.
Retry & bonnes pratiques
- Timeout : 10 secondes max pour répondre
- Code attendu :
2xxpour confirmer la réception - Retry manuel : les webhooks échoués peuvent être renvoyés depuis le dashboard (onglet Webhooks de ta clé)
- Status checker : en plus des webhooks, CryptoGate vérifie les paiements toutes les 5 minutes pendant 1h — si un changement est détecté, un nouveau webhook est envoyé
- HTTPS : utilise toujours une URL HTTPS pour ta callback
Exemple — Node.js
const response = await fetch('https://crypto-gate.cc/api/payment-links', {
method: 'POST',
headers: {
'Authorization': 'Bearer cgk_your_api_key',
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 49.99,
currency: 'EUR',
email: 'client@example.com',
orderId: 'order-12345',
label: 'Abonnement Premium',
}),
});
const data = await response.json();
console.log(data.checkoutUrl);
// → Redirige le client vers data.checkoutUrl
Exemple — Python
import requests
resp = requests.post(
'https://crypto-gate.cc/api/payment-links',
headers={'Authorization': 'Bearer cgk_your_api_key'},
json={
'amount': 49.99,
'currency': 'EUR',
'email': 'client@example.com',
'orderId': 'order-12345',
'label': 'Abonnement Premium',
}
)
data = resp.json()
print(data['checkoutUrl'])
# → Redirige le client vers data['checkoutUrl']
Exemple — PHP
$ch = curl_init('https://crypto-gate.cc/api/payment-links');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer cgk_your_api_key',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => 49.99,
'currency' => 'EUR',
'email' => 'client@example.com',
'orderId' => 'order-12345',
'label' => 'Abonnement Premium',
]),
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
// Rediriger : header('Location: ' . $data['checkoutUrl']);
Exemple — cURL
curl -X POST https://crypto-gate.cc/api/payment-links \
-H "Authorization: Bearer cgk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"amount": 49.99,
"currency": "EUR",
"email": "client@example.com",
"orderId": "order-12345"
}'
Codes d'erreur
| Code HTTP | Signification | Cause courante |
|---|---|---|
400 | Bad Request | Champ requis manquant ou invalide |
401 | Unauthorized | Clé API manquante ou invalide |
403 | Forbidden | Token CSRF invalide ou manquant |
404 | Not Found | Paiement ou ressource introuvable |
429 | Too Many Requests | Rate limit dépassé (voir section Limites) |
500 | Internal Server Error | Erreur interne du serveur |
502 | Bad Gateway | Erreur de communication avec le processeur de paiement |
503 | Service Unavailable | Mode maintenance activé |
Toutes les erreurs retournent un JSON avec un champ error :
{
"error": "Champs requis manquants: amount, orderId"
}
Limites
Des limites de requêtes sont appliquées par IP pour protéger la plateforme. En cas de dépassement, vous recevrez un code 429 Too Many Requests.
| Route | Limite | Fenêtre |
|---|---|---|
POST /api/payment-links | 120 requêtes | 1 minute |
GET /api/payment-links/:id | 120 requêtes | 1 minute |
GET /api/payment-methods | 120 requêtes | 1 minute |
/api/admin/* | 120 requêtes | 1 minute |
/api/callback | 300 requêtes | 1 minute |
| Login / Register | 15 tentatives | 15 minutes |
Autres informations :
- Les webhooks timeout après 10 secondes
- Les webhooks échoués sont réessayés jusqu'à 5 fois avec un backoff exponentiel
- Le status checker vérifie les paiements pending pendant 1 heure maximum