Documentation développeur

Intégration des paiements en stablecoins sur Ethereum

Vérifiez identité du token, paramètres et confirmation sur Ethereum. Payez le montant complet renvoyé par l’API.

Identités des tokens du réseau principal

Les contrats et Mint sont des valeurs préconfigurées, pas un état en temps réel. La création exige un réseau et un actif activés et un portefeuille valide. Payez toujours à payment.address renvoyé par l’API, jamais au contrat ou au Mint.

Identités des tokens du réseau principal
RéseauDeviseContrat / MintDécimales du token
ERC20 network logoERC20USDT6
ERC20 network logoERC20USDC6

Configuration du marchand

  1. Configurez un portefeuille de réception pour le réseau et un Webhook activé avec URL et clé. Conservez API Key et clé HMAC uniquement sur le serveur.
  2. Vérifiez la disponibilité de network / currency. Les administrateurs gèrent RPC, réseaux et actifs ; le marchand ne déploie pas de scanner.
  3. Affichez payment.amount, payment.address, currency, network et expiration de la réponse. Les données QR ne sont pas une image.
  4. Vérifiez la signature, dédupliquez et enregistrez durablement l’événement avant de répondre HTTP 2xx. Exécutez la livraison de façon idempotente.

Notes sur les réseaux et actifs

  • ERC20 désigne ici Ethereum mainnet, pas tous les réseaux de ce standard. Une adresse 0x peut exister sur plusieurs réseaux EVM ; utilisez le réseau et la version de la commande. USDC est natif Circle ; les versions bridgées ne le remplacent pas.

Exemples de requête signée et de réponse

25.00 est un montant d’exemple. Utilisez le montant réel et respectez le minimum de l’actif. Adresses, commandes et hashes sont fictifs. Le cURL ou programme Java copié envoie une requête : configurez vos propres clés avant exécution.

create / cURL
# Run against your account only when ready; this sends an API request.
: "${BOLTUTIL_API_KEY:?Set your complete API Key}"
: "${BOLTUTIL_WEBHOOK_SECRET:?Set your Webhook secret}"
timestamp=$(python3 -c 'import time; print(int(time.time()*1000))')
body='{"amount":"25.00","currency":"USDT","network":"ERC20","externalOrderId":"INV-20260209-99281"}'
signature=$(printf '%s.%s' "$timestamp" "$body" | openssl dgst -sha256 -hmac "$BOLTUTIL_WEBHOOK_SECRET" | awk '{print $NF}')

curl --request POST "https://api.boltutil.com/api/v1/order/create" \
  --header 'Content-Type: application/json' \
  --header "X-Bolt-Key: $BOLTUTIL_API_KEY" \
  --header "X-Bolt-Timestamp: $timestamp" \
  --header "X-Bolt-Signature: $signature" \
  --data-binary "$body"

Les adresses, les hachages de transactions et les commandes en sont des exemples. Remplacez-les par votre propre test data.

Base URL

PROD
https://api.boltutil.com
Paramètres complets de la commande →

Confirmation et notifications

Détection ne signifie pas confirmation. Utilisez le statut et les callbacks vérifiés : PAID attend confirmation. CONFIRMED / COMPLETED peuvent aussi suivre une acceptation manuelle ; vérifiez paidAmount, shortfallAmount et settlementType. COMPLETED ne prouve pas la livraison.

Questions d’intégration

Une devise prise en charge est-elle disponible maintenant ?

Pas nécessairement. Le réseau et l’actif doivent être activés avec un portefeuille et un Webhook valides. La table statique ne donne pas la disponibilité en temps réel.

Le client peut-il arrondir le montant ?

Payez payment.amount en entier. Le système peut arrondir vers le haut et ajouter un petit ajustement pour distinguer les commandes du même portefeuille. Ne tronquez ni n’arrondissez vous-même.

Puis-je livrer dès que le solde augmente ?

Vérifiez le résultat confirmé et l’authenticité de la notification. Réseaux, versions ou montants erronés et doublons doivent être traités. Le solde seul ne remplace pas le résultat du paiement.