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