Installation

  1. Install web-payments-connector

    $ pip install web-payments-connector
    
  2. Create a Payment model by subclassing web_payments.logic.BasicPayment:

    from decimal import Decimal
    
    from web_payments import PurchasedItem
    from web_payments.logic import BasicPayment
    
    class Payment(BasicPayment):
    
        def get_failure_url(self):
            # required
            return 'http://example.com/failure/'
    
        def get_success_url(self):
            # required
            return 'http://example.com/success/'
    
        def get_process_url(self):
            # required, bank facing url
            return 'http://example.com/process/<token>'
    
        def get_billing_address(self):
            # required, see testcommon, django
            return {
                    "email": "example@example.com",
                    "first_name": "John",
                    "last_name": "Smith",
                    "address_1": "JohnStreet 23",
                    "address_2": "",
                    "city": "Neches",
                    "postcode": "75779",
                    "country_code": 'US',
                    "country_area": "Tennessee"
                }
    
        def get_shipping_address(self):
            # required, see testcommon, django
            return self.get_billing_address()
    
        @classmethod
        def list_providers(cls, **kwargs):
            # required, see testcommon, django
            return [ProviderVariant("<pythonpath to provider>", {"capture": True}, {"extra_stuff": None, "name": "MyBackend"}),]
    
        def get_provider_variant(self):
            # required, see testcommon, django
            return ProviderVariant("<pythonpath to provider>", {"capture": True}, {"extra_stuff": None, "name": "MyBackend"})
    
        def get_payment_extra(self):
            # optional
            return {
                    "tax": Decimal("0"),
                    "delivery": Decimal("0")
                }
    
        def get_purchased_items(self):
            # optional, see testcommon
            yield PurchasedItem(name='The Hound of the Baskervilles', sku='BSKV',
                                quantity=9, price=Decimal(10), currency='USD')
    

The get_purchased_items() method should return an iterable yielding instances of web_payments.PurchasedItem.

  1. Write a view that will handle the payment. You can obtain a form instance by passing POST data to payment.get_form():

    # mypaymentapp/views.py
    ...
    from web_payments import RedirectNeeded
    
    def func(payment):
        try:
            form = payment.get_form(data=request.POST or None)
        except RedirectNeeded as redirect_to:
            return redirect(redirect_to.args[0])
        return render(request, 'payment.html',
                                {'form': form, 'payment': payment})
    

    Note

    Please note that Payment.get_form() may raise a RedirectNeeded exception.

  2. Create a form template

    <!-- templates/payment.html -->
    <form action="" method="POST">
        {% for field in form %}
            {{ field.label }} <!-- optional -->
            {{ field }}
            <!-- the next step is optional -->
            {% for error in field.errors %}
                <ul>
                    <li>{{ error }}</li>
                </ul>
            {% endfor %}
        {% endfor %}
        <p><input type="submit" value="Proceed" /></p>
    </form>