En bref
L'API 2Checkout (désormais Verifone) permet aux développeurs de traiter les paiements, de gérer les abonnements et de gérer les transactions e-commerce par programmation. Elle prend en charge les points d'accès RESTful pour les commandes, les clients, les produits et les webhooks avec une authentification basée sur JSON utilisant des clés API. Ce guide couvre tout, de la configuration initiale à la gestion avancée des webhooks.
Essayez Apidog dès aujourd'hui
Introduction
Le traitement des paiements est l'épine dorsale de toute entreprise en ligne. Si vous vous trompez, vous perdez des revenus. Si vous réussissez, vous ouvrez les marchés mondiaux. L'API 2Checkout (récemment renommée Verifone) gère les paiements pour plus de 45 000 commerçants dans le monde, traitant des milliards de transactions chaque année.
Voici la réalité : 67 % des acheteurs abandonnent leur panier en raison de frictions liées au paiement. Une intégration API de paiement solide a un impact direct sur votre chiffre d'affaires.
Ce guide vous présente le processus complet d'intégration de l'API 2Checkout. Vous apprendrez l'authentification, le traitement des paiements, la gestion des abonnements, la gestion des webhooks et le dépannage des erreurs. À la fin, vous disposerez d'une intégration de paiement prête pour la production.
💡 Astuce : Apidog simplifie les tests d'intégration d'API. Testez vos points d'accès 2Checkout, validez les charges utiles de webhook et déboguez les problèmes d'authentification dans un seul espace de travail. Importez la spécification OpenAPI de 2Checkout, simulez les réponses et partagez les scénarios de test avec votre équipe.
Qu'est-ce que l'API 2Checkout ?
2Checkout (opérant désormais sous le nom de Verifone Digital Commerce) fournit une API RESTful pour le traitement des paiements et la gestion des abonnements. L'API gère :
- Paiements uniques et récurrents
- Gestion des clients et des produits
- Suivi du cycle de vie des commandes
- Gestion des remboursements et des litiges
- Automatisation des taxes et de la conformité
- Prise en charge de plus de 100 devises
Fonctionnalités Clés
| Fonctionnalité | Description |
|---|---|
| Conception RESTful | Méthodes HTTP standard (GET, POST, PUT, DELETE) avec des charges utiles JSON |
| Environnement de Bac à Sable | Testez les paiements sans traiter de transactions réelles |
| Prise en charge des Webhooks | Notifications en temps réel pour les événements de commande |
| Tokenisation | Traitement sécurisé des données de paiement sans stockage des détails de carte |
| Conformité Mondiale | PCI DSS Niveau 1, GDPR, PSD2 et 3D Secure 2.0 |
Aperçu de l'Architecture API
2Checkout utilise une structure d'API REST versionnée :
https://api.2checkout.com/1/
https://api.2checkout.com/2/
La version 2 est recommandée pour ses fonctionnalités avancées sur la gestion des abonnements et des webhooks.
Démarrer : Configuration de l'Authentification
Étape 1 : Créez Votre Compte 2Checkout
- Rendez-vous sur la page d'inscription 2Checkout (Verifone)
- Effectuez la vérification de l'entreprise (documents requis)
- Attendez l'approbation (24-48h)
- Accédez au Panneau de Configuration pour récupérer vos identifiants API
Étape 2 : Récupérez les Clés API
Dans Intégrations > Clés API du Panneau de Configuration :
- Clé API Privée : Authentification côté serveur (gardez-la secrète)
- Clé API Publique : Tokenisation côté client
- Secret de Webhook : Pour vérifier les signatures de webhook
Bonnes pratiques : N'ajoutez jamais les clés API au contrôle de version. Utilisez des variables d'environnement :
# .env
TWOCHECKOUT_PRIVATE_KEY="your_private_key_here"
TWOCHECKOUT_PUBLIC_KEY="your_public_key_here"
TWOCHECKOUT_WEBHOOK_SECRET="your_webhook_secret_here"
Étape 3 : Bac à Sable vs Production
| Environnement | URL de Base | Cas d'Utilisation |
|---|---|---|
| Bac à Sable | https://sandbox.2checkout.com/api/ |
Développement et tests |
| Production | https://api.2checkout.com/ |
Transactions réelles |
Utilisez le bac à sable pour tous les développements, puis passez aux clés de production pour le live.
Étape 4 : Méthodes d'Authentification
Méthode 1 : Authentification par Clé API (Recommandée)
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'GET',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
Méthode 2 : Authentification par Signature HMAC
const crypto = require('crypto');
function generateSignature(payload, privateKey) {
const hash = crypto
.createHmac('sha256', privateKey)
.update(JSON.stringify(payload))
.digest('hex');
return hash;
}
// Usage
const payload = { order_id: '12345', amount: 99.99 };
const signature = generateSignature(payload, privateKey);
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'X-Signature': signature,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
Traitement des Paiements : Points d'Accès Essentiels
Création d'une Commande Unique
Utilisez /orders pour créer une commande :
const createOrder = async (customerData, productData) => {
const payload = {
currency: 'USD',
customer: {
email: customerData.email,
first_name: customerData.firstName,
last_name: customerData.lastName,
phone: customerData.phone,
billing_address: {
address1: customerData.address,
city: customerData.city,
state: customerData.state,
zip: customerData.zip,
country: customerData.country
}
},
items: [
{
name: productData.name,
quantity: productData.quantity,
price: productData.price,
product_code: productData.sku
}
],
payment_method: {
type: 'card',
card_token: customerData.cardToken // Tokenisé côté client
}
};
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
Réponse Attendue
{
"order_id": "ORD-2026-001234",
"status": "approved",
"amount": 99.99,
"currency": "USD",
"customer_id": "CUST-789456",
"transaction_id": "TXN-9876543210",
"created_at": "2026-03-20T10:30:00Z"
}
Gestion des Erreurs de Paiement
Toujours gérer les erreurs de manière spécifique :
try {
const result = await createOrder(customer, product);
if (result.error) {
switch (result.error.code) {
case 'CARD_DECLINED':
// Demander une carte différente au client
break;
case 'INSUFFICIENT_FUNDS':
// Afficher un message adapté
break;
case 'INVALID_CVV':
// Demander une nouvelle saisie du CVV
break;
default:
// Log et message générique
console.error('Payment failed:', result.error);
}
}
} catch (error) {
// Erreur réseau ou serveur
console.error('API request failed:', error);
}
Codes d'Erreur Courants
| Code d'Erreur | Statut HTTP | Description | Résolution |
|---|---|---|---|
CARD_DECLINED |
402 | Carte refusée | Demander un autre mode de paiement |
INVALID_CARD |
400 | Numéro de carte invalide | Valider la saisie |
EXPIRED_CARD |
400 | Carte expirée | Demander une date d'expiration à jour |
INVALID_CVV |
400 | Vérification CVV échouée | Redemander le CVV |
INSUFFICIENT_FUNDS |
402 | Fonds insuffisants | Suggérer un autre paiement |
DUPLICATE_ORDER |
409 | Commande déjà traitée | Vérifier les doublons |
INVALID_CURRENCY |
400 | Devise non prise en charge | Vérifier le code devise |
API_KEY_INVALID |
401 | Authentification échouée | Vérifier la clé API |
Gestion des Clients
Pour les achats récurrents, utilisez l'API client de 2Checkout.
Création d'un Client
const createCustomer = async (customerData) => {
const payload = {
email: customerData.email,
first_name: customerData.firstName,
last_name: customerData.lastName,
phone: customerData.phone,
company: customerData.company,
billing_address: {
address1: customerData.address,
address2: customerData.address2 || '',
city: customerData.city,
state: customerData.state,
zip: customerData.zip,
country: customerData.country
},
shipping_address: customerData.shippingAddress || null,
tax_exempt: false,
language: 'en'
};
const response = await fetch('https://api.2checkout.com/1/customers', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
Récupération des Détails Client
const getCustomer = async (customerId) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'GET',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
}
}
);
return await response.json();
};
Mise à Jour des Informations Client
const updateCustomer = async (customerId, updates) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'PUT',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(updates)
}
);
return await response.json();
};
Suppression d'un Client
const deleteCustomer = async (customerId) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'DELETE',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
}
}
);
return response.status === 204; // No content on success
};
Remarque : Un client avec abonnements actifs ou soldes impayés ne peut être supprimé. Annulez d'abord les abonnements.
Modèles d'Intégration Avancés
Idempotence pour des Retentatives Sûres
Ajoutez X-Idempotency-Key sur chaque commande pour éviter les doublons :
const createIdempotentOrder = async (payload, idempotencyKey) => {
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json',
'X-Idempotency-Key': idempotencyKey // Unique par commande
},
body: JSON.stringify(payload)
});
return await response.json();
};
// Générer une clé unique par commande
const idempotencyKey = `order_${userId}_${Date.now()}`;
Gestion de 3D Secure 2.0 (Conformité UE)
Pour la DSP2, activez 3DS :
const createOrderWith3DS = async (payload) => {
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
...payload,
three_ds: {
enabled: true,
challenge_required: 'preferred', // ou 'mandatory' pour l'UE
notification_url: 'https://your-site.com/3ds-callback'
}
})
});
const result = await response.json();
if (result.three_ds_redirect_url) {
res.redirect(result.three_ds_redirect_url);
}
return result;
};
Tarification Multi-Devises
Obtenez le prix localisé :
const getLocalizedPrice = async (basePrice, targetCurrency) => {
const response = await fetch(
`https://api.2checkout.com/1/rates?from=USD&to=${targetCurrency}`,
{
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
}
}
);
const rates = await response.json();
return basePrice * rates.rate;
};
// Ex :
const eurPrice = await getLocalizedPrice(99.99, 'EUR');
console.log(`Price: EUR ${eurPrice.toFixed(2)}`);
Prorata pour les Mises à Niveau d'Abonnement
const upgradeSubscription = async (subscriptionId, newPlanId) => {
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}/upgrade`,
{
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
plan_id: newPlanId,
proration: 'immediate',
invoice_proration: true
})
}
);
return await response.json();
};
Dépannage des Problèmes Courants
Problème : Les Webhooks n'Arrivent Pas
Diagnostic :
// Vérifiez les logs de livraison webhook dans le dashboard 2Checkout
// Vérifiez les échecs ou les réponses non-200
Solutions :
- Assurez-vous que votre endpoint retourne 200 OK en moins de 5 secondes
- Vérifiez l'HTTPS et le certificat SSL
- Liste blanche des IP 2Checkout dans le pare-feu
- Vérifiez la logique de signature webhook
- Testez avec un simulateur de webhook
Problème : Les Paiements de Test Échouent dans le Bac à Sable
Solutions :
- Vérifier l'utilisation des clés API du bac à sable
- Vérifier l'URL de base sandbox :
https://sandbox.2checkout.com/api/ - Utiliser les bons numéros de carte de test
- Vérifier l'état du compte bac à sable
Problème : Les Renouvellements d'Abonnement Échouent Silencieusement
Diagnostic :
// Interrogez l'historique des paiements de l'abonnement
const history = await fetch(
`https://api.2checkout.com/1/subscriptions/${subId}/payments`,
{ headers: { 'X-Api-Key': privateKey } }
);
Solutions :
- Vérifier l'expiration de la carte du client
- Vérifier les paramètres de recouvrement
- Vérifier la livraison du webhook
subscription.payment_failed - Confirmer que
auto_renewest activé
Problème : Discrépances de Conversion de Devise
Solutions :
- Afficher une conversion « approximative » avec disclaimer
- Bloquer le taux lors de la création du panier (15min)
- Stocker les transactions dans la devise locale
Problème : Échecs de la Vérification d'Adresse (AVS)
Solutions :
- Utiliser la saisie semi-automatique d'adresses (Google Places, etc.)
- Rendre le code postal obligatoire
- Implémenter un AVS souple (avertir, ne pas refuser)
- Permettre au client de corriger l'adresse
Gestion des Abonnements
2Checkout facilite la facturation récurrente.
Création d'un Abonnement
const createSubscription = async (customerId, planId) => {
const payload = {
customer_id: customerId,
plan_id: planId,
start_date: new Date().toISOString(),
billing_cycle: 'monthly',
payment_method: {
type: 'card',
card_token: 'tok_card_tokenized'
},
options: {
trial_days: 14,
auto_renew: true
}
};
const response = await fetch('https://api.2checkout.com/1/subscriptions', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
Mise à Jour d'un Abonnement
const updateSubscription = async (subscriptionId, updates) => {
const payload = {
...updates
};
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}`,
{
method: 'PUT',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}
);
return await response.json();
};
Annulation d'un Abonnement
const cancelSubscription = async (subscriptionId, reason = '') => {
const payload = {
cancel_at_period_end: false,
reason: reason
};
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}/cancel`,
{
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}
);
return await response.json();
};
Intégration des Webhooks : Gestion des Événements en Temps Réel
Les webhooks permettent d'automatiser la gestion des événements sans polling.
Étape 1 : Configurez le Point d'Accès du Webhook
- Accédez à Intégrations > Webhooks dans 2Checkout
- Ajoutez l'URL de votre endpoint HTTPS
- Sélectionnez les événements désirés
- Notez votre secret de webhook
Étape 2 : Créez un Gestionnaire de Webhook
const express = require('express');
const crypto = require('crypto');
const app = express();
app.post('/webhooks/2checkout', express.raw({ type: 'application/json' }), async (req, res) => {
const signature = req.headers['x-webhook-signature'];
const payload = req.body;
// Vérification de la signature
const isValid = verifyWebhookSignature(payload, signature, process.env.TWOCHECKOUT_WEBHOOK_SECRET);
if (!isValid) {
console.error('Invalid webhook signature');
return res.status(401).send('Unauthorized');
}
const event = JSON.parse(payload.toString());
switch (event.type) {
case 'order.created':
await handleOrderCreated(event.data);
break;
case 'order.approved':
await handleOrderApproved(event.data);
break;
case 'order.declined':
await handleOrderDeclined(event.data);
break;
case 'subscription.created':
await handleSubscriptionCreated(event.data);
break;
case 'subscription.renewed':
await handleSubscriptionRenewed(event.data);
break;
case 'subscription.cancelled':
await handleSubscriptionCancelled(event.data);
break;
case 'refund.processed':
await handleRefundProcessed(event.data);
break;
default:
console.log('Unhandled event type:', event.type);
}
res.status(200).send('OK');
});
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
Événements Webhook Critiques
| Type d'Événement | Déclencheur | Action Requise |
|---|---|---|
order.created |
Nouvelle commande | Envoyer un e-mail de confirmation |
order.approved |
Paiement réussi | Déclencher la livraison/l'accès |
order.declined |
Paiement échoué | Notifier le client, proposer relance |
subscription.renewed |
Paiement récurrent | Prolonger l'accès |
subscription.payment_failed |
Renouvellement échoué | Démarrer séquence de recouvrement |
subscription.cancelled |
Annulation client | Révoquer l'accès à la fin de période |
refund.processed |
Remboursement émis | Mettre à jour le solde utilisateur |
chargeback.received |
Litige carte | Préparer les preuves |
Bonnes Pratiques des Webhooks
- Toujours vérifier les signatures (HMAC)
- Renvoyer 200 OK rapidement (évite les répétitions)
- Traiter en asynchrone (queue)
- Gérer l'idempotence (évite les doublons)
- Logger tous les événements
Test de Votre Intégration
Utilisation de l'Environnement de Bac à Sable
// URL sandbox
const BASE_URL = 'https://sandbox.2checkout.com/api/1';
// Cartes de test
const TEST_CARDS = {
APPROVED: '4111111111111111',
DECLINED: '4000000000000002',
INSUFFICIENT_FUNDS: '4000000000009995',
EXPIRED_CARD: '4000000000000069'
};
// Adresse de test
const TEST_ADDRESS = {
country: 'US',
zip: '90210' // Déclenche AVS
};
Test des Webhooks Localement
# Installer ngrok
npm install -g ngrok
# Lancer votre serveur sur le port 3000
node server.js
# Exposer en public
ngrok http 3000
# Utiliser l'URL ngrok dans les paramètres webhook 2Checkout
Apidog pour le Test d'API
Apidog facilite :
- Importer la spec OpenAPI de 2Checkout
- Créer des scénarios de test pour chaque point d'accès
- Simuler les réponses sans toucher l'API réelle
- Valider les webhooks et inspecter les payloads
- Partager avec votre équipe
Utilisez des variables d'environnement pour basculer rapidement entre bac à sable et production.
Liste de Contrôle du Déploiement en Production
Avant le passage en live :
- [ ] Utiliser les clés API de production
- [ ] Mettre à jour l'URL de base vers
https://api.2checkout.com/ - [ ] Activer la vérification de signature webhook
- [ ] Configurer la surveillance des paiements échoués
- [ ] Implémenter la logique de nouvelle tentative
- [ ] Tester les flux de remboursement et rétrofacturation
- [ ] Vérifier la conformité PCI DSS (tokenisation)
- [ ] Activer 3DS 2.0 pour les clients UE
- [ ] Mettre en place la journalisation/audit
- [ ] Rédiger un guide opérationnel pour les incidents
Surveillance et Alertes
Surveillez vos taux de succès :
const successRate = approvedOrders / totalOrders * 100;
if (successRate < 95) {
sendAlert('Le taux de succès des paiements est inférieur à 95%');
}
const errorBreakdown = errors.reduce((acc, err) => {
acc[err.code] = (acc[err.code] || 0) + 1;
return acc;
}, {});
if (errorBreakdown['CARD_DECLINED'] > threshold) {
sendAlert('Pics de refus de carte détectés');
}
Cas d'Utilisation Réels
Intégration d'une Boutique E-commerce
Un détaillant de mode a intégré 2Checkout pour :
- Plus de 100 devises supportées
- Réduction de l'abandon panier de 23%
- Gestion automatisée de la TVA UE
- >2M$ de CA la première année
Démarrage via les pages de paiement hébergées, puis bascule vers l'API directe pour une UX personnalisée.
Entreprise d'Abonnement SaaS
Un SaaS de gestion de projet :
- 5 000+ abonnements actifs
- Prorata lors des upgrades de plan
- Recouvrement automatisé lors des échecs
- Réduction de l'attrition de 15% via relances intelligentes
Clé : accès basé sur les webhooks (subscription.renewed = prolongation, subscription.cancelled = révocation planifiée).
Conclusion
L'API 2Checkout fournit tous les outils pour gérer paiements et abonnements. Points d'action :
- Développez/testez toujours sur le bac à sable
- Vérifiez la signature HMAC des webhooks
- Gérez les erreurs par code spécifique
- Testez l'ensemble du cycle abonnement (essai, renouvellement, annulation)
- Surveillez les métriques de paiement en production
- Utilisez Apidog pour accélérer vos tests d'API
Section FAQ
Qu'est-ce que l'API 2Checkout ?
L'API 2Checkout (désormais Verifone) est une interface RESTful pour le traitement des paiements, la gestion des abonnements, la gestion des remboursements et l'automatisation des transactions e-commerce. Elle prend en charge les charges utiles JSON, l'authentification HMAC et les webhooks en temps réel.
2Checkout est-il identique à Verifone ?
Oui. 2Checkout a été acquis par Verifone en 2020 et a été renommé Verifone Digital Commerce. Les points d'accès API et les fonctionnalités restent les mêmes, bien que certaines documentations fassent référence à Verifone.
Comment obtenir ma clé API 2Checkout ?
Connectez-vous à votre Panneau de Configuration 2Checkout, naviguez vers Intégrations > Clés API, puis générez une nouvelle clé. Vous recevrez une clé privée (serveur) et une clé publique (client).
2Checkout dispose-t-il d'un environnement de bac à sable ?
Oui. Utilisez https://sandbox.2checkout.com/api/ pour les tests. Créez un compte sandbox dédié pour obtenir des clés API de test et simuler des transactions sans frais réels.
Quels modes de paiement 2Checkout prend-il en charge ?
2Checkout prend en charge les cartes de crédit (Visa, Mastercard, Amex, Discover), PayPal, Apple Pay, Google Pay, les virements bancaires et les méthodes locales dans plus de 100 pays.
Comment gérer les webhooks en toute sécurité ?
Vérifiez toujours l'en-tête X-Webhook-Signature avec HMAC-SHA256 et votre secret. Traitez les événements de manière asynchrone et retournez rapidement un 200 OK.
Que se passe-t-il lorsqu'un paiement d'abonnement échoue ?
2Checkout envoie un webhook subscription.payment_failed. Implémentez une logique de nouvelle tentative (en général 3 tentatives sur 7 jours) et un webhook subscription.cancelled si tout échoue.
2Checkout est-il conforme PCI DSS ?
Oui, 2Checkout est certifié PCI DSS Niveau 1. Utilisez la tokenisation côté client pour éviter de manipuler des données de carte brutes.
Puis-je tester les abonnements dans le bac à sable ?
Oui. Le sandbox prend en charge l'intégralité du cycle de vie des abonnements (essais, renouvellements, upgrades, annulation). Utilisez la carte test 4111111111111111 pour simuler un paiement réussi.
Comment gérer les remboursements via l'API ?
Envoyez une requête POST à /refunds avec l'ID de commande et le montant. 2Checkout traite les remboursements partiels ou complets et envoie un webhook refund.processed à la fin.

Top comments (0)