Skip to content

Commit 42fa608

Browse files
add simple usage guide
1 parent 08f765f commit 42fa608

File tree

1 file changed

+152
-1
lines changed

1 file changed

+152
-1
lines changed

README.md

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,153 @@
1-
# Django app for Sberbank payment API
1+
[![PyPI version fury.io](https://badge.fury.io/py/django-sberbank.svg)](https://pypi.python.org/pypi/django-sberbank/)
2+
[![PyPI license](https://img.shields.io/pypi/l/django-sberbank.svg)](https://pypi.python.org/pypi/django-sberbank/)
23

4+
# Оплата через платежный API Сбербанка в Django
5+
Это Django-приложение позволяет быстро приделать к сайту на Django прием оплаты с банковских карт с помощью платежного API Сбербанка. Приложение поддерживает:
6+
7+
* Оплату через веб-формы (пользователь вводит данные карты на сервере Сбербанка)
8+
* Оплату с помощью Apple Pay и Google Pay
9+
* Привязку банковских карт и получение списка привязанных карт
10+
* Отслеживание истории транзакций и журналирование обмена с API Сбербанка в БД
11+
12+
## Установка
13+
1. Добавить `sberbank` в список INSTALLED_APPS:
14+
```python
15+
INSTALLED_APPS = [
16+
...
17+
'sberbank',
18+
...
19+
]
20+
```
21+
2. Добавить параметры мерчанта в `settings.py`:
22+
```python
23+
MERCHANTS = {
24+
%merchant_id%: {
25+
'username': '%merchant_username%',
26+
'password': '%merchant_password%',
27+
'success_url': 'http://ваш.домен/sberbank/payment/success',
28+
'fail_url': 'http://ваш.домен/sberbank/payment/fail',
29+
'app_success_url': 'http://ваш.домен/payment/success',
30+
'app_fail_url': 'http://ваш.домен/payment/fail',
31+
}
32+
}
33+
```
34+
3. Добавить URL-ы приложения в ваш `urls.py`:
35+
```python
36+
urlpatterns = [
37+
...
38+
url('/sberbank', include('sberbank.urls'))
39+
]
40+
41+
```
42+
4. Запустить `python manage.py migrate` чтобы создать модели.
43+
44+
## Параметры словаря `MERCHANTS`
45+
* `success_url` - на данный URL Сбербанк будет перенаправлять браузер после успешного платежа
46+
* `fail_url` - на данный URL Сбербанк будет перенаправлять браузер после неуспешного платежа
47+
* `app_success_url` - это URL, с помощью которого ваше приложение может среагировать на успешный платеж после того, как отработает коллбэк `success_url`.
48+
* `app_fail_url` - это URL, с помощью которого ваше приложение может среагировать на неуспешный платеж после того, как отработает коллбэк `fail_url`.
49+
50+
## Использование
51+
### Платеж с помощью веб-формы
52+
53+
```python
54+
from sberbank.service import BankService
55+
from sberbank.models import Payment, Status
56+
57+
...
58+
try:
59+
# Сумма в рублях
60+
amount = 10.0
61+
62+
# Уникальный ID пользователя, используется для привязки карт
63+
# Если None, пользователь не сможет выбрать ранее привязанную карту
64+
# или привязать карту в процессе оплаты
65+
client_id = request.data.get("client_id")
66+
67+
svc = BankService(%merchant_id%)
68+
69+
# url - адрес, на который следует перенаправить пользователя для оплаты
70+
# payment - объект Payment из БД, содержит информацию о платеже
71+
# description - назначение платежа в веб-форме банка
72+
# params - произвольные параметры, которые можно привязать к платежу
73+
payment, url = svc.pay(amount, params={'foo': 'bar'}, client_id=client_id,
74+
description="Оплата заказа №1234")
75+
return HttpResponseRedirect(url)
76+
except Exception as exc:
77+
# Что-то пошло не так
78+
raise
79+
```
80+
### Привязка карты со списанием и возвратом 1 рубля
81+
82+
```python
83+
from sberbank.service import BankService
84+
from sberbank.models import Payment, Status
85+
86+
...
87+
try:
88+
# Уникальный ID пользователя, используется для привязки карт
89+
# параметр необходимо передавать при использовании функции привязки карт
90+
# через списание и возврат
91+
client_id = request.data.get("client_id")
92+
if client_id is None:
93+
return HttpResponseBadRequest()
94+
95+
svc = BankService(%merchant_id%)
96+
97+
# url - адрес, на который следует перенаправить пользователя для оплаты
98+
# payment - объект Payment из БД, содержит информацию о платеже
99+
payment, url = svc.bind_refund(client_id=client_id)
100+
return HttpResponseRedirect(url)
101+
except Exception as exc:
102+
# Что-то пошло не так
103+
raise
104+
```
105+
### Оплата с помощью Apple/Google Pay
106+
107+
```python
108+
from sberbank.service import BankService
109+
from sberbank.models import Payment, Status
110+
111+
...
112+
try:
113+
# Уникальный ID пользователя, используется для привязки карт
114+
# параметр необходимо передавать при использовании функции привязки карт
115+
# через списание и возврат
116+
client_id = request.data.get("client_id")
117+
118+
# Сумма платежа в рублях
119+
amounnt = 10.0
120+
121+
# Токен, переданный приложением для Apple/Android
122+
# библиотека сама определяет тип платежа по формату
123+
# переданного токена и вызывает соответствующее API Сбербанка
124+
token = request.data.get("token")
125+
126+
# IP адрес клиента
127+
ip = request.META.get('REMOTE_ADDR', '127.0.0.1')
128+
129+
svc = BankService(%merchant_id%)
130+
131+
payment, response = svc.mobile_pay(amount, token, ip, client_id=client_id,
132+
params={'foo': 'bar'}, description="Оплата заказа №1234")
133+
134+
if response['success'] != True:
135+
return Response({"status": "error"})
136+
if payment.status == Status.SUCCEEDED:
137+
# Платеж успешен
138+
json_response = {"status": "success"}
139+
140+
# Платежи с некоторых карт требуют особой обработки на клиенте
141+
# При наличии в ответе acsUrl клиенту нужно перенаправить пользователя
142+
# на адрес redirect_url, POST-запросом передав параметры в виде x-www-form-urlencoded
143+
if response['data'].get('acsUrl'):
144+
json_response.update({"redirect_url": response['data'].get('acsUrl', '')})
145+
json_response.update({"params": {
146+
'paReq': response['data'].get('paReq', ''),
147+
'termUrl': response['data'].get('termUrl', ''),
148+
'orderId': response['data'].get('orderId', '')}})
149+
return Response(json_response)
150+
except Exception as exc:
151+
# Что-то пошло не так
152+
raise
153+
```

0 commit comments

Comments
 (0)