Продвинутый пример работы с платежами

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

Работа с метаданными

Метаданные позволяют хранить дополнительную информацию о платеже, которая будет возвращена в webhook-уведомлениях.

import asyncio
from aioyookassa import YooKassa
from aioyookassa.types.payment import Money, Confirmation
from aioyookassa.types.enum import Currency, ConfirmationType
from aioyookassa.types.params import CreatePaymentParams

async def create_payment_with_metadata():
    async with YooKassa(api_key="your_api_key", shop_id=12345) as client:
        params = CreatePaymentParams(
            amount=Money(value=5000.00, currency=Currency.RUB),
            confirmation=Confirmation(
                type=ConfirmationType.REDIRECT,
                return_url="https://example.com/return"
            ),
            description="Платеж с метаданными",
            metadata={
                "order_id": "12345",
                "user_id": "67890",
                "product_id": "PROD-001",
                "category": "electronics",
                "promo_code": "SUMMER2024"
            }
        )
        payment = await client.payments.create_payment(params)

        print(f"Payment ID: {payment.id}")
        print(f"Metadata: {payment.metadata}")

asyncio.run(create_payment_with_metadata())

Обработка различных статусов платежа

Пример обработки всех возможных статусов платежа.

import asyncio
from aioyookassa import YooKassa
from aioyookassa.types.enum import PaymentStatus

async def handle_payment_status(payment_id: str):
    async with YooKassa(api_key="your_api_key", shop_id=12345) as client:
        payment = await client.payments.get_payment(payment_id)

        if payment.status == PaymentStatus.PENDING:
            print("⏳ Платеж ожидает оплаты")
            print(f"URL для оплаты: {payment.confirmation.url}")

        elif payment.status == PaymentStatus.WAITING_FOR_CAPTURE:
            print("⏸️ Платеж ожидает подтверждения")
            # Подтверждаем платеж
            captured = await client.payments.capture_payment(payment_id)
            print(f"✅ Платеж подтвержден: {captured.status}")

        elif payment.status == PaymentStatus.SUCCEEDED:
            print("✅ Платеж успешно выполнен")
            if payment.succeeded_at:
                print(f"Время выполнения: {payment.succeeded_at}")

        elif payment.status == PaymentStatus.CANCELED:
            print("❌ Платеж отменен")
            if payment.cancellation_details:
                print(f"Причина: {payment.cancellation_details.reason}")
                print(f"Партия: {payment.cancellation_details.party}")

asyncio.run(handle_payment_status("payment_id"))

Пакетная обработка платежей

Пример создания нескольких платежей одновременно.

import asyncio
from aioyookassa import YooKassa
from aioyookassa.types.payment import Money, Confirmation
from aioyookassa.types.enum import Currency, ConfirmationType
from aioyookassa.types.params import CreatePaymentParams

async def create_multiple_payments():
    async with YooKassa(api_key="your_api_key", shop_id=12345) as client:
        orders = [
            {"id": "1", "amount": 1000.00, "description": "Заказ #1"},
            {"id": "2", "amount": 2000.00, "description": "Заказ #2"},
            {"id": "3", "amount": 3000.00, "description": "Заказ #3"},
        ]

        payments = []
        for order in orders:
            params = CreatePaymentParams(
                amount=Money(value=order["amount"], currency=Currency.RUB),
                confirmation=Confirmation(
                    type=ConfirmationType.REDIRECT,
                    return_url="https://example.com/return"
                ),
                description=order["description"],
                metadata={"order_id": order["id"]}
            )
            payment = await client.payments.create_payment(params)
            payments.append(payment)
            print(f"✅ Создан платеж {payment.id} для заказа {order['id']}")

        return payments

asyncio.run(create_multiple_payments())

Интеграция с базой данных

Пример сохранения информации о платеже в базу данных.

import asyncio
from aioyookassa import YooKassa
from aioyookassa.types.payment import Money, Confirmation
from aioyookassa.types.enum import Currency, ConfirmationType, PaymentStatus
from aioyookassa.types.params import CreatePaymentParams

# Пример с использованием SQLAlchemy (адаптируйте под вашу БД)
async def create_payment_with_db():
    async with YooKassa(api_key="your_api_key", shop_id=12345) as client:
        # Создаем платеж
        params = CreatePaymentParams(
            amount=Money(value=5000.00, currency=Currency.RUB),
            confirmation=Confirmation(
                type=ConfirmationType.REDIRECT,
                return_url="https://example.com/return"
            ),
            description="Платеж с сохранением в БД",
            metadata={"order_id": "12345"}
        )
        payment = await client.payments.create_payment(params)

        # Сохраняем в БД (пример с SQLAlchemy)
        # from your_app.models import Payment
        # db_payment = Payment(
        #     yookassa_id=payment.id,
        #     amount=payment.amount.value,
        #     currency=payment.amount.currency,
        #     status=payment.status,
        #     order_id=payment.metadata.get("order_id")
        # )
        # session.add(db_payment)
        # session.commit()

        print(f"✅ Платеж {payment.id} создан и сохранен в БД")

asyncio.run(create_payment_with_db())