Write Django and your store as usual, and let django-spgateway
handle your transactions with Spgateway
- Python 3.7
- Django 2.1
- pycrypto 2.6.1
- We only tested on environment as below
Install using pip or pipenv:
pip install django-spgageway
Alternatively, you can install download or clone this repo and call
pip install -e .
.Add to INSTALLED_APPS in your
settings.py
:'spgateway',
Add settings in your
settings.py
:SPGATEWAY_PROFILE = { 'YOUR_MerchantID': { 'MerchantID': 'YOUR_MerchantID', 'HashKey': 'YOUR_HashKey', 'HashIV': 'YOUR_HashIV', }, } SPGATEWAY_MERCHANTID = 'YOUR_MerchantID' SPGATEWAY_ORDERMODEL = 'yourapp.Order'
Add urlpattern into your
urls.py
:path('spgateway/', include('spgateway.urls')),
for Django 2url(r'^spgateway/', include('spgateway.urls')),
for Django 1Import
from spgateway.models import SpgatewayOrderMixin
and inherit from it with your order model.Run
python manage.py makemigrations
andpython manage.py migrate
as usual.Get form from your order by calling
generate_credit_form
in view:credit_form = order_object.generate_credit_form(request)
And use it in your template:
<form action="{{ credit_form.action }}" method="POST"> {{ credit_form.as_p }} <input type="submit"> </form>
Add
SpgatewaySameSiteCookieMiddleware
beforeSessionMiddleware
to avoid SameSite cookie while return from payment gateway:MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'spgateway.middleware.SpgatewaySameSiteCookieMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', ... ]
from spgateway.models import SpgatewayOrderMixin class Order(SpgatewayOrderMixin, models.Model): total = models.IntegerField(default=0, verbose_name='Total Price') user = models.ForeignKey(User, verbose_name='Order by user') is_paid = models.BooleanField(default=False) # Add this parameter to let django-spgateway know which field is amount of price SpgatewayAmtFieldName = 'total' # Add this parameter to let django-spgateway set item description SpgatewayItemDesc = 'Items descriptions' # Add this method to let django-spgateway retrieve email def get_SpgatewayEmail(self, **kwargs): return self.user.email # Add this method let django-spgateway call when notify from Spgateway server # Change your order with this method def spgateway_notify(self, request, trade_info): status = trade_info['Status'] status_msg = trade_info['Message'] if status == 'SUCCESS': self.is_paid = True self.save() else: # TODO: Handle error # Add this method let django-spgateway call when client return from Spgateway server # Never trust data from client. Display messages only def spgateway_return(self, request, trade_info): status = trade_info['Status'] status_msg = trade_info['Message'] if status == 'SUCCESS': # TODO: Display success message to user else: # TODO: Display error message to user # django-spgateway will call this method to redirect user after user return from Spgateway server def get_absolute_url(self): return reverse('ORDER_DETAIL_VIEW_NAME_HERE')
If you have found a bug or if you have a request for additional functionality, please use the issue tracker on GitHub.
https://github.com/cjltsod/django-spgateway/issues
You can use this under MIT. See LICENSE file for details.
Developed and maintained by CJLTSOD.
Thanks to everybody that has contributed pull requests, ideas, issues, comments and kind words.
Please see AUTHORS.rst for a list of contributors.