/django-mooch

Reusable interfaces to a few payment providers

Primary LanguagePythonMIT LicenseMIT

mooch - Simple payment

Steps

  1. Install django-mooch using pip and add mooch to your INSTALLED_APPS.

  2. Add a moochers app:

    from collections import OrderedDict
    
    from django.conf import settings
    from django.conf.urls import include, url
    
    from mooch.banktransfer import BankTransferMoocher
    from mooch.postfinance import PostFinanceMoocher
    from mooch.stripe import StripeMoocher
    
    from myapp.models import Thing  # Inherit mooch.models.Payment
    
    
    app_name = 'mooch'  # This is the app namespace.
    
    moochers = OrderedDict((
        ('postfinance', PostFinanceMoocher(
            model=Thing,
            pspid='thing',
            live=False,
            sha1_in=settings.POSTFINANCE_SHA1_IN,
            sha1_out=settings.POSTFINANCE_SHA1_OUT,
            app_name=app_name,
        )),
        ('stripe', StripeMoocher(
            model=Thing,
            publishable_key=settings.STRIPE_PUBLISHABLE_KEY,
            secret_key=settings.STRIPE_SECRET_KEY,
            app_name=app_name,
        )),
        ('banktransfer', BankTransferMoocher(
            model=Thing,
            autocharge=True,  # Mark all payments as successful.
            app_name=app_name,
        )),
    ]
    
    urlpatterns = [
        url(r'', moocher.urls) for moocher in moochers.values()
    ]
    
  3. Include the moochers app / URLconf somewhere in your other URLconfs.

  4. Add a payment page:

    def pay(request, id):
        instance = get_object_or_404(Thing.objects.all(), id=id)
    
        return render(request, 'pay.html', {
            'thing': instance,
            'moochers': [
                moocher.payment_form(request, instance)
                for moocher in moochers.values()
            ],
        })
    
  5. Maybe send a confirmation mail when charges happen (an example template for this is actually included with the project). Please note that contrary to most other projects, django-mooch uses the moocher instance as sender, not the class:

    from mooch.mail import render_to_mail
    from mooch.signals import post_charge
    
    # The signal handler receives the moocher instance, the payment and
    # the request.
    def send_mail(sender, payment, request, **kwargs):
        render_to_mail('mooch/thanks_mail', {
            'payment': payment,
        }, to=[payment.email]).send(fail_silently=True)
    
    # Connect the signal to our moocher instances (moochers may be used
    more than once on the same website):
    for moocher in moochers.values():
        post_charge.connect(send_mail, sender=moocher)
    

    If you want to differentiate between moochers (for example to send a different mail for bank transfers, because the payment has not actually happened yet) set the sender argument when connecting as follows:

    # Some stuff you'll have to imagine... sorry.
    post_charge.connect(thank_you_mail, moochers['postfinance'])
    post_charge.connect(thank_you_mail, moochers['stripe'])
    post_charge.connect(please_pay_mail, moochers['banktransfer'])