Skip to content

Commit

Permalink
Merge pull request #3 from yoomoney/release/v2.1.0
Browse files Browse the repository at this point in the history
Release/2.1.0
  • Loading branch information
tonchik-tm authored Apr 21, 2021
2 parents 647ea65 + 7ea96a1 commit 16c9a2c
Show file tree
Hide file tree
Showing 19 changed files with 949 additions and 16 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
### v2.1.0 от 21.04.2021
* Добавлены примеры работы с SDK

### v2.0.1 от 03.12.2020
* Поправлен setup

Expand Down
28 changes: 28 additions & 0 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,31 @@ Configuration.configure_user_agent(

3. Call the required API method. [More details in our documentation for the YooKassa API](https://yookassa.ru/en/developers/api)

## Examples of using the API SDK

#### [YooKassa SDK Settings](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md)
* [Authentication](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Аутентификация)
* [Statistics about the environment used](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Статистические-данные-об-используемом-окружении)
* [Getting information about the store](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Получение-информации-о-магазине)
* [Working with Webhook](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Работа-с-Webhook)
* [Notifications](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Входящие-уведомления)

#### [Working with payments](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md)
* [Request to create a payment](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-создание-платежа)
* [Request to create a payment via the builder](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-создание-платежа-через-билдер)
* [Request for partial payment confirmation](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-частичное-подтверждение-платежа)
* [Request to cancel an incomplete payment](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-отмену-незавершенного-платежа)
* [Get payment information](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Получить-информацию-о-платеже)
* [Get a list of payments with filtering](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Получить-список-платежей-с-фильтрацией)

#### [Working with refunds](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md)
* [Request to create a refund](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Запрос-на-создание-возврата)
* [Request to create a refund via the builder](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Запрос-на-создание-возврата-через-билдер)
* [Get refund information](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Получить-информацию-о-возврате)
* [Get a list of returns with filtering](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Получить-список-возвратов-с-фильтрацией)

#### [Working with receipts](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md)
* [Request to create a receipt](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Запрос-на-создание-чека)
* [Request to create a receipt via the builder](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Запрос-на-создание-чека-через-билдер)
* [Get information about the receipt](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Получить-информацию-о-чеке)
* [Get a list of receipts with filtering](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Получить-список-чеков-с-фильтрацией)
29 changes: 28 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,31 @@ Configuration.configure_user_agent(

3. Вызовите нужный метод API. [Подробнее в документации к API ЮKassa](https://yookassa.ru/developers/api)


## Примеры использования SDK

#### [Настройки SDK API ЮKassa](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md)
* [Аутентификация](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Аутентификация)
* [Статистические данные об используемом окружении](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Статистические-данные-об-используемом-окружении)
* [Получение информации о магазине](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Получение-информации-о-магазине)
* [Работа с Webhook](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Работа-с-Webhook)
* [Входящие уведомления](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/01-configuration.md#Входящие-уведомления)

#### [Работа с платежами](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md)
* [Запрос на создание платежа](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-создание-платежа)
* [Запрос на создание платежа через билдер](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-создание-платежа-через-билдер)
* [Запрос на частичное подтверждение платежа](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-частичное-подтверждение-платежа)
* [Запрос на отмену незавершенного платежа](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Запрос-на-отмену-незавершенного-платежа)
* [Получить информацию о платеже](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Получить-информацию-о-платеже)
* [Получить список платежей с фильтрацией](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/02-payments.md#Получить-список-платежей-с-фильтрацией)

#### [Работа с возвратами](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md)
* [Запрос на создание возврата](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Запрос-на-создание-возврата)
* [Запрос на создание возврата через билдер](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Запрос-на-создание-возврата-через-билдер)
* [Получить информацию о возврате](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Получить-информацию-о-возврате)
* [Получить список возвратов с фильтрацией](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/03-refunds.md#Получить-список-возвратов-с-фильтрацией)

#### [Работа с чеками](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md)
* [Запрос на создание чека](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Запрос-на-создание-чека)
* [Запрос на создание чека через билдер](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Запрос-на-создание-чека-через-билдер)
* [Получить информацию о чеке](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Получить-информацию-о-чеке)
* [Получить список чеков с фильтрацией](https://github.com/yoomoney/yookassa-sdk-python/blob/master/docs/examples/04-receipts.md#Получить-список-чеков-с-фильтрацией)
218 changes: 218 additions & 0 deletions docs/examples/01-configuration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
## Настройки SDK API ЮKassa

[Справочник API ЮKassa](https://yookassa.ru/developers/api)

С помощью этого SDK вы можете работать с онлайн-платежами: отправлять запросы на оплату,
сохранять платежную информацию для повторных списаний, совершать возвраты и многое другое.

* [Аутентификация](#Аутентификация)
* [Статистические данные об используемом окружении](#Статистические-данные-об-используемом-окружении)
* [Получение информации о магазине](#Получение-информации-о-магазине)
* [Работа с Webhook](#Работа-с-Webhook)
* [Входящие уведомления](#Входящие-уведомления)

---

### Аутентификация

Для работы с API необходимо прописать в конфигурации данные аутентификации. Существует два способа аутентификации:
- shopId + секретный ключ
- OAuth-токен. [Подробнее в документации к API](https://yookassa.ru/developers/partners-api/basics)

```python
from yookassa import Configuration
# shopId + секретный ключ
Configuration.configure('XXXXXX', 'test_XXXXXXXX')
# или OAuth-токен
Configuration.configure_auth_token('token-XXXXXXXX')
```

---

### Статистические данные об используемом окружении

Для поддержки качества, а также быстром реагировании на ошибки, SDK передает статистику в запросах к API ЮKassa.

По молчанию, SDK передает в запросах версию операционной системы, версию Python, а также версию SDK.
Но вы можете передать дополнительные данные об используемом фреймворке, CMS, а также модуле в CMS.

Например, это может выглядеть так:
```python
from yookassa import Configuration
from yookassa.domain.common.user_agent import Version

Configuration.configure_user_agent(
framework=Version('Django', '2.2.3'),
cms=Version('Wagtail', '2.6.2'),
module=Version('Y.CMS', '0.0.1')
)
```

---

### Получение информации о магазине

После установки конфигурации можно проверить корректность данных, а также получить информацию о магазине.

```python
import var_dump as var_dump
from yookassa import Settings

me = Settings.get_account_settings()
var_dump.var_dump(me)
```
В результате мы увидим примерно следующее:
```
#0 dict(5)
['account_id'] => str(6) "XXXXXX"
['test'] => bool(True)
['fiscalization_enabled'] => bool(True)
['payment_methods'] => list(2)
[0] => str(9) "yoo_money"
[1] => str(9) "bank_card"
['status'] => str(7) "enabled"
```
[Подробнее в документации к API](https://yookassa.ru/developers/api?lang=python#me_object)

---

### Работа с Webhook

Если вы подключаетесь к API через Oauth-токен, то можете настроить получение уведомлений о смене статуса платежа или возврата.

Например, ЮKassa может сообщить, когда объект платежа, созданный в вашем приложении, перейдет в статус `waiting_for_capture`.

В данном примере мы устанавливаем вебхуки для succeeded и canceled уведомлений.
А так же проверяем, не установлены ли уже вебхуки. И если установлены на неверный адрес, удаляем.

```python
import var_dump as var_dump
from yookassa import Webhook
from yookassa.domain.notification import WebhookNotificationEventType

whUrl = 'https://merchant-site.ru/payment-notification'
needWebhookList = [
WebhookNotificationEventType.PAYMENT_SUCCEEDED,
WebhookNotificationEventType.PAYMENT_CANCELED
]

whList = Webhook.list()

for event in needWebhookList:
hookIsSet = False
for wh in whList.items:
if wh.event != event:
continue
if wh.url != whUrl:
Webhook.remove(wh.id)
else:
hookIsSet = True

if not hookIsSet:
Webhook.add({"event": event, "url": whUrl})

var_dump.var_dump(Webhook.list())
```

В результате мы увидим примерно следующее:
```
#0 object(WebhookList) (2)
_WebhookList__items => list(2)
[0] => object(WebhookResponse) (3)
_WebhookResponse__id => str(39) "wh-52e51c6e-29a2-4a0d-800b-01cf022b5613"
_WebhookResponse__event => str(16) "payment.canceled"
_WebhookResponse__url => str(66) "https://merchant-site.ru/payment-notification"
[1] => object(WebhookResponse) (3)
_WebhookResponse__id => str(39) "wh-c331b3ee-fb65-428d-b008-1b837d9c4d93"
_WebhookResponse__event => str(17) "payment.succeeded"
_WebhookResponse__url => str(66) "https://merchant-site.ru/payment-notification"
_WebhookList__type => str(4) "list"
```
[Подробнее в документации к API](https://yookassa.ru/developers/api?lang=python#webhook)

### Входящие уведомления

Если вы хотите отслеживать состояние платежей и возвратов, вы можете подписаться на уведомления ([webhook](#Работа-с-Webhook), callback).

Уведомления пригодятся в тех случаях, когда объект API изменяется без вашего участия.
Например, если пользователю нужно подтвердить платеж, процесс оплаты может занять от нескольких минут до нескольких часов.
Вместо того чтобы всё это время периодически отправлять GET-запросы, чтобы узнать статус платежа, вы можете просто дожидаться уведомления от ЮKassa.

[Входящие уведомления в документации](https://yookassa.ru/developers/using-api/webhooks?lang=python)

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

Как только произойдет событие, на которое вы подписались, на URL, который вы указали при настройке, придет уведомление.
В нем будут все данные об объекте на момент, когда произошло событие.

Вам нужно подтвердить, что вы получили уведомление. Для этого ответьте HTTP-кодом 200. ЮKassa проигнорирует всё,
что будет находиться в теле или заголовках ответа. Ответы с любыми другими HTTP-кодами будут считаться невалидными,
и ЮKassa продолжит доставлять уведомление в течение 24 часов, начиная с момента, когда событие произошло.

#### Пример обработки уведомления с помощью SDK

```python
import json
from django.http import HttpResponse
from yookassa import Configuration, Payment
from yookassa.domain.notification import WebhookNotificationEventType, WebhookNotification

def my_webhook_handler(request):
# Извлечение JSON объекта из тела запроса
event_json = json.loads(request.body)
try:
# Создание объекта класса уведомлений в зависимости от события
notification_object = WebhookNotification(event_json)
response_object = notification_object.object
if notification_object.event == WebhookNotificationEventType.PAYMENT_SUCCEEDED:
some_data = {
'paymentId': response_object.id,
'paymentStatus': response_object.status,
}
# Специфичная логика
# ...
elif notification_object.event == WebhookNotificationEventType.PAYMENT_WAITING_FOR_CAPTURE:
some_data = {
'paymentId': response_object.id,
'paymentStatus': response_object.status,
}
# Специфичная логика
# ...
elif notification_object.event == WebhookNotificationEventType.PAYMENT_CANCELED:
some_data = {
'paymentId': response_object.id,
'paymentStatus': response_object.status,
}
# Специфичная логика
# ...
elif notification_object.event == WebhookNotificationEventType.REFUND_SUCCEEDED:
some_data = {
'refundId': response_object.id,
'refundStatus': response_object.status,
'paymentId': response_object.payment_id,
}
# Специфичная логика
# ...
else:
# Обработка ошибок
return HttpResponse(status=400) # Сообщаем кассе об ошибке

# Специфичная логика
# ...
Configuration.configure('XXXXXX', 'test_XXXXXXXX')
# Получим актуальную информацию о платеже
payment_info = Payment.find_one(some_data['paymentId'])
if payment_info:
payment_status = payment_info.status
# Специфичная логика
# ...
else:
# Обработка ошибок
return HttpResponse(status=400) # Сообщаем кассе об ошибке

except Exception:
# Обработка ошибок
return HttpResponse(status=400) # Сообщаем кассе об ошибке

return HttpResponse(status=200) # Сообщаем кассе, что все хорошо
```
Loading

0 comments on commit 16c9a2c

Please sign in to comment.