Skip to main content

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

Project description

PyPI version Python versions License: MIT Status Tests

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.4

  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.5.tar.gz (36.8 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.5-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: dj_shwary-0.1.5.tar.gz
  • Upload date:
  • Size: 36.8 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.5.tar.gz
Algorithm Hash digest
SHA256 e468c6b30c69ab68b2ca40d4d3e018257d374d8a41f2f4e4e5b33c3563bba519
MD5 b195bbbf51b93d34144d6d004815b5a0
BLAKE2b-256 5649aa9c2b4a398b31ec64ee6d3c51881b553492aa82f0d5f2d318d3b27e84cf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dj_shwary-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 20.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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7cbcd3ba6d0616a6220840ea99af8027043143081deee62c13e2315aeab45035
MD5 d95e9f39acb880498e6148e28c649934
BLAKE2b-256 b2873ad27b4412d325c3d6ad128235d3e4c3f22982fb0503fb9e43db2f047448

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