# Démarrage rapide (/fr/online/getting-started/quick_start_guide)



Le Hosted Checkout vous fournit une page de paiement prête à l’emploi pour les cartes, Apple Pay et Google Pay. Votre serveur crée une session pour une commande, le client paie, et votre serveur confirme le résultat avant de traiter la commande. L’Embedded Checkout intègre des champs de carte sécurisés directement dans votre propre page.

Essayez les deux flux ci-dessous. La carte de test est déjà renseignée : sélectionnez **Pay** et suivez le paiement jusqu’au bout, ou essayez Apple Pay ou Google Pay. Les deux sont des répliques, rien ne quitte donc votre navigateur.

<Tabs defaultValue="hosted" className="my-6 overflow-visible rounded-none border-0 bg-transparent">
  <TabsList className="px-0">
    <TabsTrigger value="hosted">
      Hosted Checkout
    </TabsTrigger>

    <TabsTrigger value="embedded">
      Champs intégrés
    </TabsTrigger>
  </TabsList>

  <TabsContent value="hosted" className="rounded-none bg-transparent px-0 pt-6 pb-0">
    <HostedCheckoutDemo />
  </TabsContent>

  <TabsContent value="embedded" className="rounded-none bg-transparent px-0 pt-6 pb-0">
    <EmbeddedCheckoutDemo />
  </TabsContent>
</Tabs>

## Choisir comment vos clients paient [#choose-how-customers-pay]

<CheckoutComparison />

