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 в ошибке.
Creating order aka payment link¤
Для 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 ошибка, а в теле ответа будет примерно такое содержимое:
а если выполнить запрос на создание ссылки на оплату с неверными данными, получим ответ с кодом 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": {
        # ...
    },
}
Created: 2023-09-26 09:57:43+0000