Documentation / Référence

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.

Télécharger cryptopay.js ↓

PHP

PHP 8.1+, extensions curl et json. \Cryptopay\Client, \Cryptopay\verify_webhook.

Télécharger Cryptopay.php ↓

Python

Python 3.9+, bibliothèque standard uniquement. CoineticClient, verify_webhook.

Télécharger cryptopay.py ↓

Go

Go 1.22+, bibliothèque standard uniquement. Package cryptopayclient.

Télécharger cryptopay.go ↓

Contenu

FonctionNode.jsPHPPythonGo
Signer une requêtesignRequestsign_requestsign_requestSignRequest
Créer une facturecreateInvoicecreateInvoicecreate_invoiceCreateInvoice
Lire une facturegetInvoicegetInvoiceget_invoiceGetInvoice
Vérifier un webhookverifyWebhookverify_webhookverify_webhookVerifyWebhook
Statuts « livrable »PAID_STATUSESPAID_STATUSESPAID_STATUSESPaidStatuses

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

pseudo-code
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 200

Ce 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-Id dé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-Key en cas de 429, de 5xx ou 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.