Retour aux SDKs
Py

Python SDK

v1.0.0

SDK officiel pour Python 3.10+ avec support asyncio et httpx

GitHub

Installation

pip install simiz

Ou avec poetry: poetry add simiz

Configuration

import os
from simiz import Simiz

# Créer une instance du client
client = Simiz(os.environ['SIMIZ_SECRET_KEY'])

# Ou avec des options
client = Simiz(
    os.environ['SIMIZ_SECRET_KEY'],
    api_version='2024-01',
    timeout=30,
    max_retries=3,
)

Utilisation

Créer une transaction

from simiz import Simiz

client = Simiz('smz_live_xxx')

transaction = client.transactions.create(
    amount=5000,
    currency='XAF',
    payment_method='ORANGE_MONEY',
    payer={
        'phone': '+237690000000',
        'name': 'John Doe',
        'email': 'john@example.com',
    },
    description='Achat sur Ma Boutique',
    reference='ORDER-123',
    metadata={
        'order_id': '123',
        'customer_id': 'cust_456',
    },
    callback_url='https://votre-site.com/webhooks/simiz',
    return_url='https://votre-site.com/payment/success',
)

print(transaction['id'])  # txn_xxx
print(transaction['status'])  # PENDING
print(transaction['paymentUrl'])  # URL de paiement

Récupérer une transaction

transaction = client.transactions.retrieve('txn_xxx')

if transaction['status'] == 'COMPLETED':
    print('Paiement réussi!')

Lister les transactions

# Avec pagination
transactions = client.transactions.list(
    limit=20,
    status='COMPLETED',
)

for tx in transactions['data']:
    print(f"{tx['id']} - {tx['amount']}")

# Pagination automatique
for tx in client.transactions.auto_paging_iter():
    print(tx['id'])

Support Asyncio

Le SDK supporte nativement asyncio pour les applications haute performance.

import asyncio
from simiz import AsyncSimiz

async def create_payment():
    client = AsyncSimiz(api_key='sk_xxx')

    transaction = await client.transactions.create(
        amount=5000,
        currency='XAF',
        payment_method='ORANGE_MONEY',
        payer={'phone': '237690000000'},
    )

    return transaction

# Exécuter
transaction = asyncio.run(create_payment())

Intégration Django

Configuration (settings.py)

# settings.py
SIMIZ_SECRET_KEY = os.environ.get('SIMIZ_SECRET_KEY')
SIMIZ_WEBHOOK_SECRET = os.environ.get('SIMIZ_WEBHOOK_SECRET')

Vue de paiement

# views.py
from django.http import JsonResponse
from django.views import View
from django.conf import settings
import simiz

simiz.api_key = settings.SIMIZ_SECRET_KEY

class CheckoutView(View):
    def post(self, request):
        import json
        data = json.loads(request.body)

        transaction = simiz.Transaction.create(
            amount=data['amount'],
            currency='XAF',
            payment_method='ORANGE_MONEY',
            payer={'phone': data['phone']},
            callback_url=request.build_absolute_uri('/webhooks/simiz/'),
            return_url=request.build_absolute_uri('/success/'),
        )

        return JsonResponse({
            'transaction_id': transaction.id,
            'payment_url': transaction.payment_url,
        })

Webhooks

# views.py
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
import simiz
import json

@csrf_exempt
def webhook_handler(request):
    payload = request.body
    signature = request.headers.get('X-Simiz-Signature')

    try:
        event = simiz.Webhook.construct_event(
            payload,
            signature,
            settings.SIMIZ_WEBHOOK_SECRET
        )
    except simiz.error.SignatureVerificationError:
        return HttpResponse('Invalid signature', status=400)

    if event.type == 'transaction.completed':
        transaction = event.data
        # Mettre à jour la commande
        Order.objects.filter(
            payment_id=transaction.id
        ).update(status='paid')

    elif event.type == 'transaction.failed':
        # Gérer l'échec
        pass

    return HttpResponse('OK', status=200)

Gestion des erreurs

import simiz
from simiz.error import (
    AuthenticationError,
    InvalidRequestError,
    APIError,
    SimizError,
)

try:
    transaction = simiz.Transaction.create(...)
except AuthenticationError:
    # Clé API invalide
    print('Vérifiez votre clé API')
except InvalidRequestError as e:
    # Paramètres invalides
    print(f'Erreur: {e.user_message}')
    print(f'Paramètre: {e.param}')
except APIError as e:
    # Erreur serveur
    print(f'Erreur API: {e}')
except SimizError as e:
    # Autre erreur
    print(f'Erreur: {e}')