Giter VIP home page Giter VIP logo

django-sberbank's Introduction

PyPI version fury.io PyPI license

Оплата через платежный API Сбербанка в Django

Это Django-приложение позволяет быстро приделать к сайту на Django прием оплаты с банковских карт с помощью платежного API Сбербанка. Приложение поддерживает:

  • Оплату через веб-формы (пользователь вводит данные карты на сервере Сбербанка)
  • Оплату с помощью Apple Pay и Google Pay
  • Привязку банковских карт и получение списка привязанных карт
  • Отслеживание истории транзакций и журналирование обмена с API Сбербанка в БД

Установка

  1. Добавить sberbank в список INSTALLED_APPS:
INSTALLED_APPS = [
  ...
  'sberbank',
  ...
]
  1. Добавить параметры мерчанта в settings.py:
MERCHANTS = {
  %merchant_id%: {
    'username': '%merchant_username%',
    'password': '%merchant_password%',
    'success_url': 'http://ваш.домен/sberbank/payment/success',
    'fail_url': 'http://ваш.домен/sberbank/payment/fail',
    'app_success_url': 'http://ваш.домен/payment/success',
    'app_fail_url': 'http://ваш.домен/payment/fail',
  }
}
  1. Добавить URL-ы приложения в ваш urls.py:
urlpatterns = [
  ...
  url('/sberbank', include('sberbank.urls'))
]
  1. Запустить python manage.py migrate чтобы создать модели.

Установка окружения

Переменная окружения: ENVIRONMENT

Возможные значения:

По-умолчанию: development

Параметры словаря MERCHANTS

  • success_url - на данный URL Сбербанк будет перенаправлять браузер после успешного платежа
  • fail_url - на данный URL Сбербанк будет перенаправлять браузер после неуспешного платежа
  • app_success_url - это URL, с помощью которого ваше приложение может среагировать на успешный платеж после того, как отработает коллбэк success_url.
  • app_fail_url - это URL, с помощью которого ваше приложение может среагировать на неуспешный платеж после того, как отработает коллбэк fail_url.

Использование

Платеж с помощью веб-формы

from sberbank.service import BankService
from sberbank.models import Payment, Status

...
try:
    # Сумма в рублях
    amount = 10.0

    # Уникальный ID пользователя, используется для привязки карт
    # Если None, пользователь не сможет выбрать ранее привязанную карту
    # или привязать карту в процессе оплаты
    client_id = request.data.get("client_id")

    svc = BankService(%merchant_id%)

    # url - адрес, на который следует перенаправить пользователя для оплаты
    # payment - объект Payment из БД, содержит информацию о платеже
    # description - назначение платежа в веб-форме банка
    # params - произвольные параметры, которые можно привязать к платежу
    payment, url = svc.pay(amount, params={'foo': 'bar'}, client_id=client_id,
        description="Оплата заказа №1234")
    return HttpResponseRedirect(url)
except Exception as exc:
    # Что-то пошло не так
    raise

Привязка карты со списанием и возвратом 1 рубля

from sberbank.service import BankService
from sberbank.models import Payment, Status

...
try:
    # Уникальный ID пользователя, используется для привязки карт
    # параметр необходимо передавать при использовании функции привязки карт
    # через списание и возврат
    client_id = request.data.get("client_id")
    if client_id is None:
        return HttpResponseBadRequest()

    svc = BankService(%merchant_id%)

    # url - адрес, на который следует перенаправить пользователя для оплаты
    # payment - объект Payment из БД, содержит информацию о платеже
    payment, url = svc.bind_refund(client_id=client_id)
    return HttpResponseRedirect(url)
except Exception as exc:
    # Что-то пошло не так
    raise

Оплата с помощью Apple/Google Pay

from sberbank.service import BankService
from sberbank.models import Payment, Status

