Skip to main content

Intégration Django officielle pour le SDK de paiement Shwary.

Project description

PyPI version Python versions License: MIT Status

dj-shwary

dj-shwary est le wrapper Django ultime pour intégrer les paiements Shwary (RDC, Kenya, Ouganda) avec élégance et sécurité.

Contrairement à une intégration basique, ce package gère tout le cycle de vie des transactions, du premier clic au "Truth Check" final via webhook.

Résumé des changements v0.1.2

  1. Correction Critique (Bug AppRegistryNotReady) : Suppression des imports de modèles Django au niveau global dans init.py pour permettre l'initialisation correcte de Django.
  2. Qualité & Tests (CI Ready) : Mise en place d'une suite de tests complète avec pytest-django. Ajout de 5 tests unitaires couvrant le cycle de vie des transactions (Success, API Failure, Webhook Security, Signals). Configuration du fichier pytest.ini et des réglages de test (tests/settings.py).
  3. Métadonnées PyPI : Ajout des Classifiers officiels (Django 4.2+, Python 3.11+, Production/Stable). Correction des liens de badges dans le README.md.
  4. Extensibilité : Finalisation des Signaux Django (payment_success, payment_failed) pour permettre aux développeurs d'automatiser leurs actions métier.

Fonctionnalités Clés

Pourquoi utiliser ce wrapper plutôt que de coder l'API à la main ?

