API

Introduction

L'API Yavin permet aux développeurs et aux intégrateurs d'intégrer des fonctionnalités de paiement à leurs propres parcours utilisateur : traiter des paiements sur un terminal, générer des liens de paiement en ligne, imprimer et partager des tickets, et accéder aux données de transaction.

Cas d'usage typiques : paiement sur terminal depuis un logiciel de caisse, paiement en borne, paiement en ligne Click & Collect, Order & Pay via QR code, Pay at Table via QR code.

Choisir votre intégration

Posez-vous d'abord une question : où le paiement a-t-il lieu ?

Votre situationIntégration à utiliser
Logiciel de caisse et Yavin Pay sur le même appareil AndroidAndroid Intent API
Logiciel de caisse sur un autre appareil, sur le même réseau local que le terminalLocal API
Logiciel de caisse sur un autre réseau, ou logiciel de caisse webCloud API
Paiement en ligne par lien (e-commerce, QR code, Pay at Table)E-commerce API
Reporting et remboursements de serveur à serveurWebservices API

Les trois API en magasin (Local, Cloud, Android Intent) exposent les mêmes fonctionnalités de paiement. Seul le transport diffère : HTTP en local, HTTPS dans le cloud avec webhooks, ou deep links Android. Choisissez en fonction de la topologie de votre réseau, puis conservez la même intégration partout.

Configurer votre sandbox

Contactez notre équipe à l'adresse partnerships@yavin.com pour obtenir un environnement sandbox ainsi qu'un terminal de test si nécessaire.

Spécificités de la sandbox

  • URL de base : remplacez api.yavin.com par api.sandbox.yavin.com (chemins identiques). La Local API n'est pas concernée (réseau local) ; son add-on HTTPS utilise des noms d'hôte sandbox dédiés
  • Les identifiants sont totalement distincts : une clé d'API sandbox ne fonctionne jamais en production, et inversement. Le backoffice sandbox affiche en permanence un bandeau orange SANDBOX
  • Le backoffice sandbox est accessible via ce lien : my.sandbox.yavin.com
  • La page de paiement e-commerce de la sandbox n'utilise aucune carte de test : le paiement est validé dès que vous cliquez sur Payer

Authentification

Yavin utilise un objet company pour représenter un point de vente physique. Chaque company possède sa propre clé d'API, disponible sur my.yavin.com dans l'onglet API.

Illustration de la documentation
APIAuthentification
Local APIConnexion du marchand dans Yavin Pay avec ses identifiants My Yavin
Android Intent APIConnexion du marchand dans Yavin Pay avec ses identifiants My Yavin
Cloud APIClé d'API dans l'en-tête Authorization: Bearer YOUR_API_KEY
E-commerce APIClé d'API dans l'en-tête Yavin-Secret
Webservices APIClé d'API dans l'en-tête Yavin-Secret

Chaque requête HTTPS doit être authentifiée et doit contenir Content-Type: application/json.

Conventions

  • Les montants sont toujours des entiers, exprimés en centimes, et doivent être positifs (1000 = 10,00 €). N'envoyez jamais de montant négatif : toutes les API ne le rejettent pas (sur l'Android Intent API, sa valeur absolue est débitée)
  • Les codes de devise suivent la norme ISO 4217 (EUR, CHF, GBP). La devise réellement utilisée est celle configurée sur le profil du marchand
  • Statuts : les résultats des transactions en magasin sont ok ou ko ; les paiements e-commerce ajoutent pending et authorised
  • Idempotence : envoyez toujours un idempotentUuid dans les requêtes de paiement, un par tentative de paiement. Voir Gestion de l'IdempotentUuid
  • Nommage : la convention (camelCase ou snake_case) varie selon l'API et est indiquée en haut de chaque page d'API

Flux de paiement en magasin

Les API Local, Cloud et Android Intent sont utilisées uniquement pour les paiements en magasin.

  1. Le marchand sélectionne les articles ou le montant sur le logiciel de caisse
  2. Le marchand appuie sur le bouton de paiement du logiciel de caisse
  3. Le logiciel de caisse appelle la route de paiement avec le type debit et un idempotentUuid
  4. Le client paie sur le terminal

Paiement réussi : la réponse est prise en compte sur le logiciel de caisse, y compris les pourboires (sous forme de trop-perçu, « trop perçu »), le cas échéant.

Paiement échoué : dans chacun des cas suivants, le paiement est abandonné, la réponse parvient au logiciel de caisse et vous pouvez lancer un nouveau paiement (avec un nouvel idempotentUuid) :

  • Le client met plus de 60 secondes sur les écrans de pourboire ou d'avis
  • Le client met plus de 60 secondes pour présenter sa carte
  • La carte est refusée par la passerelle de paiement

Flux de paiement en ligne

  1. Le client sélectionne des articles sur votre site web et clique sur payer ; votre serveur est notifié
  2. Votre serveur appelle l'API Yavin pour générer un lien de paiement
  3. Le serveur Yavin renvoie un lien de paiement unique
  4. Votre serveur redirige le client vers le lien de paiement (page hébergée par Yavin)
  5. Le client saisit ses informations de paiement dans le widget
  6. Yavin appelle votre return_url_success ou return_url_cancelled (GET avec cartId et status dans les paramètres de requête) et votre webhook_url avec le résultat du paiement
  7. Votre serveur traite le résultat et affiche les informations pertinentes au client

Consultez la page E-commerce API pour les modes de capture (immédiate ou différée), la durée de vie du lien de paiement, les statuts et le comportement en cas de paiements multiples.

Codes d'erreur HTTP

CodeSignification
400Bad Request : la requête est invalide (la cause la plus fréquente est un en-tête Content-Type: application/json manquant)
401Unauthorized : la clé d'API est invalide ou le terminal n'est pas accessible avec cette clé d'API
404Not Found : la route n'existe pas
405Method Not Allowed : méthode HTTP incorrecte pour cette route
500Internal Server Error : problème de notre côté, réessayez plus tard et contactez le support si le problème persiste

Formats des réponses d'erreur

La structure du corps de l'erreur dépend de la famille d'endpoints. Écrivez un gestionnaire par structure ; ne supposez pas un format unique pour toutes les API.

EndpointsCorps de l'erreurExemple
Endpoints de paiement en magasin (Local API avec HTTP 200, Cloud API){"status": "ko", "message": "..."}{"status": "ko", "message": "Error: amount needs to be greater than 0"}
E-commerce /generate_link/ (validation){"errors": {"field": ["message"]}}{"errors": {"checkout_external_id": ["This checkout_external_id already exists"]}}
E-commerce /cancel_link/, /capture_transactions/, /get_cart_information/{"error": "..."}{"error": "Cart has already been cancelled"}
Remboursement Webservices, 400 requête malforméeUn objet indexé par champ{"amount": ["cannot be greater than the transaction's total amount"]}