Skip to content

YandexPayClient¤

Минимально для инициализации клиенту необходимо передать api-ключ:

>>> from dd_yandex_pay import YandexPayClient
>>> yp_client = YandexPayClient("api-key", base_url="https://sandbox.pay.yandex.ru/api/merchant/")

Базовый урл не обязательный параметр и по умолчанию настроен на боевое API.

Так же в клиент можно передать несколько дополнительных параметров.

Note

Так же следует отметить что все методы клиента возвращают не весь контент ответа, а только лишь объект data из ответа. Так как остальная часть тела ответа отражает статус запроса, и в случае успешного запроса всегда равна одним и тем же данным, эти данные было решено игнорировать. В случае каких либо ошибок, запрос можно найти в полу response в ошибке.

Для API создания ссылки на оплату есть метод create_order.

>>> cart = {
...     "externalId": "test_1",
...     "items": [
...         {
...             "productId": "test",
...             "quantity": {
...                 "count": "2",
...                 "label": "шт",
...             },
...             "title": "Тестовый товар",
...             "unitPrice": "100.00",
...             "subtotal": "200.00",
...             "discountedUnitPrice": "90.00",
...             "total": "180.00",
...         }
...     ],
...     "total": {
...         "amount": "180.00",
...     },
... }
>>> response_data = yp_client.create_order(
...     cart=cart,
...     currencyCode="RUB",
...     orderId="test #1/1",
...     redirectUrls={
...         "onError": "https://127.0.0.1/error",
...         "onSuccess": "https://127.0.0.1/success",
...     },
... )
>>> print(response_data)
{'paymentUrl': 'https://sandbox.pay.ya.ru/a/bcdefg'}

Info

Обратите внимание, читая документацию Yandex Pay API может показаться что статус запроса будет отдаваться в теле ответа в параметрах status и code, а http код всегда 200 и будет отражать сетевое состояние, но на деле, это не так, если например выполнить запрос с заведомо неверным ключом, вернётся 401 ошибка, а в теле ответа будет примерно такое содержимое:

{
	"status": "fail",
	"reasonCode": "AUTHENTICATION_ERROR",
	"reason": "Malformed API key"
}

а если выполнить запрос на создание ссылки на оплату с неверными данными, получим ответ с кодом 400 и следующим содержимым в теле ответа:

{
	"status": "fail",
	"reasonCode": "ORDER_AMOUNT_MISMATCH",
	"reason": "Cart total amount mismatch: expected `cart_total` = `items_sum` - `discounts_sum`, but found 0.00 != 180.00 - 0.00",
	"details": {
		"cart_total": "0.00",
		"items_sum": "180.00",
		"discounts_sum": "0.00",
		"description": "Cart total amount mismatch: expected `cart_total` = `items_sum` - `discounts_sum`, but found 0.00 != 180.00 - 0.00"
	}
}

Receving order details¤

Получить данные заказа можно отправив GET запрос на соответствующее API используя метод get_order:

>>> response_data = yp_client.get_order("test_1")
>>> print(response_data)
{
    "delivery": {},
    "operations": [],
    "order": {},
}

Refund on order¤

Для возврата средств в API Yandex Pay есть два ендпоинта - v1 и v2, для этих ендпоинтов реализовано 2 метода refund_order_v1 и refund_order_v2 соответственно:

>>> yp_client.refund_order_v1(
>>>     "test_1",
>>>     123.45,
>>>     123.45,
>>> )
{
    "operation": {
        # ...
    },
}
>>> yp_client.refund_order_v2(
>>>     "test_1",
>>>     123.45,
>>> )
{
    "operation": {
        # ...
    },
}

Cancel order¤

Заказы в статусе AUTHORIZED можно отменить используя метод cancel_order:

>>> response_data = yp_client.cancel_order("test_1", "Canceling a test order.")
>>> print(response_data)
{
    "operation": {
        # ...
    },
}

Note

Важно отметить, что это не отмена заказа, то есть с помощью этого метода не получится закрыть ссылку на оплату, что бы пользователь не смог ею воспользоваться. Это отмена списания заблокированных средств, а для списания средств используется метод capture_order.

Сapture order¤

Для списания средств по заказам в статусе AUTHORIZED реализован метод capture_order:

>>> response_data = yp_client.capture_order("test_1")
>>> print(response_data)
{
    "operation": {
        # ...
    },
}

Receiving transaction data¤

Что бы получить данные по операциям воспользуйтесь методом get_operation:

>>> response_data = yp_client.get_operation("test_1")
>>> print(response_data)
{
    "operation": {
        # ...
    },
}

Last update: 2023-10-30 09:45:07+0000
Created: 2023-09-26 09:57:43+0000
Authors: Dmitry Dobrynin