Skip to content

jamesx00/django-omise

Repository files navigation

django-omise Django + Omise

Test Coverage Status contributions welcome

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


  1. Add "django_omise" to your INSTALLED_APPS setting like this:
    INSTALLED_APPS = [
        ...
        "django_omise",
    ]
  1. Include the django_omise URLconf in your project urls.py like this:
    path("payments/", include("django_omise.urls")),
  1. 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

# Optional. The default payment method is credit/debit card only.
# You must specify additional payment methods.
OMISE_PAYMENT_METHODS = [
    "card",
    "internet_banking", # Internet Banking
    "truemoney_wallet", # TrueMoney Wallet
    "promptpay", # Promptpay
    "rabbit_linepay", # Rabbit LINE Pay
]
  1. Run python manage.py migrate to create the Omise models.

  2. Add Omise endpoint webhook url https://www.your-own-domain.com/payments/webhook/

Basic usage


  1. 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)
  2. 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)
  3. 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
    
    # Your own class-based-view
    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]:
                # Create new order and attach a charge object
                # And handle form data
                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:
        # Do something
    elif charge.status == ChargeStatus.FAILED:
        # Do something else
  4. 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

  • Handle refunds API
  • Handle webhook events and update related objects
  • Create charge with Sources
    • Internet banking
    • TrueMoney Wallet
    • Promptpay
    • Rabbit LINE Pay
    • Installment
  • Schedule
    • Scheduled Charges
    • Scheduled Transfer

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