Ce guide vous montre exactement ce qu’il faut modifier lors de la migration de l’API OneClickDz Flexy v2 vers v3. Chaque exemple présente votre code v2 actuel, liste les changements à effectuer et montre le résultat en v3.Disponible en plusieurs langages : exemples JavaScript/Node.js, PHP et Python inclus.
Dépréciation de l’API v2 : L’API v2 sera dépréciée le 30 octobre 2026.
Veuillez migrer avant cette date pour éviter toute interruption de service.
Bonne nouvelle : Les APIs v2 et v3 fonctionnent simultanément jusqu’à la dépréciation de v2.
Votre clé API de production actuelle fonctionne avec les endpoints v2 et v3, vous offrant une flexibilité dans votre migration.
Changement d’URL de base : v3 utilise une nouvelle URL de base : - v2 :
https://flexy-api.oneclickdz.com/v2 - v3 : https://api.oneclickdz.com/v3
Nouvelles fonctionnalités de sécurité : v3 introduit la gestion de clés API sandbox séparées pour les tests, ainsi que la liste blanche d’IP directement depuis la page des paramètres de votre tableau de bord. Votre clé de production continue de fonctionner avec v2 et v3.
Choisissez l’approche qui correspond à vos besoins :
🆕 Nouveau départ
Idéal pour : Refonte complète ou nouveaux projets
Générez une clé sandbox pour les tests depuis les paramètres
Configurez la liste blanche d’IP pour la clé de production
Testez tout en sandbox avec v3
Utilisez la clé de production quand vous êtes prêt
✅ Table rase, pas de code hérité
✅ Sécurité renforcée avec les restrictions IP
🔄 Migration progressive
Idéal pour : Systèmes de production existants
Continuez d’utiliser la clé de production actuelle pour les endpoints v2
Générez une clé sandbox pour tester v3 en toute sécurité
Migrez les endpoints un par un vers v3
Exécutez v2 et v3 en parallèle avec la même clé de production
✅ Zéro temps d’arrêt, moins de risques
✅ Migrez à votre rythme
Recommandé : La plupart des équipes choisissent la migration progressive pour minimiser les risques. Vous pouvez d’abord mettre à jour les endpoints critiques tout en maintenant les autres sur v2.
Migration intelligente : Commencez par les cartes cadeaux
Conseil pro : Si vous êtes intéressé par les cartes cadeaux, intégrez-les d’abord sur v3 ! Vous n’avez pas besoin de migrer vos recharges mobiles et internet existantes pour commencer à utiliser les cartes cadeaux sur v3. C’est une façon peu risquée de tester v3 tout en maintenant vos opérations critiques sur v2. Utilisez votre clé sandbox pour tester, puis passez en production quand vous êtes prêt.
Ordre de migration suggéré :
Phase 1 : Intégrer les cartes cadeaux sur v3 (si applicable)
Générez une clé sandbox pour les tests
Utilisez les endpoints /v3/gift-cards/* en sandbox
Testez soigneusement, puis utilisez la clé de production
Maintenez mobile/internet sur v2
Phase 2 : Migrer les endpoints de compte et de validation
/v3/validate
/v3/account/balance
/v3/account/transactions
Phase 3 : Migrer les recharges mobiles progressivement
Testez d’abord avec des opérations à faible volume
Surveillez les problèmes
Augmentez progressivement la migration
Phase 4 : Migrer les recharges internet
Complétez avant la date limite de dépréciation
Cette approche vous permet de migrer à votre rythme jusqu’à la date de dépréciation tout en profitant des nouvelles fonctionnalités v3.
Ce qu’il faut modifier : Renommez l’en-tête de authorization à X-Access-Token
Nouvelle gestion des clés : v3 vous permet de générer une clé API sandbox séparée pour les tests depuis les paramètres de votre tableau de bord. Vous pouvez également ajouter des restrictions de liste blanche d’IP pour une sécurité renforcée. Votre clé API de production existante fonctionne avec les endpoints v2 et v3.
✅ Bonus : Utilisez result.requestId pour le débogage
✅ Bonus : Utilisez result.meta.timestamp pour les informations de timing
Changement majeur : En v3, vous devez toujours vérifier le booléen success avant
d’accéder aux données. L’accès direct aux champs causera des erreurs si la requête a échoué.
JavaScript
PHP
Python
// Code v3 mis à jour :const response = await fetch("https://api.oneclickdz.com/v3/account/balance", { headers: { "X-Access-Token": API_KEY },});const result = await response.json();if (result.success) { console.log("Balance:", result.data.balance); console.log("Request ID:", result.requestId); // Pour le débogage console.log("Timestamp:", result.meta.timestamp);} else { console.error("Error:", result.error.message);}
❌ Supprimer : La vérification de la chaîne result.error
✅ Ajouter : Vérifiez result.success === false
✅ Ajouter : Accédez à result.error.code et result.error.message
✅ Ajouter : Gérez les différents codes d’erreur avec des switch/if
✅ Ajouter : Journalisez result.requestId pour les tickets de support
Conseil pro : Sauvegardez toujours le requestId lors de la journalisation des erreurs. Notre équipe de support en a besoin pour tracer les problèmes dans notre système.
JavaScript
PHP
Python
// Code v3 mis à jour :const response = await fetch("https://api.oneclickdz.com/v3/mobile/send", { method: "POST", headers: { "Content-Type": "application/json", "X-Access-Token": API_KEY, }, body: JSON.stringify(data),});const result = await response.json();if (!result.success) { console.error(`Error [${result.error.code}]: ${result.error.message}`); console.log("Request ID:", result.requestId); switch (result.error.code) { case "INSUFFICIENT_BALANCE": alert("Veuillez recharger votre compte"); break; case "ERR_PHONE": alert(`Numéro de téléphone invalide : ${result.error.message}`); break; case "DUPLICATED_REF": alert("Cette référence de commande a déjà été utilisée"); break; default: alert("Une erreur s'est produite. Veuillez réessayer."); }}
// Code v3 mis à jour :$ch = curl_init('https://api.oneclickdz.com/v3/mobile/send');curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'X-Access-Token: ' . $apiKey]);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);$result = json_decode($response, true);if (!$result['success']) { $errorCode = $result['error']['code']; $errorMessage = $result['error']['message']; error_log("Error [{$errorCode}]: {$errorMessage}"); error_log("Request ID: " . $result['requestId']); switch ($errorCode) { case 'INSUFFICIENT_BALANCE': echo "Veuillez recharger votre compte\n"; break; case 'ERR_PHONE': echo "Numéro de téléphone invalide : {$errorMessage}\n"; break; case 'DUPLICATED_REF': echo "Cette référence de commande a déjà été utilisée\n"; break; default: echo "Une erreur s'est produite. Veuillez réessayer\n"; }}
# Code v3 mis à jour :response = requests.post( 'https://api.oneclickdz.com/v3/mobile/send', headers={ 'Content-Type': 'application/json', 'X-Access-Token': API_KEY }, json=data)result = response.json()if not result['success']: error_code = result['error']['code'] error_message = result['error']['message'] print(f"Error [{error_code}]: {error_message}") print(f"Request ID: {result['requestId']}") if error_code == 'INSUFFICIENT_BALANCE': print("Veuillez recharger votre compte") elif error_code == 'ERR_PHONE': print(f"Numéro de téléphone invalide : {error_message}") elif error_code == 'DUPLICATED_REF': print("Cette référence de commande a déjà été utilisée") else: print("Une erreur s'est produite. Veuillez réessayer.")
Ajouter la vérification de succès : if (result.success)
Accéder via data : data.topupId → result.data.topupId
Ajouter une gestion complète des erreurs
Important : Gérez toujours les erreurs lors de l’envoi de recharges. Les problèmes réseau, le solde insuffisant ou des données invalides peuvent causer des échecs. Sauvegardez le requestId pour le suivi.
Gérer les nouveaux champs d’information sur le remboursement
Nouvelle fonctionnalité : v3 inclut des informations détaillées sur les remboursements avec des offres alternatives suggérées quand une recharge est remboursée.
Étape 3 - Votre nouveau code v3 :
JavaScript
PHP
Python
const response = await fetch( "https://api.oneclickdz.com/v3/mobile/check-ref/order-123", { headers: { "X-Access-Token": API_KEY }, });const result = await response.json();if (result.success) { console.log("Statut:", result.data.status); console.log("Téléphone:", result.data.MSSIDN); // Nouveau en v3 : informations de remboursement améliorées if (result.data.status === "REFUNDED") { console.log("❌ La recharge a été remboursée"); console.log("Raison:", result.data.refund_message); if (result.data.suggested_offers) { console.log("💡 Essayez ces offres à la place :"); console.log(result.data.suggested_offers); } } else if (result.data.status === "FULFILLED") { console.log("✅ Recharge complétée avec succès"); }}
$ch = curl_init('https://api.oneclickdz.com/v3/mobile/check-ref/order-123');curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: ' . $apiKey]);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);$result = json_decode($response, true);if ($result['success']) { echo "Statut: " . $result['data']['status'] . "\n"; echo "Téléphone: " . $result['data']['MSSIDN'] . "\n"; // Nouveau en v3 : informations de remboursement améliorées if ($result['data']['status'] === 'REFUNDED') { echo "❌ La recharge a été remboursée\n"; echo "Raison: " . $result['data']['refund_message'] . "\n"; if (isset($result['data']['suggested_offers'])) { echo "💡 Essayez ces offres à la place :\n"; print_r($result['data']['suggested_offers']); } } elseif ($result['data']['status'] === 'FULFILLED') { echo "✅ Recharge complétée avec succès\n"; }}
response = requests.get( 'https://api.oneclickdz.com/v3/mobile/check-ref/order-123', headers={'X-Access-Token': API_KEY})result = response.json()if result['success']: print(f"Statut: {result['data']['status']}") print(f"Téléphone: {result['data']['MSSIDN']}") # Nouveau en v3 : informations de remboursement améliorées if result['data']['status'] == 'REFUNDED': print("❌ La recharge a été remboursée") print(f"Raison: {result['data']['refund_message']}") if 'suggested_offers' in result['data']: print("💡 Essayez ces offres à la place :") print(result['data']['suggested_offers']) elif result['data']['status'] == 'FULFILLED': print("✅ Recharge complétée avec succès")
Ajouter la vérification de succès : if (result.success)
Accéder aux éléments : data.transactions → result.data.items
Accéder à la pagination : Champs au niveau racine → objet result.data.pagination
Changement cassant : La structure de pagination a été déplacée du niveau racine vers data.pagination. Mettez à jour toute la logique de liste/pagination.
Ajouter la vérification de succès : if (result.success)
Accéder au tableau : Tableau direct → result.data.products
Conception API : v3 utilise des paramètres de requête au lieu de paramètres de chemin pour la sélection du type, facilitant l’ajout de filtres à l’avenir.
Ajouter la gestion de l’encapsuleur de réponse dans la méthode request()
Vérifier result.success et gérer les erreurs
Mettre à jour tous les chemins d’endpoint vers v3
Lever des erreurs structurées avec des codes et des IDs de requête
Bonne pratique : Centralisez la gestion des erreurs dans votre client API. Cela facilite l’ajout de journalisation, de surveillance et de notifications utilisateur.
# Méthode v2 :if result.get('error') == 'NO-BALANCE': # gérer# Méthode v3 :if not result['success'] and result['error']['code'] == 'INSUFFICIENT_BALANCE': print(f"Request ID: {result['requestId']}") if 'currentBalance' in result['error'].get('details', {}): print(f"Solde actuel: {result['error']['details']['currentBalance']}")
Délai critique : Après le 30 octobre 2026, toutes les requêtes API v2 échoueront. Planifiez votre migration en conséquence pour éviter toute interruption de service.
Accès : Connectez-vous à votre tableau de bordGénérer une clé sandbox : Créez une clé sandbox pour des tests sécurisésListe blanche d’IP : Ajoutez des restrictions IP pour une sécurité renforcée
Support
Email : [email protected]Important : Incluez toujours votre ID de requête lors du signalement de problèmes
Support à la migration : Notre équipe est là pour vous aider ! Envoyez-nous un e-mail avec “Support migration API v3” en objet, et incluez : - Les détails de votre implémentation actuelle - Les erreurs spécifiques (avec les IDs de requête) - Des exemples de code illustrant le problème