An extension on top of django-oscar-api providing a more flexible checkout API with a pluggable payment methods interface.
-
Install django-oscar-api
using the documentation <https://django-oscar-api.readthedocs.io/en/latest/#installation>
_.
-
Install the django-oscar-api-checkout
package.::
$ pip install django-oscar-api-checkout
-
Add oscarapicheckout
to your INSTALLED_APPS
::
myproject/settings.py
...
INSTALLED_APPS = [
...
'oscarapicheckout',
] + get_core_apps([])
...
-
Configure Oscar's order status pipeline.::
myproject/settings.py
...
Needed by oscarapicheckout
ORDER_STATUS_PENDING = 'Pending'
ORDER_STATUS_PAYMENT_DECLINED = 'Payment Declined'
ORDER_STATUS_AUTHORIZED = 'Authorized'
Other statuses
ORDER_STATUS_SHIPPED = 'Shipped'
ORDER_STATUS_CANCELED = 'Canceled'
Pipeline Config
OSCAR_INITIAL_ORDER_STATUS = ORDER_STATUS_PENDING
OSCARAPI_INITIAL_ORDER_STATUS = ORDER_STATUS_PENDING
OSCAR_ORDER_STATUS_PIPELINE = {
ORDER_STATUS_PENDING: (ORDER_STATUS_PAYMENT_DECLINED, ORDER_STATUS_AUTHORIZED, ORDER_STATUS_CANCELED),
ORDER_STATUS_PAYMENT_DECLINED: (ORDER_STATUS_AUTHORIZED, ORDER_STATUS_CANCELED),
ORDER_STATUS_AUTHORIZED: (ORDER_STATUS_SHIPPED, ORDER_STATUS_CANCELED),
ORDER_STATUS_SHIPPED: (),
ORDER_STATUS_CANCELED: (),
}
OSCAR_INITIAL_LINE_STATUS = ORDER_STATUS_PENDING
OSCAR_LINE_STATUS_PIPELINE = {
ORDER_STATUS_PENDING: (ORDER_STATUS_SHIPPED, ORDER_STATUS_CANCELED),
ORDER_STATUS_SHIPPED: (),
ORDER_STATUS_CANCELED: (),
}
-
Configure what payment methods are enabled and who can use them.::
myproject/settings.py
...
API_ENABLED_PAYMENT_METHODS = [
{
'method': 'oscarapicheckout.methods.Cash',
'permission': 'oscarapicheckout.permissions.StaffOnly',
},
{
'method': 'some.other.methods.CreditCard',
'permission': 'oscarapicheckout.permissions.Public',
},
]
-
Add oscarapicheckout
to your root URL configuration directly before oscarapi.::
myproject/urls.py
...
from django.apps import apps
from oscarapi.app import application as oscar_api
from oscarapicheckout.app import application as oscar_api_checkout
urlpatterns = patterns('',
...
url(r'^api/', include(apps.get_app_config("oscarapicheckout").urls[0])), # Must be before oscar_api.urls
url(r'^api/', include(oscar_api.urls)),
...
)
These are the basic steps to add an item to the basket and checkout using the API.
-
Add an item to the basket.::
POST /api/basket/add-product/
{
"url": "/api/products/1/",
"quantity": 1
}
-
List the payment methods available to the current user.::
GET /api/checkout/payment-methods/
-
Submit the order, specifying which payment method(s) to use.::
POST /api/checkout/
{
"guest_email": "joe@example.com",
"basket": "/api/baskets/1/",
"shipping_address": {
"first_name": "Joe",
"last_name": "Schmoe",
"line1": "234 5th Ave",
"line4": "Manhattan",
"postcode": "10001",
"state": "NY",
"country": "/api/countries/US/",
"phone_number": "+1 (717) 467-1111",
},
"billing_address": {
"first_name": "Joe",
"last_name": "Schmoe",
"line1": "234 5th Ave",
"line4": "Manhattan",
"postcode": "10001",
"state": "NY",
"country": "/api/countries/US/",
"phone_number": "+1 (717) 467-1111",
},
"payment": {
"cash": {
"enabled": true,
"amount": "10.00",
},
"creditcard": {
"enabled": true,
"pay_balance": true,
}
}
}
-
Check the status of each enabled payment option.::
GET /api/checkout/payment-states/