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