Clés nécessaires
Pour ce flux :hp_live_...est la clé Checkout. Elle reste sur votre serveur et authentifie la création du lien ainsi que la consultation de son statut.ak_...est la clé Direct API. Elle est nécessaire uniquement pour les endpoints/v1/*, comme/v1/collectou/v1/crypto/collect.whsec_...est le secret webhook. Ce n’est pas une clé API : il sert à vérifier les notifications envoyées à votre serveur.
hp_live_... est nécessaire. Le navigateur reçoit uniquement le payment_link, jamais une clé secrète.
Pour recevoir et vérifier les webhooks, trouvez le secret dans le tableau de bord : Clé API → Direct API → Secret webhook → Afficher ou générer le secret. L’accès nécessite un KYC validé et Direct API activée. Stockez-le sur votre serveur sous ASHTECH_WEBHOOK_SECRET, jamais dans le navigateur. Sa régénération invalide l’ancienne valeur.
La clé hp_live_... doit appartenir à un compte existant, vérifié et non suspendu. Une clé absente, inconnue, révoquée ou mal formée renvoie 401; un compte non vérifié ou suspendu renvoie 403. La clé Checkout est indépendante de la clé Direct API.
Flux complet
- Votre backend crée un lien avec
hp_live_.... - AshTech Pay renvoie un
payment_linkvalable 30 minutes. - Votre site redirige le client vers ce lien.
- Le client remplit le formulaire et confirme son paiement sur AshTech Pay.
- AshTech Pay attend la confirmation du paiement et crédite le wallet marchand uniquement après validation.
- AshTech Pay envoie un webhook signé à votre backend.
- La page AshTech Pay redirige le navigateur vers votre URL de succès ou d’annulation.
Créer un lien de paiement
Endpoint :Authorization: Bearer hp_live_... (pas l’authentification Basic) et est limité à 20 demandes par minute et par adresse IP, en plus de la limite partagée de 120 demandes par minute et par clé. La consultation de statut exige elle aussi une clé Checkout valide et partage la limite de 120 demandes par minute par clé, sans la limite spécifique de création.
La requête doit être faite depuis votre backend :
- Node.js
- Python
- cURL
- PHP / Laravel
Réponse
Rediriger le client
Votre backend doit transmettrepayment_link à votre propre page de commande. Il ne doit pas transmettre hp_live_....
Exemple avec un lien HTML rendu par votre serveur :
302. Dans tous les cas, le client arrive sur :
ashtechpay-checkout.js, d’iframe, de popup ou de communication postMessage dans ce flux.
Éviter les liens en double
Utilisez une cléIdempotency-Key stable pour une commande. Elle doit rester la même lorsque votre serveur réessaie la création après un timeout ou une erreur réseau.
- Première requête : le lien est créé avec
reused: false. - Requête répétée avec le même marchand et la même clé : le même lien est retourné avec
reused: true. - Nouvelle commande : utilisez une nouvelle clé.
- Ne générez pas une clé aléatoire à chaque tentative.
Montant et pays
is_fixed_amount: true:amountest obligatoire et le client paie ce montant.is_fixed_amount: false: le client peut saisir le montant sur la page AshTech Pay.currencyaccepte actuellementXAF,XOFouCDF.allowed_countriesest optionnel et contient des codes pays actifs commeCM.- Un lien Hosted Checkout expire 30 minutes après sa création.
- Un lien expiré renvoie
410et ne peut plus lancer un paiement.
amount reste null avant confirmation. Après confirmation, il correspond au montant brut facturé au client, et non au montant net crédité après frais.
URLs de succès et d’annulation
Les URLs de retour sont configurées dans la configuration de la clé Checkout :successUrlreçoit les paiements confirmés ;cancelUrlreçoit les paiements échoués ou annulés ;notifyUrlreçoit les événements serveur-à-serveur.
Vérifier le statut
Endpoint :pending: aucun paiement confirmé ;processing: le client a commencé le paiement ;success: le paiement est confirmé et le wallet marchand est crédité ;failed: le paiement a échoué ;expired: le lien a expiré sans paiement confirmé.
paid_at correspond à l’heure de confirmation du paiement, et non à l’heure de création du lien. Pour un montant variable, amount correspond au brut payé par le client.
Webhooks
Configuration
Passeznotify_url lors de la création du lien pour définir l’URL de ce lien. Cette valeur explicite est prioritaire. Si elle n’est pas fournie, la configuration notifyUrl de la clé Checkout sélectionnée est utilisée ; pour la clé historique, la configuration Hosted Page du compte reste utilisée pour compatibilité. Sans URL effective, aucun webhook marchand ne peut être livré.
L’URL doit être une URL HTTPS publique. Les URLs localhost, loopback, réseau privé, link-local et autres adresses internes sont bloquées lors de la livraison ; la destination est revalidée à chaque tentative. Utilisez donc une URL valide dès la création.
Événements
Les événements Hosted Checkout sont :amount correspond au montant net de la transaction et total_amount au montant brut payé par le client. Utilisez transaction_id, reference et votre propre référence de commande pour empêcher un double traitement.
Vérifier la signature
AshTech Pay envoie :X-Ashtech-Event-Id pour la déduplication et répondez rapidement en 2xx. Le traitement métier peut ensuite être exécuté de manière asynchrone.
AshTech Pay met les notifications en file, empêche les doublons par transaction et événement, puis réessaie les erreurs temporaires. Si votre serveur ne répond pas en 2xx, la notification peut être envoyée à nouveau.

