Aller au contenu principal

Démarrage rapide

Une intégration de paiement minimale : la création d'une facture via l'API et le traitement de la notification de paiement. La dernière section couvre la livraison de la commande. Les exemples sont autonomes ; aucun SDK n'est utilisé.

astuce

Vous travaillez avec un agent IA ? Donnez-lui la version markdown de cette page. Elle est assez détaillée pour construire une intégration pour votre site ou votre boutique.

Prérequis​

ValeurOù la trouver
Clé d'APILa section Intégrations (Integrations)
ID du projetLa section Projets (Projects)
Secret du webhookRéglages du projet

Dans ces mêmes réglages du projet, définissez le Webhook URL — l'adresse du gestionnaire de notifications sur votre serveur. HTTPS uniquement ; les redirections ne sont pas suivies.

Les exemples utilisent des valeurs de test — remplacez-les par les vôtres.

Création d'une facture​

POST https://api.bitsby.app/invoices/create, la clé d'API est passée dans l'en-tête Authorization.

ParamètreObligatoireValeur
projectIdouiID du projet, UUID
amountFiatouiMontant de la facture
currencyFiatouiDevise : USD, EUR, RUB
timeToPayouiDélai de paiement en heures : 0.5, 1, 3, 6, 12
descriptionnonDescription, affichée au client sur la page de paiement
serviceDatanonDonnées de service, non affichées au client. Nous recommandons d'y passer le numéro de commande : il revient dans la notification de paiement
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Réponse :

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Conservez data.id avec la commande et envoyez le client vers data.url — la page de paiement. Transmettez le lien comme vous voulez : une redirection, un e-mail, un message de bot. La facture est valable jusqu'à timeToPayDatetime (UTC).

Traitement de la notification​

Quand une facture passe au statut Payée (Paid), le service envoie une requête POST vers le Webhook URL du projet. Le corps est en JSON ; la signature est dans les en-têtes :

En-têteValeur
X-TimestampHeure d'envoi, unix time en secondes
X-Signaturesha256= + HMAC-SHA256 en hexadécimal de la chaîne <timestamp>.<request body>

La clé de signature est le secret du webhook. La signature est calculée sur le corps brut de la requête, vérifiez-la donc avant d'analyser le JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Répondez avec un code 2xx sous 10 secondes. Tout autre code, une redirection ou un dépassement de délai compte comme une remise échouée : le service réessaie à intervalles croissants, de 5 minutes à 24 heures, puis s'arrête. Déportez les traitements longs dans une file d'attente : répondez 200 d'abord, puis traitez la commande.

Le format complet de la notification et la référence des champs se trouvent dans la section Webhook URL.

Livraison de la commande​

Une notification vérifiée avec le statut paid confirme le paiement. Étapes de la livraison :

  1. Retrouvez la commande par invoice.serviceData — la valeur passée à la création de la facture (order-4172).
  2. Vérifiez par invoice.id si cette facture a déjà été livrée. Une notification avec le même invoice.id peut arriver plusieurs fois — livrez la commande une seule fois et stockez un marqueur de traitement.
  3. Contrôlez le montant et la devise avec invoice.amountFiat et invoice.currencyFiat — ce sont les valeurs d'origine de la facture et elles ne changent jamais. amountFiatUSD est remplacé par le montant réellement reçu. Comparez les montants comme des nombres, pas comme des chaînes : les zéros finaux sont supprimés, 49.90 arrive donc comme 49.9. Si les valeurs ne correspondent pas à la commande, envoyez la facture en vérification manuelle au lieu de la livrer — ces cas sont couverts dans Association des paiements et écarts de montant.
  4. Livrez la commande et marquez-la comme traitée.

Ne vérifiez pas le délai de paiement au moment de la livraison : le paiement peut s'être confirmé on-chain après timeToPayDatetime, et le marchand peut associer un paiement à une facture manuellement. La notification elle-même confirme le paiement.

Et ensuite​