Creating payment plugins

In order to create a plugin for a payment broker, first you need to write a subclass of BaseProcessor named PaymentProcessor and place it in processor.py in your app.

The only method you have to provide is prepare_transaction() that needs to return a HttpResponse subclass (eg. HttpResponseRedirect or TemplateResponse). The use of all other methods depends directly on how the paywall operates.

To make your plugin available for the rest of the framework, you need to register it. The most convenient way to do so is apps.py:

from django.apps import AppConfig

class MyPluginAppConfig(AppConfig):
    name = "getpaid_myplugin"
    verbose_name = "Some payment broker"

    def ready(self):
        from getpaid.registry import registry

        registry.register(self.module)

This way your plugin will be automatically registered after adding it to INSTALLED_APPS.

Detailed API

class getpaid.processor.BaseProcessor(payment: django.db.models.base.Model)
production_url = None

Base URL of production environment.

sandbox_url = None

Base URL of sandbox environment.

display_name = None

The name of the provider for the choices.

accepted_currencies = None

List of accepted currency codes (ISO 4217).

logo_url = None

Logo URL - can be used in templates.

ok_statuses = [200]

List of potentially successful HTTP status codes returned by paywall when creating payment

slug = None

For friendly urls

static get_our_baseurl(request: Optional[django.http.request.HttpRequest] = None, **kwargs)str

Little helper function to get base url for our site. Note that this way ‘https’ is enforced on production environment.

prepare_form_data(post_data: dict, **kwargs)Mapping[str, Any]

If backend support several modes of operation, POST should probably additionally calculate some sort of signature based on passed data.

get_form(post_data: dict, **kwargs)django.forms.forms.BaseForm

(Optional) Used to get POST form for backends that use such flow.

abstract prepare_transaction(request: django.http.request.HttpRequest, view: Optional[django.views.generic.base.View] = None, **kwargs)django.http.response.HttpResponse

Prepare Response for the view asking to prepare transaction.

Returns

HttpResponse instance

handle_paywall_callback(request: django.http.request.HttpRequest, **kwargs)django.http.response.HttpResponse

This method handles the callback from paywall for the purpose of asynchronously updating the payment status in our system.

Returns

HttpResponse instance that will be presented as answer to the callback.

fetch_payment_status(**kwargs)getpaid.types.PaymentStatusResponse

Logic for checking payment status with paywall.

charge(amount: Optional[Union[decimal.Decimal, float, int]] = None, **kwargs)getpaid.types.ChargeResponse

(Optional) Check if payment can be locked and call processor’s method. This method is used eg. in flows that pre-authorize payment during order placement and charge money later.

release_lock(**kwargs)decimal.Decimal

(Optional) Release locked payment. This can happen if pre-authorized payment cannot be fullfilled (eg. the ordered product is no longer available for some reason). Returns released amount.

start_refund(amount: Optional[Union[decimal.Decimal, float, int]] = None, **kwargs)decimal.Decimal

Refunds the given amount.

Returns the amount that is refunded.

cancel_refund(**kwargs)bool

Cancels started refund.

Returns True/False if the cancel succeeded.