Authentification & signature

Headers, calcul du HMAC-SHA256 et exemples Node.js / PHP / cURL pour signer une requête vers l'API Merchant.

Chaque requête vers l'API Merchant porte trois headers obligatoires : ta clé publique, un timestamp, et une signature HMAC du contenu calculée avec ta clé secrète.

Récupérer tes clés

  • Menu Développeurs → API

  • Choisis le mode SANDBOX (clés pk_sandbox_…) ou LIVE (clés pk_live_…)

  • Tu obtiens 3 clés par environnement :

Clé
Usage

Clé publique

Envoyée dans le header X-Api-Key — identifie ton compte

Clé secrète

Ne sort jamais — sert à calculer la signature HMAC

Clé privée

Réservée à l'ancienne API (/api/v1/payments/request) ; pas utilisée par le Merchant API v1

Headers obligatoires

X-Api-Key:     pk_live_a1b2c3d4…
X-Timestamp:   2026-05-20T10:30:00.000Z
X-Signature:   sha256=<hex>

Pour les mutations (POST / PUT / PATCH), ajoute :

Idempotency-Key: <UUID v4, 8 à 128 caractères [A-Za-z0-9_-]>
Content-Type:    application/json
  • X-Timestamp doit être en ISO 8601 UTC. Toute requête de plus de 5 minutes par rapport à l'heure serveur est rejetée (anti-replay).

  • Idempotency-Key doit être unique par requête métier. Voir Idempotency.

Construire la chaîne à signer

La signature couvre 5 champs séparés par \n :

Champ
Règle

timestamp

La valeur exacte du header X-Timestamp

METHOD

En MAJUSCULES : GET, POST, DELETE

path

Le chemin après le rewrite Nginx, donc /api/v1/merchant/... (voir note ci-dessous)

sorted_query

Paires clé=valeur triées alphabétiquement, jointes par &. Chaîne vide si pas de query

raw_body

Le body JSON tel qu'envoyé (pas de re-sérialisation). Chaîne vide si GET / HEAD / DELETE

Puis HMAC-SHA256 de cette chaîne avec ta secret_key, encodé en hex, préfixé par sha256=.

Exemple Node.js complet

Exemple PHP

Exemple cURL

Codes d'erreur d'authentification

Code HTTP

code JSON

Cause

401

missing_api_key

Header X-Api-Key absent

401

invalid_api_key

Clé inconnue ou révoquée

401

signature_invalid

HMAC mauvais, timestamp hors fenêtre, ou header manquant

403

merchant_inactive

Compte marchand non validé

403

ip_allowlist_empty

Clé live mais aucune IP whitelistée (cf. Sandbox vs Live)

403

ip_not_allowed

L'IP appelante n'est pas dans la whitelist live

Mis à jour