Checkout & payment
To enable basket checkout you need to define a payment method in SALESMAN_PAYMENT_METHODS setting
which accepts a list of dotted paths to salesman.checkout.payment.PaymentMethod classes.
Note
For this example, we assume your custom app is named shop.
1. Create payment method
First create your custom payment method. Payment methods are required to specify a label and
a unique identifier property on class. To enable payment for the basket you should also
override the salesman.checkout.payment.PaymentMethod.basket_payment() method. Eg:
# payment.py
from django.urls import reverse
from salesman.checkout.payment import PaymentMethod
from shop.models import Order
class PayInAdvance(PaymentMethod):
"""
Payment method that requires advance payment via bank account.
"""
identifier = "pay-in-advance"
label = "Pay in advance"
def basket_payment(self, basket, request):
"""
Create a new order and mark it on-hold. Reserve items from stock and await
manual payment from customer via back account. When paid order status should be
changed to `PROCESSING`, `SHIPPED` or `COMPLETED` and a new payment should be
added to order.
"""
order = Order.objects.create_from_basket(basket, request, status="HOLD")
basket.delete()
url = reverse("salesman-order-last") + f"?token={order.token}"
return request.build_absolute_uri(url)
2. Register payment method
Then register your payment method in settings.py:
SALESMAN_PAYMENT_METHODS = [
'shop.payment.PayInAdvance',
]
Now you can make a basket purchase through the POST /checkout/ request
with payment_method set to pay-in-advance.
For more information about payment methods see Payment methods.