ЮKassa, первый платёж в AI-продукте, купоны, анти-даблклик и запрет дублей подписки

lemon_m 30 минут назад ЮKassa, первый платёж в AI-продукте, купоны, анти-даблклик и запрет дублей подписки 9 мин 1.2K Django * TypeScript * Веб-разработка * Туториал ЮKassa создает платеж по запросу backend. Сервер...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: lemon_m 30 минут назад ЮKassa, первый платёж в AI-продукте, купоны, анти-даблклик и запрет дублей подписки 9 мин 1. 2K Django * TypeScript * Веб-разработка * Туториал ЮKassa создает платеж по запросу backend. Сервер передает сумму, валюту, режим capture, данные подтверждения, описание и Idempotence-Key.
type=redirect ЮKassa возвращает адрес страницы оплаты. Frontend переводит пользователя на этот адрес. Купон, проверка активной подписки и блокировка повторного POST работают на стороне приложения.
Технические детали
В ЮKassa уходит уже рассчитанная сумма. Ниже используется реализация из проекта AI-Chat, платежи в профиле пользователя, Render просыпается пару минут. Frontend написан на Next.
js, платежный backend на Django REST Framework. Первый платеж в ЮKassaДля первого платежа сервер формирует объект с суммой в RUB, confirmation, return_url, описанием и внутренним идентификатором платежа в metadata. В проекте первый платеж создается с capture=false.
После оплаты он проходит через двухстадийный сценарий с состоянием waiting_for_capture. Для тарифов monthly и yearly сервер добавляет save_payment_method=true. У forever способ оплаты для следующих списаний не сохраняется.
Отраслевые последствия
def create_payment_data( amount, description, local_payment_id, subscription_type, receipt, payment_method_id=None ): save_pm = subscription_type in ("monthly", "yearly data = { "amount": { "value": str(amount), "currency": "RUB", }, "capture": False, "confirmation": { "type": "redirect", "return_url": f"{settings. FRONT_URL}/payment/success", }, "description": description, "receipt": receipt, "metadata": { "payment_id": local_payment_id, "subscription_type": subscription_type, }, } if save_pm: data = True return data metadata. payment_id связывает платеж ЮKassa с локальной записью.
subscription_type остается доступен при дальнейшей обработке уведомлений. Сумма платежаFrontend не передает итоговую сумму в process-kassa. Он отправляет тип покупки и код купона.
const resp = await post( "/api/payment/process-kassa/", { subscription_type: paymentType, coupon_code: couponCode, }, freshSession. accessToken ); Django сам получает базовую цену. BASE_PRICES = { "monthly": Decimal("300 "yearly": Decimal("2500 "forever": Decimal("5000 } def get_base_amount(subscription_type: str) -> Decimal: if subscription_type not in BASE_PRICES: raise ValueError("Unknown subscription_type return BASE_PRICES Сумма из React state не участвует в создании платежа.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






