colisdocs

Les corrections dans vos outils

Chaque demande de corrections arrive signée sur votre route, avec le commentaire du client, prête à devenir un ticket.

Le problème

Les retours clients se perdent entre l’e-mail, la messagerie et les appels. Celui qui compte, « le logo en SVG, et le fond plus clair », doit finir dans votre outil de suivi.

La démarche

Pointez DROP_WEBHOOK_URL vers une route à vous, et vérifiez la signature avec verifyWebhook de @colis/protocol, le même code que celui qui signe :

app/api/colis/route.ts
import { verifyWebhook, type ColisWebhookEvent } from '@colis/protocol'

export async function POST(request: Request) {
  const body = await request.text()
  const result = await verifyWebhook(process.env.DROP_WEBHOOK_SECRET!, request.headers, body)
  if (!result.valid) return new Response(null, { status: 401 })

  const event = JSON.parse(body) as ColisWebhookEvent

  if (event.type === 'parcel.changes_requested') {
    await createTicket({
      title: `Corrections : ${event.data.filename ?? event.data.code}`,
      body: event.data.comment ?? '',
      reference: event.data.code,
      link: event.data.url,
    })
  }

  return new Response(null, { status: 204 })
}

createTicket est votre code : l’API de votre outil de suivi. Le code du colis relie le ticket à la livraison ; le lien ramène au fichier tant qu’il vit.

À surveiller

  • Lisez le corps brut. La signature porte sur les octets reçus : request.text() avant tout JSON.parse.
  • Cinq minutes de tolérance. Un horodatage décalé de plus de cinq minutes est refusé, pour qu’une ancienne livraison ne puisse pas être rejouée.
  • Répondez vite, et une fois. Une nouvelle tentative porte le même webhook-id : gardez-le pour ne pas créer deux tickets. Une réponse 4xx autre que 408 et 429 n’est pas retentée.
  • Aucun secret dans l’événement. data ne contient jamais le mot de passe, son empreinte, ni le jeton de l’expéditeur.

Sur cette page