Migrer de Stripe ou Paystack vers Simiz : Guide complet
Vous utilisez actuellement Stripe ou Paystack et vous souhaitez migrer vers Simiz pour accepter les paiements Mobile Money en Afrique ? Ce guide complet vous accompagne pas à pas dans votre transition.
Pourquoi migrer vers Simiz ?
Limitations de Stripe et Paystack en Afrique
| Critère | Stripe | Paystack | Simiz |
|---|
| Couverture Mobile Money | Limitée | Ghana uniquement | 4 providers (6 pays) |
|---|---|---|---|
| Afrique Centrale/Ouest | Non supporté | Non supporté | Spécialiste |
| Documentation en français | Non | Non | Oui |
| Support local | International | Nigeria | Local |
Avantages de Simiz
- Spécialisation Mobile Money - Focus sur le marché africain
- Multi-pays - Cameroun, Sénégal, CI, Bénin, Togo, Mali
- Multi-providers - Orange Money, MTN MoMo, Wave, Moov Money
- Documentation en français - Accessible aux équipes francophones
- Support local - Connaissance du marché
- Tarifs compétitifs - 1.5% - 2%
Préparation de la migration
1. Analyse de votre intégration actuelle
#### Stripe
Identifiez les fonctionnalités utilisées :
// Exemple de code Stripe existant
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
// Création de paiement
const paymentIntent = await stripe.paymentIntents.create({
amount: 5000,
currency: 'XAF',
payment_method_types: ['card'],
metadata: {
order_id: 'ORDER-123'
}
});
// Webhook handling
const event = stripe.webhooks.constructEvent(
payload,
sig,
endpointSecret
);
#### Paystack
Identifiez les fonctionnalités utilisées :
// Exemple de code Paystack existant
const paystack = require('paystack')(process.env.PAYSTACK_SECRET_KEY);
// Initialisation de paiement
const response = await paystack.transaction.initialize({
reference: 'TX-12345',
amount: 500000,
email: 'customer@example.com',
currency: 'GHS'
});
// Webhook handling
// Vérifier la signature et traiter l'événement
2. Mapping des fonctionnalités
| Fonctionnalité | Stripe | Paystack | Simiz |
|---|
| Créer un paiement | paymentIntents.create() | transaction.initialize() | payments.create() |
|---|---|---|---|
| Récupérer un paiement | paymentIntents.retrieve() | transaction.verify() | payments.retrieve() |
| Webhooks | webhooks.constructEvent() | Vérification manuelle | webhooks.verify() |
| Remboursement | refunds.create() | refund() | refunds.create() |
| Abonnement | Subscriptions API | Subscriptions API | Subscriptions API |
| Payouts | Transfers API | Transfer API | payouts.create() |
Plan de migration
Phase 1 : Configuration (1 semaine)
- Création du compte Simiz
- Vérification KYB
- Activation des providers souhaités
- Obtention des clés API
- Configuration de l'environnement
Variables d'environnement
SIMIZ_API_KEY=smz_test_pk_xxxxx
SIMIZ_SECRET_KEY=smz_test_sk_xxxxx
SIMIZ_WEBHOOK_SECRET=whsec_xxxxx
Phase 2 : Intégration Sandbox (1-2 semaines)
- Installation du SDK
Node.js
bun add @simiz/sdk
PHP
composer require simiz/simiz-php
Python
pip install simiz
- Tests de base
import { Simiz } from '@simiz/sdk';
const simiz = new Simiz({
apiKey: process.env.SIMIZ_API_KEY,
secretKey: process.env.SIMIZ_SECRET_KEY,
sandbox: true
});
// Test création de paiement
const payment = await simiz.payments.create({
amount: 100,
currency: 'XAF',
phone: '+237690000001', // Numéro de test
provider: 'orange_money',
description: 'Test migration'
});
console.log('Paiement créé:', payment.id);
Phase 3 : Migration du code (2-3 semaines)
#### Migration depuis Stripe
Avant (Stripe) :const paymentIntent = await stripe.paymentIntents.create({
amount: 5000,
currency: 'XAF',
payment_method_types: ['card'],
metadata: {
order_id: 'ORDER-123',
customer_id: 'CUST-001'
},
description: 'Achat sur MonSite.com'
});
Après (Simiz) :
const payment = await simiz.payments.create({
amount: 5000,
currency: 'XAF',
phone: '+237691234567',
provider: 'orange_money',
country: 'CM',
reference: 'ORDER-123',
description: 'Achat sur MonSite.com',
callbackUrl: 'https://monsite.com/webhooks/simiz',
metadata: {
customerId: 'CUST-001'
}
});
#### Migration depuis Paystack
Avant (Paystack) :const response = await paystack.transaction.initialize({
reference: 'TX-12345',
amount: 500000,
email: 'customer@example.com',
currency: 'GHS',
callback_url: 'https://monsite.com/callback',
metadata: {
order_id: 'ORDER-123'
}
});
Après (Simiz) :
const payment = await simiz.payments.create({
amount: 5000,
currency: 'XOF',
phone: '+2250700123456',
provider: 'orange_money',
country: 'CI',
reference: 'TX-12345',
callbackUrl: 'https://monsite.com/webhooks/simiz',
metadata: {
order_id: 'ORDER-123'
}
});
Phase 4 : Migration des webhooks (1 semaine)
#### Webhook Stripe vers Simiz
Stripe :app.post('/webhooks/stripe', async (req, res) => {
const sig = req.headers['stripe-signature'];
const event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
switch (event.type) {
case 'payment_intent.succeeded':
await handleSuccess(event.data.object);
break;
case 'payment_intent.payment_failed':
await handleFailure(event.data.object);
break;
}
res.json({ received: true });
});
Simiz :
app.post('/webhooks/simiz', async (req, res) => {
const signature = req.headers['x-simiz-signature'];
const isValid = simiz.webhooks.verify(req.body, signature);
if (!isValid) {
return res.status(401).json({ error: 'Invalid signature' });
}
const event = req.body;
switch (event.type) {
case 'payment.success':
await handleSuccess(event.data);
break;
case 'payment.failed':
await handleFailure(event.data);
break;
}
res.json({ received: true });
});
Phase 5 : Tests complets (1 semaine)
- Tests unitaires
- Tests d'intégration
- Tests de charge
- Tests de sécurité
Phase 6 : Go-live (1 semaine)
- Basculer vers les clés production
- Monitoring intensif
- Support dédié
Mapping des événements
Stripe → Simiz
| Événement Stripe | Événement Simiz |
|---|
payment_intent.succeeded | payment.success |
|---|---|
payment_intent.payment_failed | payment.failed |
payment_intent.canceled | payment.cancelled |
charge.refunded | refund.succeeded |
Paystack → Simiz
| Événement Paystack | Événement Simiz |
|---|
charge.success | payment.success |
|---|---|
charge.failed | payment.failed |
transfer.success | payout.succeeded |
transfer.failed | payout.failed |
Gestion des erreurs
Mapping des codes d'erreur
| Stripe/Paystack | Simiz | Action |
|---|
card_declined | insufficient_balance | Informer le client |
|---|---|---|
expired_card | account_inactive | Demander de mettre à jour |
incorrect_cvc | pin_error | Demander de réessayer |
processing_error | service_unavailable | Réessayer plus tard |
Exemple de gestion d'erreurs
async function createPaymentWithMigration(phone, amount, country) {
try {
return await simiz.payments.create({
amount,
currency: country === 'CM' ? 'XAF' : 'XOF',
phone,
provider: detectProvider(phone, country),
country,
description: 'Achat sur MonSite.com'
});
} catch (error) {
// Mapping des erreurs
const errorMap = {
'insufficient_balance': {
message: 'Solde insuffisant. Veuillez recharger votre compte.',
action: 'ask_user_to_topup'
},
'invalid_phone': {
message: 'Numéro de téléphone invalide.',
action: 'ask_user_to_correct'
},
'service_unavailable': {
message: 'Service temporairement indisponible.',
action: 'retry_later'
}
};
const mappedError = errorMap[error.code] || {
message: error.message,
action: 'contact_support'
};
throw new MappedError(mappedError);
}
}
Stratégies de déploiement
Option 1 : Migration progressive
// Déterminer quel provider utiliser
function getPaymentProvider(user) {
// Utiliser Simiz pour les nouveaux utilisateurs
if (user.isNew) {
return 'simiz';
}
// Garder Stripe/Paystack pour les utilisateurs existants (transition)
if (user.country === 'CM' || user.country === 'SN' || user.country === 'CI') {
return 'simiz';
}
// Garder Stripe/Paystack pour les autres pays
return 'stripe';
}
// Routeur de paiement
async function routePayment(user, amount, phone) {
const provider = getPaymentProvider(user);
if (provider === 'simiz') {
return await createSimizPayment(phone, amount, user.country);
} else if (provider === 'stripe') {
return await createStripePayment(amount, user.currency);
} else if (provider === 'paystack') {
return await createPaystackPayment(amount, user.currency);
}
}
Option 2 : Basculer tout Simiz (recommandé pour l'Afrique)
Pour l'Afrique Centrale et de l'Ouest, Simiz est la solution optimale. Basculer entièrement vers Simiz simplifie votre infrastructure.
Monitoring et comparaison
Tableau de bord de migration
| Métrique | Stripe/Paystack | Simiz | Objectif |
|---|
| Taux de succès | 95% | ? | >95% |
|---|---|---|---|
| Temps de réponse | 200ms | ? | <300ms |
| Coût par transaction | 2.9% | 1.8% | - |
| Support | 24h | <24h | - |
Script de monitoring
const migrationMetrics = {
stripe: { success: 0, failed: 0, avgTime: 0 },
simiz: { success: 0, failed: 0, avgTime: 0 }
};
async function trackPayment(provider, startTime, success) {
const duration = Date.now() - startTime;
if (success) {
migrationMetrics[provider].success++;
migrationMetrics[provider].avgTime =
(migrationMetrics[provider].avgTime + duration) / 2;
} else {
migrationMetrics[provider].failed++;
}
// Log pour analyse
console.log('Migration metrics:', JSON.stringify(migrationMetrics, null, 2));
}
Checklist de migration
Avant la migration
- [ ] Analyser l'intégration actuelle
- [ ] Créer un compte Simiz
- [ ] Obtenir les clés API Sandbox
- [ ] Configurer les webhooks de test
- [ ] Installer le SDK Simiz
- [ ] Créer un plan de tests
Pendant la migration
- [ ] Migrer le code de création de paiement
- [ ] Migrer les webhooks
- [ ] Adapter la gestion des erreurs
- [ ] Mettre à jour la documentation
- [ ] Former l'équipe
- [ ] Effectuer des tests complets
Après la migration
- [ ] Basculer vers les clés production
- [ ] Monitorer les transactions
- [ ] Comparer les métriques
- [ ] Optimiser si nécessaire
- [ ] Désactiver l'ancien système (si applicable)
Outils et ressources
Scripts de migration
// Script de test automatisé
async function runMigrationTests() {
const testCases = [
{ phone: '+237690000001', amount: 100, expected: 'success' },
{ phone: '+237690000002', amount: 100000, expected: 'failed' },
{ phone: '+237690000003', amount: 100, expected: 'timeout' }
];
for (const test of testCases) {
try {
const payment = await simiz.payments.create({
amount: test.amount,
currency: 'XAF',
phone: test.phone,
provider: 'orange_money',
country: 'CM'
});
console.log(Test passed for ${test.phone}: ${payment.status});
} catch (error) {
console.log(Test failed for ${test.phone}: ${error.code});
}
}
}
Support et assistance
Simiz propose un support dédié pour les migrations :
- Email : developer@simiz.io
- WhatsApp : +237 6XX XXX XXX
- Documentation : docs.simiz.io
- Appels vidéo : Sur demande
Conclusion
Migrer de Stripe ou Paystack vers Simiz est un processus structuré qui peut être réalisé en 4-6 semaines. Les avantages clés :
- Spécialisation Mobile Money - Meilleure couverture du marché africain
- Tarifs compétitifs - Économie significative sur les transactions
- Support local - Connaissance du marché et réactivité
- Documentation en français - Accessibilité pour les équipes francophones
Besoin d'aide pour votre migration ? Contactez notre équipe dédiée à migration@simiz.io