Next.js + Tegro.Money checkout

Промпт для Cursor / Claude Code / Copilot Chat. Создаёт полный checkout-флоу: страница товара → редирект на Tegro → success/fail-страницы → webhook-обработчик.

Промпт

Сделай в моём Next.js (App Router, TypeScript) приложении checkout с Tegro.Money:

1) app/products/[id]/page.tsx — страница товара с кнопкой "Купить за [цена] ₽".
   При клике — server action createCheckout(productId) который вызывает POST /api/checkout.

2) app/api/checkout/route.ts — серверный endpoint:
   POST https://tegro.money/api/createOrder/ с телом:
   {
     shop_id: process.env.TEGRO_SHOP_ID,
     nonce: crypto.randomUUID(),
     currency: "RUB",
     amount: 500,                         // получить из БД по productId
     order_id: crypto.randomUUID(),        // запиши в БД для сверки в webhook
     description: "Название товара",
     success_url: process.env.SITE_URL + "/checkout/success",
     fail_url: process.env.SITE_URL + "/checkout/fail",
     notify_url: process.env.SITE_URL + "/api/tegro-notify"
   }
   КЛЮЧЕВОЕ: подпись.
   - bodyString = JSON.stringify(body)
   - sign = crypto.createHmac("sha256", process.env.TEGRO_API_KEY).update(bodyString).digest("hex")
   - fetch с header Authorization: "Bearer " + sign, body: bodyString (НЕ JSON.stringify(body) повторно!)
   Ответ: {type:"success", data:{url}} — return NextResponse.redirect(data.url).
   На type:"error" — return NextResponse.json({error: data.desc}, {status: 400}).

3) app/checkout/success/page.tsx + app/checkout/fail/page.tsx — простые статические страницы.

4) app/api/tegro-notify/route.ts — webhook от Tegro:
   - Tegro шлёт form-urlencoded POST.
   - Прочитай тело через await request.formData()
   - Сверь сигнатуру по доке /docs/payments/notify/.
   - Найди свой order по order_id, обнови status в БД.
   - Верни plain-text "OK" со статусом 200.

5) .env.example — добавь TEGRO_SHOP_ID, TEGRO_API_KEY, SITE_URL.

6) README с шагами:
   - Зарегистрироваться на tegro.money/begin/register/
   - Создать магазин, скопировать shop_id и api_key
   - Включить тестовый режим магазина на время разработки
   - Прописать SITE_URL = публичный URL (для локалки — ngrok)
   - При выходе в прод — выключить тестовый режим

Используй модель базы которая уже есть в проекте (Prisma / Drizzle / etc — посмотри в коде).
Если БД нет — добавь простую in-memory Map для демо.

Не используй устаревший pages router. Только App Router.

Перед запуском

  • Получить ключи в Личном кабинете.
  • Для локального теста webhook'а нужен публичный URL — используйте ngrok.
  • В настройках магазина впишите notify_url = https://<ngrok>/api/tegro-notify.
  • Включите тестовый режим магазина — оплата пройдёт без списания средств.

Связанные