Aller au contenu

Stripe Webhook ​

Cet exemple explique comment créer une API avec Hono pour recevoir les événements webhook de Stripe.

Préparation ​

Commencez par installer le SDK officiel de Stripe :

bash
npm install stripe

Ajoutez ensuite les valeurs suivantes au fichier .dev.vars pour définir les clés d’API Stripe :

STRIPE_API_KEY=sk_test_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx

Pour en savoir plus sur les clés d’API Stripe, consultez les documents suivants :

Protéger l’API qui reçoit les événements webhook Stripe ​

L’API qui traite les événements webhook est accessible publiquement. Un mécanisme doit donc la protéger contre les attaques, notamment les requêtes de tiers malveillants qui falsifient des objets d’événement webhook Stripe. Avec Stripe, vous pouvez protéger l’API en générant un secret de webhook et en vérifiant chaque requête.

En savoir plus : https://docs.stripe.com/webhooks?lang=node#verify-official-libraries

Implémenter l’API de webhook selon l’hébergement ou le framework ​

La vérification des signatures Stripe nécessite le corps brut de la requête. Avec un framework, assurez-vous que le corps d’origine n’est pas modifié. Toute modification du corps brut fait échouer la vérification.

Avec Hono, nous pouvons obtenir le corps brut de la requête grâce à la méthode context.req.text(). L’API de webhook peut donc être créée comme dans l’exemple suivant :

ts
import Stripe from 'stripe'
import { Hono } from 'hono'
import { env } from 'hono/adapter'

const app = new Hono()

app.post('/webhook', async (context) => {
  const { STRIPE_SECRET_API_KEY, STRIPE_WEBHOOK_SECRET } =
    env(context)
  const stripe = new Stripe(STRIPE_SECRET_API_KEY)
  const signature = context.req.header('stripe-signature')
  try {
    if (!signature) {
      return context.text('', 400)
    }
    const body = await context.req.text()
    const event = await stripe.webhooks.constructEventAsync(
      body,
      signature,
      STRIPE_WEBHOOK_SECRET
    )
    switch (event.type) {
      case 'payment_intent.created': {
        console.log(event.data.object)
        break
      }
      default:
        break
    }
    return context.text('', 200)
  } catch (err) {
    const errorMessage = `⚠️  Webhook signature verification failed. ${
      err instanceof Error ? err.message : 'Internal server error'
    }`
    console.log(errorMessage)
    return context.text(errorMessage, 400)
  }
})

export default app

Voir aussi ​

Publié sous licence MIT.