Gestion des webhooks
Présentation
Yavin envoie un webhook standardisé après qu'une transaction a passé la phase d'acceptation, avec une structure homogène pour les transactions proxi (en magasin) et ecommerce. Utilisez-le pour être notifié des résultats des transactions sans interrogation régulière.
Ce webhook standardisé peut casser des intégrations qui reposaient sur l'ancienne structure ou sur des clés mises à jour ou supprimées. Examinez la structure ci-dessous pour vérifier la compatibilité avec vos gestionnaires de webhook existants, et contactez le support si vous avez besoin d'aide pour vous adapter.
Envoi
- Le webhook est envoyé aux URL configurées de l'entreprise associée à la transaction. Les URL se configurent dans MyYavin : onglet Paramètres > API > Webhook (les encaissements ecommerce peuvent aussi transmettre un
webhook_urlpar lien) - Il est envoyé uniquement lors de l'acceptation de la transaction, pour les transactions proxi comme ecommerce
- La structure est conçue pour rester stable et cohérente à l'avenir
Les règles d'envoi (contraintes sur les URL, nouvelles tentatives à 1 minute, 10 minutes, 1 heure, 8 heures, puis désactivation) sont décrites dans les pages des API qui émettent le webhook : Cloud API et Webservices API.
Structure du payload
Tous les champs sont facultatifs, sauf indication contraire. Les montants sont des entiers en centimes.
trs_idString- Identifiant de la transaction sur le serveur Yavin
local_idString- Identifiant côté terminal
statusString- ok, ko, pending
typeString- DEBIT, CREDIT, REVERSAL, REFUND
asked_amountInteger- Montant demandé, en centimes
gift_amountInteger- Pourboire ou don, en centimes
total_amountInteger- Montant total, en centimes
currency_codeString- Code ISO 4217
created_atString- Horodatage de création
device_datetimeString- Horodatage sur l'appareil
device_timestampInteger- Horodatage Unix sur l'appareil
server_timestampInteger- Horodatage Unix sur le serveur
serial_numberString- Identifiant du terminal
mediumString- CARD, VAD_MOTO, PAYMENT_LINK, eDebit, WIRE, CASH, ANCV, myyavin, RESTOFLASH
schemeString- AMEX, CONECS, CB, ANCV, MASTERCARD, VISA, MAESTRO
payment_applicationString- AMEX, ANCV, CASH, CONECS_CONTACT, CONECS_CONTACTLESS, DISCOVER, EMV_CONTACT, EMV_CONTACTLESS, EMV_MOTO, EMV_PAYMENT_LINK, RESTOFLASH, OTHER, VAD_NEPTING_REFUND, WIRE
panString- PAN de la carte masqué
card_tokenString- Token unique de la carte du client
referenceString- Serveur ou personne ayant effectué la transaction
client_ticketString- Ticket client
company_ticketString- Ticket marchand
receipt_ticketObject- Contenu du ticket (data, format)
app_versionString- Version de l'application Yavin Pay
company_idInteger- Identifiant interne Yavin de l'entreprise
company_external_idInteger- ID externe de l'entreprise
Liste brute des champs
created_at: str
device_datetime: str
device_timestamp: int
asked_amount: int
gift_amount: int
total_amount: int
status: Literal['ok', 'ko', 'pending']
trs_id: str
serial_number: str
currency_code: str
client_ticket: str
company_ticket: str
receipt_ticket: Dict
type: Literal["DEBIT", "CREDIT", "REVERSAL", "REFUND"]
reference: str
medium: Literal["CARD", "VAD_MOTO", "PAYMENT_LINK", "eDebit", "WIRE", "CASH", "ANCV", "myyavin", "RESTOFLASH"]
scheme: Literal["AMEX", "CONECS", "CB", "ANCV", "MASTERCARD", "VISA", "MAESTRO"]
payment_application: Literal["AMEX", "ANCV", "CASH", "CONECS_CONTACT", "CONECS_CONTACTLESS", "DISCOVER", "EMV_CONTACT", "EMV_CONTACTLESS", "EMV_MOTO", "EMV_PAYMENT_LINK", "RESTOFLASH", "OTHER", "VAD_NEPTING_REFUND", "WIRE"]
app_version: str
pan: str
company_id: int
company_external_id: int
card_token: str
local_id: str
server_timestamp: intSécuriser votre endpoint webhook
Les requêtes webhook ne sont pas signées actuellement. Tant qu'aucun mécanisme de signature n'est disponible, protégez votre endpoint :
- Utilisez une URL difficile à deviner contenant un jeton secret (par ex.
https://mydomain.com/webhooks/yavin/{random_token}) et rejetez les requêtes sur tout autre chemin - Ne vous fiez jamais au webhook seul pour les décisions liées à l'argent : à réception, revérifiez côté serveur via
/get_cart_information/(ecommerce) ouGET /v5/transaction/?transactionId=(proxi) avant de marquer une commande comme payée - Dédoublonnez : les nouvelles tentatives peuvent livrer le même événement plusieurs fois. Utilisez
trs_id(proxi) oucheckout_external_id+action(ecommerce) comme clé d'idempotence