Paiements bot, de bout en bout
Un guide sans raccourci pour accepter les paiements via un bot Telegram — Stars pour digital, fiat pour physique, refunds, webhooks, et les pièges que personne ne documente.
Les paiements bot Telegram sont le checkout le plus simple sur internet. Pas de champs de carte, pas de redirects, pas de SCA dance — l’utilisateur tape Pay, confirme avec biométrie, fini.
Voici la version ennuyeuse et complète : chaque appel d’API Bot dont vous avez vraiment besoin, dans l’ordre, avec les cas d’erreur.
Choisir votre provider
Stars — pas de setup, juste utiliser currency: "XTR". Les fonds atterrissent dans le wallet Stars de votre bot.
Fiat — parler à @BotFather → Payments et connecter un provider (Stripe, Smart Glocal, YooKassa, Tranzzo, selon géographie). Vous obtiendrez un provider token à passer dans les invoices.
Pour 99% des produits digitaux, démarrez avec Stars et sautez la fiat dance entièrement.
core.telegram.org Vue d’ensemble paiements bot ↗Envoyer une invoice
Le chemin le plus simple est sendInvoice directement dans un chat :
await fetch(`https://api.telegram.org/bot${TOKEN}/sendInvoice`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chat_id: userId,
title: "Plan Pro, mensuel",
description: "Accès illimité pendant 30 jours.",
payload: `pro_${userId}_${Date.now()}`,
currency: "XTR",
prices: [{ label: "Pro", amount: 250 }],
}),
});payload est votre clé d’idempotence privée — ne l’exposez jamais à l’utilisateur, mettez-y toujours assez pour identifier la commande de votre côté.
Pour les Mini Apps, utilisez createInvoiceLink à la place, puis appelez WebApp.openInvoice(url) côté client.
Gérer pre-checkout
Telegram vous envoie un update pre_checkout_query avant de débiter. Vous devez répondre dans 10 secondes, ou le paiement auto-fail.
// dans votre handler d'updates
if (update.pre_checkout_query) {
const ok = await canFulfill(update.pre_checkout_query.invoice_payload);
await fetch(`https://api.telegram.org/bot${TOKEN}/answerPreCheckoutQuery`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
pre_checkout_query_id: update.pre_checkout_query.id,
ok,
error_message: ok ? undefined : "Plus de stock — désolé.",
}),
});
}Utilisez ce hook pour : re-valider le stock, vérifier la fraude, confirmer que l’utilisateur n’est pas banni, locker l’inventaire.
Accorder les droits sur successful_payment
Après débit, vous recevez message.successful_payment sur le même chat. Le payload est votre clé d’idempotence — dédupez dessus.
if (update.message?.successful_payment) {
const sp = update.message.successful_payment;
await db.transaction(async (tx) => {
const exists = await tx.payment.findUnique({ where: { payload: sp.invoice_payload } });
if (exists) return;
await tx.payment.create({ data: { ...sp, userId: update.message.chat.id } });
await grantEntitlement(update.message.chat.id, sp.invoice_payload);
});
await sendMessage(update.message.chat.id, "Paiement reçu — vous êtes dedans. Tapez /start pour commencer.");
}Telegram retry successful_payment jusqu’à ce que vous ack — votre handler doit être idempotent ou vous accordez l’accès deux fois.
Refunds
Stars : refundStarPayment(user_id, telegram_payment_charge_id). Entièrement programmatique.
Fiat : refund via le dashboard de votre provider (Stripe etc.) ; Telegram ne proxy pas les refunds fiat.
Construisez une commande admin /refund <order_id> dès le J1. Sans ça, vous ferez du SQL manuel dans une semaine.
Subscriptions récurrentes
Deux patterns :
Stars subscriptions (recommandé) — passez subscription_period: 2592000 (30 jours) sur l’invoice. Telegram facture l’utilisateur automatiquement chaque période. Vous recevez un successful_payment à chaque cycle.
Récurrent manuel — schedulez vos propres rappels de renouvellement, envoyez une fresh invoice à chaque cycle. Plus de boulot, mais vous contrôlez les retries, le dunning, les périodes de grâce.
Pour produits SaaS-like, les Stars subscriptions sont parfaites. Pour B2B haut-ticket, faites du récurrent manuel avec fiat.
Une démo code de bout en bout
Si vous préférez voir l’implémentation end-to-end avant de lire le reste, ce tutoriel tiers montre un flow complet de paiement Stars dans une Mini App :
Checklist production
- Handler
successful_paymentidempotent. - SLO 10s sur
answerPreCheckoutQuery. - Commande admin refund.
- Vérif secret webhook sur chaque update entrant (
X-Telegram-Bot-Api-Secret-Token). - Table ledger séparée de votre logique business — chaque Stars/cents in et out, immutable.
- Job de réconciliation quotidien comparant
getStarTransactionsà votre ledger.
Cette dernière vous sauvera le jour où un successful_payment retry vers un bot que vous avez redéployé sans idempotence.
À lire ensuite
Connecter Claude à Telegram Business — réponses IA supervisées
Une architecture qui marche pour router votre inbox Telegram Business via Claude, avec l'utilisateur fermement dans la boucle. Code, prompts, coûts, et quoi faire quand Claude se trompe.
Retirer ses Stars sans perdre 30% en frais
Un guide pratique pour convertir des Telegram Stars en USD bancables avec une perte de spread minimum — chaque route, vrais frais, et les tactiques de timing qui composent sur une année.
Monétiser un channel Telegram avec les Stars
Transformez un channel Telegram public en produit à revenu récurrent grâce aux abonnements payants, aux gifts et aux nouveaux rails de monétisation Stars.