<Callout title="Disponibilité" type="info">
  Le Checkout est en production pour les commerçants approuvés. Le Hosted Checkout et l’Embedded Checkout prennent tous deux en charge les cartes, Apple Pay et Google Pay. La disponibilité des portefeuilles dépend des [paramètres du Checkout](/online/integration/checkout_settings), de l’enregistrement du domaine ainsi que de l’appareil et du navigateur du client. L’Embedded Checkout utilise Tapaya.js **0.2.0** et le SDK Node.js **0.3.0**. Commencez dans la sandbox, puis suivez [Passer en production](#go-live).
</Callout>

## Accepter un paiement [#accept-a-payment]

<div className="fd-steps [&_h3]:fd-step">
  ### Effectuez l’onboarding de votre commerçant [#onboard-your-merchant]

  Effectuez l’[onboarding du commerçant](/merchants/onboarding) avec la fonctionnalité de paiements en ligne, ou avec les paiements en ligne et en magasin. Un commerçant qui utilise uniquement le Checkout n’a pas besoin de terminal. Indiquez le site web de la boutique et les informations sur l’activité en ligne, puis attendez l’approbation du processeur. La seule création d’une fiche commerçant ou d’une clé API n’active pas les paiements.

  Ouvrez **Checkout** dans la [Tapaya Platform](https://platform.tapaya.com/checkout-settings). Les commerçants qui demandent les paiements en ligne y apparaissent automatiquement, y compris ceux en attente d’approbation. Poursuivez lorsque le commerçant est **Ready**.

  Ouvrez les **Settings** du commerçant. Sous **Merchant API key redirects**, ajoutez votre boutique à **Allowed websites** et définissez les URL de succès et d’annulation par défaut. Une plateforme qui utilise la Secret key de l’organisation les définit plutôt sous **Organization defaults**. Les exemples utilisent `https://shop.example`. Consultez les [paramètres du Checkout](/online/integration/checkout_settings) pour les portefeuilles et l’image de marque.

  ### Stockez votre clé sur le serveur [#store-your-key-on-the-server]

  Dans les **Settings** du commerçant, sélectionnez **Create merchant key** et copiez la clé `tapaya_test_…`. Elle ne s’affiche qu’une seule fois. Conservez-la uniquement dans la configuration côté serveur. Elle n’a jamais sa place dans le code du navigateur ni dans le gestionnaire de versions.

  ```bash title=".env"
  TAPAYA_ENVIRONMENT=sandbox
  TAPAYA_CHECKOUT_API_URL=https://api.sandbox.tapaya.com
  TAPAYA_SECRET_KEY=tapaya_test_...
  ```

  Le SDK lit automatiquement `TAPAYA_SECRET_KEY` et `TAPAYA_ENVIRONMENT`. Les exemples HTTP ci-dessous utilisent `TAPAYA_CHECKOUT_API_URL`. Chargez les variables dans le processus de votre serveur ; le SDK ne charge pas les fichiers `.env`.

  Envoyez la clé sous la forme `Authorization: Bearer <key>`. Une clé de commerçant sélectionne son commerçant, aucun autre en-tête n’est donc nécessaire. Une plateforme qui sert de nombreux commerçants utilise plutôt la Secret key de l’organisation et envoie `X-Tapaya-Merchant-Token` dans chaque requête. Voir [Authentification du Checkout](/online/integration/api_integration#authentication).

  ### Créez une session Checkout [#create-a-checkout-session]

  Lorsque le client clique sur **Checkout** dans votre boutique, calculez le total final sur votre serveur, enregistrez la commande avec une clé de tentative unique et créez une session. `merchantOrderId` est obligatoire, et une commande ne peut être payée qu’une seule fois. Les montants sont exprimés en unités mineures : `12100` correspond donc à 121,00 EUR.

  Pour Node.js 22.13.0 ou version ultérieure, installez le SDK ESM avant d’utiliser l’exemple **Node.js SDK** :

  <CodeBlockTabs defaultValue="npm" groupId="package-manager">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="npm">
        npm
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="pnpm">
        pnpm
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="bun">
        Bun
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="npm">
      ```sh
      npm install @tapayadot/checkout
      ```
    </CodeBlockTab>

    <CodeBlockTab value="pnpm">
      ```sh
      pnpm add @tapayadot/checkout
      ```
    </CodeBlockTab>

    <CodeBlockTab value="bun">
      ```sh
      bun add @tapayadot/checkout
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  <CodeBlockTabs defaultValue="fetch" groupId="quick-start-server">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="fetch">
        HTTP (fetch)
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="node">
        Node.js SDK
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="fetch">
      ```js title="server/checkout.js"
      const response = await fetch(
        new URL('/merchant/checkout-sessions', process.env.TAPAYA_CHECKOUT_API_URL),
        {
          method: 'POST',
          headers: {
            Authorization: `Bearer ${process.env.TAPAYA_SECRET_KEY}`,
            'Content-Type': 'application/json',
            'Idempotency-Key': order.checkoutAttemptKey,
          },
          body: JSON.stringify({
            merchantOrderId: order.id,
            amount: order.totalInMinorUnits,
            currency: order.currency,
            successUrl: 'https://shop.example/checkout/return',
            cancelUrl: 'https://shop.example/checkout/cancel',
          }),
        },
      );
      if (!response.ok) throw new Error(`Checkout failed (${response.status})`);
      const session = await response.json();
      ```
    </CodeBlockTab>

    <CodeBlockTab value="node">
      ```ts title="server/checkout.ts"
      import { Tapaya } from '@tapayadot/checkout';

      const tapaya = new Tapaya();
      const session = await tapaya.checkout.sessions.create(
      	{
      		merchantOrderId: order.id,
      		amount: order.totalInMinorUnits,
      		currency: order.currency,
      		successUrl: 'https://shop.example/checkout/return',
      		cancelUrl: 'https://shop.example/checkout/cancel',
      	},
      	{ idempotencyKey: order.checkoutAttemptKey },
      );
      ```
    </CodeBlockTab>

    <CodeBlockTab value="curl">
      ```bash title="Terminal"
      curl --request POST "$TAPAYA_CHECKOUT_API_URL/merchant/checkout-sessions" \
        --header "Authorization: Bearer $TAPAYA_SECRET_KEY" \
        --header 'Content-Type: application/json' \
        --header 'Idempotency-Key: order-1001-checkout-1' \
        --data '{
          "merchantOrderId": "order-1001",
          "amount": 12100,
          "currency": "EUR",
          "successUrl": "https://shop.example/checkout/return",
          "cancelUrl": "https://shop.example/checkout/cancel"
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  Si la requête expire, relancez-la avec la **même** clé et le même corps. L’API rejoue la session d’origine au lieu d’en créer une deuxième.

  ### Redirigez le client [#redirect-the-customer]

  Enregistrez `session.id` avec votre commande, puis envoyez le navigateur vers `session.url` avec HTTP 303. Utilisez l’URL exactement telle qu’elle est renvoyée.

  ```ts
  // First persist session.id as the order's checkoutSessionId.
  return Response.redirect(session.url, 303);
  ```

  Tapaya affiche le récapitulatif de la commande et le formulaire de paiement sécurisé, et gère la tokenisation, 3-D Secure et le débit. Après un refus, le client peut essayer une autre carte sur la même page. Les sessions acceptent de nouveaux paiements pendant 30 minutes.

  ### Vérifiez le paiement sur votre serveur [#verify-the-payment-on-your-server]

  Lorsque le client arrive sur votre URL de succès ou d’annulation, récupérez la session avec votre Secret key et comparez-la avec la commande enregistrée. Une redirection seule ne prouve jamais le paiement.

  <CodeBlockTabs defaultValue="fetch" groupId="quick-start-status">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="fetch">
        HTTP (fetch)
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="node">
        Node.js SDK
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="fetch">
      ```js title="server/return.js"
      const response = await fetch(
        new URL(
          `/merchant/checkout-sessions/${encodeURIComponent(order.checkoutSessionId)}`,
          process.env.TAPAYA_CHECKOUT_API_URL,
        ),
        { headers: { Authorization: `Bearer ${process.env.TAPAYA_SECRET_KEY}` } },
      );
      if (!response.ok) throw new Error(`Status check failed (${response.status})`);
      const current = await response.json();
      ```
    </CodeBlockTab>

    <CodeBlockTab value="node">
      ```ts title="server/return.ts"
      import { Tapaya } from '@tapayadot/checkout';

      const tapaya = new Tapaya();
      const current = await tapaya.checkout.sessions.get(order.checkoutSessionId);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  Quelle que soit l’intégration, comparez le résultat avec la commande enregistrée avant de la traiter :

  ```ts
  const matches =
    current.id === order.checkoutSessionId &&
    current.merchantOrderId === order.id &&
    current.amount === order.totalInMinorUnits &&
    current.currency === order.currency;

  if (matches && current.paymentStatus === 'successful') {
    await fulfillOnce(order); // idempotent, safe on repeated visits
  }
  ```

  Si le statut est toujours `unpaid` ou si la récupération échoue, conservez l’ID de session et vérifiez à nouveau. Il n’existe pas encore de webhooks : exécutez donc une tâche de rapprochement pour les clients qui ferment l’onglet avant de revenir.
</div>

## Passer en production [#go-live]

1. Effectuez l’[onboarding du commerçant](/merchants/onboarding) en production avec les paiements en ligne, ou avec les paiements en ligne et en magasin. Indiquez le site web de la boutique et les informations sur l’activité en ligne. Un commerçant existant en magasin a tout de même besoin de l’approbation du processeur pour les paiements en ligne.

2. Vérifiez que le commerçant est **Ready** dans les [paramètres du Checkout](/online/integration/checkout_settings). Cela nécessite un commerçant actif, l’approbation du processeur pour les paiements en ligne et une passerelle de production configurée.

3. Créez une clé checkout de commerçant de production, ou utilisez la Secret key de production de votre organisation avec le jeton du commerçant. Conservez les identifiants de production sur votre serveur.

4. Définissez l’origine de l’API et l’environnement de production. Remplacez la configuration de la sandbox dans votre déploiement :

   ```bash title="Production server configuration"
   TAPAYA_ENVIRONMENT=production
   TAPAYA_CHECKOUT_API_URL=https://api.tapaya.com
   TAPAYA_SECRET_KEY=tapaya_live_...
   ```

   Les exemples HTTP utilisent `TAPAYA_CHECKOUT_API_KEY` ; définissez-la également avec votre clé de production. Utilisez l’URL de session exactement telle qu’elle est renvoyée. Les pages hébergées de production s’ouvrent sur `https://checkout.tapaya.com`.

5. Configurez vos URL de retour de production pour le Hosted Checkout. Pour Apple Pay en mode intégré, enregistrez chaque domaine de boutique et hébergez son fichier de vérification. Google Pay en production nécessite un Google Pay merchant ID configuré.

6. Parcourez la [liste de contrôle QA](/online/getting-started/checklist), y compris la vérification côté serveur et la tâche de production qui contrôle les paiements non résolus. Utilisez de vrais moyens de paiement en production. Les cartes de test de la sandbox sont réservées à la sandbox.

## Étapes suivantes [#next-steps]

<Cards>
  <Card title="Tests" href="/online/getting-started/testing" description="Cartes de test pour le succès, le refus et 3-D Secure sur la passerelle de la sandbox." />

  <Card title="Hosted Checkout" href="/online/integration/hosted_checkout" description="Le guide serveur complet, avec la gestion des erreurs et les nouvelles tentatives pour chaque approche." />

  <Card title="SDK Node.js" href="/online/integration/node_sdk" description="Options du client, méthodes de session, nouvelles tentatives et erreurs typées." />

  <Card title="Intégration API" href="/online/integration/api_integration" description="Lignes de commande, ventilation des taxes, informations client et tous les statuts de session." />

  <Card title="Paramètres du Checkout" href="/online/integration/checkout_settings" description="Portefeuilles, image de marque et destinations de retour dans la Tapaya Platform." />

  <Card title="Embedded Checkout" href="/online/integration/embedded_checkout" description="Intégrez des champs de carte sécurisés dans votre propre page de paiement et soumettez le paiement depuis votre propre bouton de paiement." />
</Cards>