Fonctionnalité Description
Liaison Générique Liez des transactions à n'importe quel modèle (Order, Subscription, etc.) via GenericForeignKey.
Verify by Reference Sécurité maximale : le webhook ne fait que "réveiller" le serveur, qui vérifie ensuite le statut réel via l'API Shwary.
Signaux Django Découplez votre logique métier (envoi d'email, livraison) grâce aux signaux payment_success, payment_failed.
Admin Dashboard Une interface prête à l'emploi avec badges de couleur, liens vers les objets liés et mise à jour manuelle.
Rattrapage Auto Commande manage.py pour synchroniser les transactions restées en attente (Cron job).
Template Tags Affichez des badges de statut stylisés et des boutons de paiement en une ligne de HTML.

Installation

Avec uv (recommandé)

uv add dj_shwary

avec pip

pip install dj_shwary

Configuration

  1. Ajoutez l'application à votre settings.py :
INSTALLED_APPS = [
    ...,
    'django.contrib.contenttypes', # Requis
    'django.contrib.sites',        # Requis pour les URLs absolues
    ...,
    'dj_shwary',
]

SITE_ID = 1
  1. Ajoutez vos identifiants dans settings.py :
SHWARY = {
    'MERCHANT_ID': 'votre_merchant_id',
    'MERCHANT_KEY': 'votre_merchant_key',
    'SANDBOX': True,  # False en production
    'TIMEOUT': 30.0,  # Timeout en secondes pour les requêtes API
}

# Optionnel : recommandé si vous n'utilisez pas le framework Sites 
# ou pour le développement local avec Ngrok
SITE_BASE_URL = "https://votre-domaine.com"
  1. Configurez l'URL du Webhook :
# urls.py
from django.urls import path, include

urlpatterns = [
    path('shwary/', include('dj_shwary.urls')), # Inclut la vue webhook
]

Utilisation

Initialiser un paiement

Dans votre vue, utilisez le ShwaryService. Il s'occupe de créer la transaction en base et d'appeler l'API.

from dj_shwary.services import ShwaryService

def checkout_view(request, order_id):
    order = Order.objects.get(id=order_id)
    service = ShwaryService()

    transaction = service.make_payment(
        related_object=order,
        amount=order.total_amount,
        phone_number="+243...",
        country="DRC"
    )
    
    return render(request, 'payment_pending.html', {'txn': transaction})

Réagir au succès (Signaux)

Ne polluez pas vos vues. Écoutez simplement le signal quand le paiement est validé.

from django.dispatch import receiver
from dj_shwary.signals import payment_success

@receiver(payment_success)
def handle_order_validation(sender, transaction, **kwargs):
    # 'transaction.content_object' est votre instance de Order !
    order = transaction.content_object
    order.mark_as_paid()
    order.save()

Frontend (Template Tags)

Affichez un badge de statut élégant dans vos templates :

{% load shwary_tags %}

<p>Statut de la commande : {{ transaction|shwary_badge }}</p>

Maintenance & Fiabilité

Interface Admin

Le dashboard admin permet de voir en un coup d'œil les transactions échouées et de forcer une mise à jour via l'action "Mettre à jour le statut depuis l'API Shwary".

Commande de rattrapage

Si un webhook est perdu à cause d'une coupure réseau, lancez cette commande via un Cron job toutes les 10 minutes :

python manage.py check_pending_pay --older-than 5

Contribution

Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une Issue ou une Pull Request sur le dépôt GitHub.

Distribué sous la licence MIT. Voir License: MIT pour plus d'informations.

FAQ & Troubleshooting

  1. Pourquoi mon Webhook renvoie-t-il une erreur 404 ?

Vérifiez deux points :

Avez-vous bien inclus path('shwary/', include('dj_shwary.urls')) dans votre fichier urls.py principal ?

Si vous testez en local, l'API Shwary ne peut pas voir votre localhost. Vous devez utiliser un tunnel comme Ngrok ou Cloudflare Tunnel et configurer SITE_BASE_URL avec l'URL fournie par le tunnel.
  1. Le Webhook renvoie une erreur 403 (CSRF Forbidden)

C'est normal si vous essayez de le tester manuellement. Cependant, la vue ShwaryWebhookView est déjà protégée par le décorateur @csrf_exempt. Si l'erreur persiste, vérifiez que votre proxy inverse (Nginx/Apache) ne bloque pas les requêtes POST entrantes.

  1. Comment accéder à ma commande depuis une transaction ?

Grâce au système de GenericForeignKey, c'est très simple :

# Dans un signal ou une vue :
mon_objet = transaction.content_object 

# S'il s'agit d'une commande :
print(mon_objet.order_number)
  1. Erreur "Site matching query does not exist"

Si vous n'utilisez pas SITE_BASE_URL, le wrapper tente d'utiliser le framework sites de Django. Assurez-vous d'avoir défini SITE_ID = 1 dans vos settings.py et que le domaine est correctement configuré dans l'interface d'administration Django.

  1. Puis-je utiliser Shwary en mode test ?

Oui. Assurez-vous que dans le dictionnaire SHWARY dans le settings, la clé SANDBOX soit True dans vos réglages. Le wrapper utilisera alors les endpoints de test de Shwary et marquera les transactions comme étant en mode sandbox dans l'admin.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dj_shwary-0.1.2.tar.gz (40.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dj_shwary-0.1.2-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file dj_shwary-0.1.2.tar.gz.

File metadata

  • Download URL: dj_shwary-0.1.2.tar.gz
  • Upload date:
  • Size: 40.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for dj_shwary-0.1.2.tar.gz
Algorithm Hash digest
SHA256 fb4270b8d867e1e418c2bdfb39a1c743cbcc179e6d1c29b0db39d7e1f6ef9f64
MD5 99d8565b54db9fa0aa00a0b1a57905a5
BLAKE2b-256 75a9df4d0c178794852424304476d7dfa7ec9a447fba93a142db0f1de987e0a2

See more details on using hashes here.

File details

Details for the file dj_shwary-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: dj_shwary-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for dj_shwary-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 4e6aa587fdd2bcc1764a5870c7469870dde555dafa1390bca753594ba5c632c2
MD5 34c357e8dabb711c2c8cb755a3e842ac
BLAKE2b-256 4ba5beb801f562ac290788b2b50146d30455cd916fd92789e22c6b057e2aa2ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page