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. - Включите тестовый режим магазина — оплата пройдёт без списания средств.