django-omise Django + Omise

Django models for Omise. Currently, we support the following features:
-
Creating a customer
-
Allowing customer to add/delete credit/debit cards
-
Collect payments with new card with the option to keep the card
-
Collect payments with saved cards
-
Collect payments with Internet Banking
-
Collect payments with TrueMoney Wallet
-
Collect payments with Promptpay
-
Collect payments with Rabbit LINE Pay
-
Webhook handler, saving raw data as an Event object and update related objects, currently supporting
- Customer
- Card
- Charge
- Source
- Refund
- Schedule
- Scheduled Charge
- Schedule Occurrence
-
3DS pending charges handling
See the roadmap for the plan of this project. Contributions are welcome!
Quick start
- Add "django_omise" to your INSTALLED_APPS setting like this:
INSTALLED_APPS = [
...
"django_omise",
]
- Include the django_omise URLconf in your project urls.py like this:
path("payments/", include("django_omise.urls")),
- Add Omise keys and operating mode in settings.py:
OMISE_PUBLIC_KEY = xxxx
OMISE_SECRET_KEY = xxxx
OMISE_LIVE_MODE = True | False
OMISE_CHARGE_RETURN_HOST = localhost:8000
OMISE_PAYMENT_METHODS = [
"card",
"internet_banking",
"truemoney_wallet",
"promptpay",
"rabbit_linepay",
]
-
Run python manage.py migrate
to create the Omise models.
-
Add Omise endpoint webhook url https://www.your-own-domain.com/payments/webhook/
Basic usage
-
Create an Omise customer from User:
from django.contrib.auth import get_user_model
from django_omise.models.core import Customer
User = get_user_model()
user = User.objects.first()
customer = Customer.get_or_create(user=user)
-
Add card to Customer
2.1 With the built-in view (Recommended)
We have built a basic card collecting view where logged in users can add and remove their cards. Run Django server and visit /payments/payment_methods/ to see it in action. You could override the template used in the view by creating a new template in your project's directory /templates/django_omise/manage_payment_methods.html.
2.2 Manually
from django_omise.models.core import Customer
from django_omise.omise import omise
omise_token = omise.Token.retrieve(token_id)
Customer.objects.live().first().add_card(token=omise_token)
-
Charge a customer (Currently supporting new/saved cards, Internet Banking, TrueMoney Wallet, Promptpay)
3.1 With the build-in mixin
This package comes with a built-in mixin, with which you can create a class-based-view and write a few methods to charge a customer. See below for an example or see Example 1:
from django.contrib.auth.mixins import LoginRequiredMixin
from django_omise.mixins import CheckoutMixin
from django_omise.models.choices import Currency
class CheckoutView(LoginRequiredMixin, CheckoutMixin):
template_name = "yourapp/template.html"
success_url = ...
def get_charge_details(self):
return {
"amount": 100000,
"currency": Currency.THB,
}
def process_charge_and_form(self, charge, form):
if charge.status in [ChargeStatus.SUCCESSFUL, ChargeStatus.PENDING]:
handle_form_data(form.cleaned_data)
3.2 Manually
from django_omise.models.choices import Currency, ChargeStatus
from django_omise.models.core import Customer
customer = Customer.objects.first()
card = customer.cards.live().first()
charge = customer.charge_with_card(
amount=100000,
currency=Currency.THB,
card=card,
)
if charge.status == ChargeStatus.SUCCESSFUL:
elif charge.status == ChargeStatus.FAILED:
-
Create a charge schedule for a customer:
At the moment, you can create a new schedule for a customer manually by calling the method create_schedule from a Custoemr object. See below for an example:
import datetime
from django_omise.models.choices import Currency
from django_omise.models.core import Customer
customer = Customer.objects.first()
card = customer.default_card
customer.create_schedule(
amount=100000,
currency=Currency.THB,
card=card,
every=1,
period="month",
start_date=datetime.date(year=2022, month=5, day=22),
end_date=datetime.date(year=2032, month=5, day=22),
on={
'days_of_month': [22],
},
description="Monthly subscription",
)
Roadmap and contributions
Here are our immediate plans for this package, and more will be added! All contributions are welcome. I am new to publishing a public package, so if you have any recommendations, please feel free to create an issue on this repository or feel free to send me an email at siwatjames@gmail.com.
Omise Features
Others
- Implement tests
- Add documentations
Development
You can run tests with either coverage or pytest.
To run with pytest
pip install pytest-django
python -m pytest [path_to_file] [--verbose -s --cov-report=html --cov=.]
To run with coverage
pip install coverage
coverage run run_tests.py
coverage report
coverage html