# Webhook de suivi des achats

# Valider les achats depuis votre backend

Le suivi sur votre page ou votre application signale à Frak qu'une commande se prépare. Les récompenses ne sont déclenchées que lorsque votre backend confirme que la commande est réelle à l'aide d'un webhook signé. Cela garantit que les récompenses restent liées à des ventes réelles et payées.

Cette étape est la même, que votre front-end soit un [site web](/fr/guides/platforms/custom/web/) ou une [application mobile](/fr/guides/platforms/custom/mobile/).

## Comment ça marche

1. **Le front-end enregistre la commande.** La carte post-achat, `trackPurchaseStatus` ou l'appel d'achat du SDK mobile envoie `customerId`, `orderId` et `token` pour que Frak commence à écouter cette commande.

2. **Votre backend la confirme.** Lorsque la commande est payée (ou remboursée, annulée), votre serveur envoie un webhook à Frak avec les mêmes identifiants et une signature HMAC.

3. **Frak déclenche la récompense.** Une fois la signature vérifiée et le statut égal à `confirmed`, Frak envoie l'interaction `PurchaseCompleted`, qui permet de verser des récompenses en fonction de vos campagnes actives.

## Envoyer le webhook

Votre URL de webhook et votre clé secrète de signature se trouvent dans le [tableau de bord professionnel](https://business.frak.id/), dans la section **Purchase Tracker** de votre espace marchand. Signez l'ensemble du corps de la requête avec HMAC SHA-256 et envoyez-le dans l'en-tête `x-hmac-sha256`.
```ts
import crypto from "node:crypto";

async function sendPurchaseWebhook(order: {
  id: string;
  customerId: string;
  status: "pending" | "confirmed" | "cancelled" | "refunded";
  token: string;
  currency?: string;
  totalPrice?: string;
}) {
  const body = JSON.stringify(order);
  const hmac = crypto
    .createHmac("sha256", process.env.FRAK_WEBHOOK_SECRET)
    .update(body)
    .digest("hex");

  await fetch(process.env.FRAK_WEBHOOK_URL, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-hmac-sha256": hmac,
      // Use "true" while testing, "false" in production
      "x-test": "false",
    },
    body,
  });
}

await sendPurchaseWebhook({
  id: "order_456",
  customerId: "cust_123",
  status: "confirmed",
  token: "a-unique-order-token",
  currency: "EUR",
  totalPrice: "99.99",
});
```

```php
function sendPurchaseWebhook(array $order): void {
    $url = getenv('FRAK_WEBHOOK_URL');
    $secret = getenv('FRAK_WEBHOOK_SECRET');

    $body = json_encode($order);
    $hmac = hash_hmac('sha256', $body, $secret);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $body,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'x-hmac-sha256: ' . $hmac,
            'x-test: false', // "true" while testing
        ],
    ]);
    curl_exec($ch);
    curl_close($ch);
}

sendPurchaseWebhook([
    'id' => 'order_456',
    'customerId' => 'cust_123',
    'status' => 'confirmed',
    'token' => 'a-unique-order-token',
    'currency' => 'EUR',
    'totalPrice' => '99.99',
]);
```

**Les identifiants doivent correspondre:** L'identifiant `id` du webhook correspond à la même valeur que l'ID de commande envoyé par votre front-end, et `customerId` ainsi que `token` doivent correspondre aux valeurs que vous avez envoyées lors du suivi. S'ils diffèrent, Frak ne pourra pas lier la confirmation à la commande et aucune récompense ne sera déclenchée.

Consultez la [référence du webhook d'achat](/developers/api/webhook/) pour voir la charge utile complète (y compris les articles de la commande) et l'endpoint de [suivi des achats](/developers/api/track-purchase/) pour l'appel côté page.

## Étapes suivantes

[Ajouter des fonds](/fr/guides/dashboard/configure/funds/)
  [Créer une campagne](/fr/guides/campaigns/create/)
  [Référence du webhook d](/developers/api/webhook/)