...
try:
    # Уникальный ID пользователя, используется для привязки карт
    # параметр необходимо передавать при использовании функции привязки карт
    # через списание и возврат
    client_id = request.data.get("client_id")

    # Сумма платежа в рублях
    amount = 10.0

    # Токен, переданный приложением для Apple/Android
    # библиотека сама определяет тип платежа по формату
    # переданного токена и вызывает соответствующее API Сбербанка
    token = request.data.get("token")

    # IP адрес клиента
    ip = request.META.get('REMOTE_ADDR', '127.0.0.1')

    svc = BankService(%merchant_id%)

    payment, response = svc.mobile_pay(amount, token, ip, client_id=client_id,
      params={'foo': 'bar'}, description="Оплата заказа №1234")
    
    if response['success'] != True:
        return Response({"status": "error"})
    if payment.status == Status.SUCCEEDED:
        # Платеж успешен
    json_response = {"status": "success"}

    # Платежи с некоторых карт требуют особой обработки на клиенте
    # При наличии в ответе acsUrl клиенту нужно перенаправить пользователя
    # на адрес redirect_url, POST-запросом передав параметры в виде x-www-form-urlencoded
    if response['data'].get('acsUrl'):
        json_response.update({"redirect_url": response['data'].get('acsUrl', '')})
        json_response.update({"params": {
            'paReq': response['data'].get('paReq', ''),
            'termUrl': response['data'].get('termUrl', ''),
            'orderId': response['data'].get('orderId', '')}})
    return Response(json_response)
except Exception as exc:
    # Что-то пошло не так
    raise

Периодическая проверка платежей по которым не известно состояние

from datetime import timedelta
from celery.task import periodic_task
from sberbank.tasks import check_payments

@periodic_task(run_every=timedelta(minutes=20))
def task_check_payments():
    check_payments()

django-sberbank's People

Contributors

fi1osof avatar llybin avatar madprogrammer avatar patimatnazhm avatar zagrebelin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

django-sberbank's Issues

Первая же миграция 0001_initial.py выдает ошибку

Первая же миграция 0001_initial.py выдает ошибку:
Traceback (most recent call last):
File "manage.py", line 22, in
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/init.py", line 401, in execute_from_command_line
utility.execute()
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/init.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
res = handle_func(*args, **kwargs)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 201, in handle
pre_migrate_state = executor._create_project_state(with_applied_migrations=True)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/db/migrations/executor.py", line 79, in _create_project_state
migration.mutate_state(state, preserve=False)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/db/migrations/migration.py", line 87, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "/home/django/wifitochka/wifitochka_env/lib/python3.8/site-packages/django/db/migrations/operations/fields.py", line 92, in state_forwards
state.models[app_label, self.model_name_lower].fields[self.name] = field
KeyError: ('sberbank', 'payment')

Сломана миграция с jsonfield

./manage.py migrate

sberbank/migrations/0005_auto_20180831_0901.py", line 4, in
import jsonfield.encoder
ModuleNotFoundError: No module named 'jsonfield.encoder'

возможно баг был в 2.0.х django версии

Пересобрал с нуля:

        migrations.CreateModel(
            name='Payment',
            fields=[
                ('uid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('bank_id', models.UUIDField(blank=True, db_index=True, null=True, verbose_name='банковский ИД')),
                ('amount', models.DecimalField(decimal_places=2, max_digits=128, verbose_name='сумма')),
                ('error_code', models.PositiveIntegerField(blank=True, null=True, verbose_name='код ошибки')),
                ('error_message', models.TextField(blank=True, null=True, verbose_name='текст ошибки')),
                ('status', models.PositiveSmallIntegerField(choices=[(0, 'CREATED'), (1, 'PENDING'), (2, 'SUCCEEDED'), (3, 'FAILED'), (4, 'REFUNDED')], db_index=True, default=sberbank.models.Status(0), verbose_name='статус')),
                ('details', jsonfield.fields.JSONField(blank=True, null=True, verbose_name='детали')),
                ('client_id', models.TextField(blank=True, null=True, verbose_name='код клиента')),
                ('method', models.PositiveSmallIntegerField(choices=[(0, 'UNKNOWN'), (1, 'WEB'), (2, 'APPLE'), (3, 'GOOGLE')], db_index=True, default=sberbank.models.Method(0), verbose_name='method')),
                ('created', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='создан')),
                ('updated', models.DateTimeField(auto_now=True, db_index=True, verbose_name='изменён')),
            ],
            options={
                'verbose_name': 'платеж',
                'verbose_name_plural': 'платежи',
                'ordering': ['-updated'],
            },
        ),

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.