Clients et exemples
Chaque client tient en un seul fichier, sans dépendance externe. Copiez-le dans votre projet : vous disposez aussitôt de la signature des requêtes, de la création et de la lecture des factures et de la vérification des webhooks.
Node.js
Node 22+. Classes CoineticClient, CoineticError, fonction verifyWebhook.
PHP
PHP 8.1+, extensions curl et json. \Cryptopay\Client, \Cryptopay\verify_webhook.
Python
Python 3.9+, bibliothèque standard uniquement. CoineticClient, verify_webhook.
Contenu
| Fonction | Node.js | PHP | Python | Go |
|---|---|---|---|---|
| Signer une requête | signRequest | sign_request | sign_request | SignRequest |
| Créer une facture | createInvoice | createInvoice | create_invoice | CreateInvoice |
| Lire une facture | getInvoice | getInvoice | get_invoice | GetInvoice |
| Vérifier un webhook | verifyWebhook | verify_webhook | verify_webhook | VerifyWebhook |
| Statuts « livrable » | PAID_STATUSES | PAID_STATUSES | PAID_STATUSES | PaidStatuses |
Les noms techniques des fichiers et des classes (cryptopay.*, CryptopayClient) sont historiques et ne changeront pas ; en Node.js et en Python, les alias CoineticClient et CoineticError sont disponibles.
Les quatre clients validés sur les mêmes valeurs de référence
Les signatures de requêtes et de webhooks de tous les clients correspondent aux valeurs de référence. Vous écrivez un client dans un autre langage ? Commencez par obtenir ces mêmes valeurs : c'est le moyen le plus rapide de trouver une erreur de signature.
Flux minimal
invoice = client.createInvoice({order_id, price_amount: "3.00", price_currency: "USD",
return_url: "https://shop.example/orders/42"},
idempotencyKey = "order-42")
redirect(invoice.checkout_url)
on POST /webhooks/coinetic (raw body!):
event = verifyWebhook(WEBHOOK_SECRET, headers, rawBody) # sinon 400/401
if seen(event.id): return 200 # livraison en double
inv = client.getInvoice(event.data.invoice_id) # revérification
if inv.status in PAID_STATUSES: grantOnce(inv.order_id)
return 200Ce que les clients ne font pas
- Ils ne stockent aucun secret : la clé et le secret leur sont fournis de l'extérieur, via des variables d'environnement ou un gestionnaire de secrets.
- Ils ne conservent pas les
X-Webhook-Iddéjà traités : c'est le rôle de votre base de données. - Ils ne convertissent pas les montants en nombres : tous les montants sont des chaînes.
- Ils ne relancent pas les requêtes d'eux-mêmes : relancez avec le même
Idempotency-Keyen cas de429, de5xxou d'erreur réseau. - Ils ne fonctionnent ni dans le navigateur ni dans une application mobile, uniquement côté serveur : c'est là que réside le secret.