Checkout hébergé

Faites une demande dans les paramètres, attendez l'approbation, puis créez une session et envoyez les acheteurs vers une page de paiement RMT. Vous exécutez après order.paid. Les partenaires approuvés paient 4% du montant verrouillé.

Acceptez des paiements depuis votre propre boutique. RMT.GG est le commerçant enregistré. Utilisez l'API Vendeur pour diriger les acheteurs vers une page de paiement RMT.

Comment fonctionne le checkout hébergé

RMT.GG reste le commerçant enregistré. Votre boutique partenaire envoie un montant et une devise bloqués. L'acheteur paie sur notre page hébergée. Après le paiement, vous livrez dans votre boutique. Les commandes se complètent automatiquement pour que le règlement du portefeuille puisse s'effectuer.

  • L'acheteur paie exactement le montant et la devise que vous envoyez. Nous ne majorons pas.
  • Votre frais de vendeur est de 4 % de ce montant bloqué. Les annonces sur le marketplace restent à 5 % comme d'habitude.
  • Les frais de traitement par carte, PayPal et crypto sont absorbés par la plateforme dans ce flux.

Liste blanche requise

Postulez sous Paramètres, Checkout hébergé, puis attendez l'approbation de l'administrateur. Les clés API non approuvées reçoivent CHECKOUT_PARTNER_NOT_APPROVED.

Postulez et obtenez l'approbation

Après approbation, créez une clé API avec checkout:write et un webhook JSON pour checkout.completed sur la page des paramètres de paiement hébergé. Jusqu'à approbation, les API de paiement hébergé restent bloquées.

  1. 1Ouvrez Paramètres → Checkout hébergé et soumettez l'URL de votre boutique ainsi qu'une courte note sur la façon dont vous utiliserez le checkout.
  2. 2Attendez qu'un administrateur approuve. Vous verrez un badge en attente d'ici là.
  3. 3Après approbation, créez une clé API et un webhook JSON pour checkout.completed dans Paramètres → Paiement hébergé.

API Vendeur

Utilisez ceci depuis n'importe quelle boutique ou votre propre serveur. Créez une session avec POST /api/v1/checkout/sessions. Envoyez checkout:write et un Idempotency-Key. Redirigez l'acheteur vers hosted_url. Écoutez order.paid, puis exécutez dans votre boutique.

Créer une session de checkout hébergé

bash
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: inv-12345" \
  https://rmt.gg/api/v1/checkout/sessions \
  -d @session.json

session.json

javascript
{
  amount: 10, // required when items is omitted
  currency: "USD", // optional; defaults to USD
  itemName: "Gold pack", // required when items is omitted; alias title
  description: "1000 gold for account example", // optional
  imageUrl: "https://cdn.shop.example/gold.png", // optional, HTTPS only
  categorySlug: "games", // send with offering, or omit both
  offering: "Mods", // send with categorySlug
  email: "[email protected]", // optional
  returnUrl: "https://your-shop.example/thanks", // optional
  cancelUrl: "https://your-shop.example/cancel", // optional
  invoiceId: "12345" // optional
}

Plusieurs lignes verrouillées avec livraison optionnelle (session.json)

javascript
{
  currency: "USD",
  invoiceId: "12345", // optional
  items: [ // required when amount is omitted
    {
      name: "Gold pack", // required per line
      description: "1000 gold", // optional
      amount: 10, // required per line
      quantity: 1, // optional, default 1
      imageUrl: "https://cdn.shop.example/gold.png", // optional, HTTPS only
      delivery: [ // optional
        { name: "Code", type: "text", value: "XXXX-YYYY" } // name and value required; type is optional
      ]
    }
  ]
}
  • Envoyez le montant plus itemName (ou titre) pour un seul article, ou un tableau items[] non vide. La devise par défaut est l'USD. Champs optionnels : description, imageUrl HTTPS, email (pré-remplit la page de paiement), returnUrl, cancelUrl, invoiceId, categorySlug plus offering (envoyez les deux ou aucun), et metadata. itemName est le titre de la page de paiement ; description est le texte plus long en dessous. L'acheteur doit confirmer un email valide avant de payer. Après le paiement, l'acheteur reste sur la confirmation RMT.GG afin qu'il puisse copier les champs de livraison. Si vous définissez returnUrl et qu'il y a des champs de livraison, ils continuent vers votre boutique depuis cet écran. S'il n'y en a pas, nous les renvoyons après un court compte à rebours. Si vous omettez returnUrl ou cancelUrl, l'acheteur reste sur la page de paiement RMT.GG après le paiement, l'annulation ou l'expiration.
  • En cas de succès, nous ajoutons l'uid de la commande à returnUrl sous forme de ?order= lorsque cette URL est HTTPS (ou localhost).
  • Répéter les valeurs Idempotency-Key ou invoiceId réutilise la même session au lieu de créer un duplicata.
  • itemName et description apparaissent uniquement sur la page de paiement RMT. Les paiements par carte, PayPal et crypto utilisent des étiquettes codées par catalogue comme Jeux · Extensions, jamais le titre de votre boutique. Définissez un défaut sous Paramètres, Paiement hébergé, ou envoyez categorySlug et l'offre lors de la session.
  • Les sessions durent 24 heures. Après cela, la page de paiement ne peut pas être complétée, les sessions Stripe et PayPal en cours sont fermées, et nous envoyons POST checkout.canceled avec la raison expirée.
  • items[] est l'alternative multi-lignes à un seul montant plus itemName. Chaque ligne nécessite un nom et un montant. Avec items, le montant peut être omis et est calculé à partir des lignes, ou doit correspondre à la somme si vous l'envoyez. La quantité est verrouillée sur rmt.gg : les acheteurs ne peuvent pas ajouter, supprimer ou modifier des lignes. imageUrl doit être HTTPS ; nous ne le récupérons pas. Les champs de livraison optionnels (texte, mot de passe ou zone de texte) nécessitent un nom et une valeur. Ils sont affichés après le paiement sur la page de confirmation et Achats. La requête GET publique de session inclut les valeurs de livraison uniquement après le paiement. Les requêtes GET du vendeur et les webhooks ne les incluent jamais.

Vérifiez le statut du paiement

Écoutez d'abord pour checkout.completed. Si un webhook est retardé, GET la session. paid est vrai lorsque l'acheteur a payé. Vous pouvez rechercher par uid de session ou par l'invoiceId que vous avez envoyé.

  • GET /api/v1/checkout/sessions/{uid} en utilisant l'uid retourné lorsque vous avez créé la session.
  • GET /api/v1/checkout/sessions?invoiceId=YOUR_INVOICE_ID si vous avez stocké votre propre id de facture à la place.

Recherchez par id de facture

bash
curl -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1/checkout/sessions?invoiceId=inv-12345

Digiseller et boutiques similaires

Ignorez ceci si vous créez des paiements avec l'API Seller. Utilisez-le lorsque votre boutique (par exemple Digiseller) envoie l'acheteur ici via une méthode de paiement personnalisée. Digiseller envoie à notre URL de paiement, nous prenons le paiement, puis Digiseller vérifie l'URL de statut.

  1. 1Copiez l'URL de paiement, l'URL de statut et le secret de paiement depuis Paramètres → Paiement hébergé.
  2. 2Collez-les dans Digiseller comme méthode de paiement personnalisée. Gardez le secret privé.
  3. 3Digiseller envoie ensuite les acheteurs chez nous pour payer, et vérifie l'URL de statut pour savoir si c'est payé ou non.
  • item_name (ou titre) est le titre sur la page de paiement. description est le texte plus long en dessous. Si les deux noms sont omis, description est utilisé comme titre.

Exemple de requête envoyée par Digiseller

json
{
  "invoice_id": "12345",
  "amount": "10.00",
  "currency": "EUR",
  "item_name": "Pack d'or",
  "description": "1000 or pour exemple de compte",
  "signature": "…"
}

Préférez un webhook JSON

L'URL de statut est pour Digiseller. Si vous exécutez depuis votre propre serveur, ajoutez un webhook JSON et écoutez pour checkout.completed. Vous pouvez également GET la session en tant que sauvegarde.

webhooks JSON

Le paiement hébergé n'utilise pas une API webhook séparée. Sous Développeur, pointez un endpoint JSON HTTPS sur les mêmes événements que les ventes du marché. Après le paiement, nous POST order.paid. Après un remboursement, nous POST order.refunded. Associez la vente avec externalInvoiceId (votre invoiceId) ou partnerSessionUid.

payload order.paid (champs de paiement hébergé)

json
{
  "id": "whd_…",
  "type": "order.paid",
  "created": "2026-08-14T12:00:00.000Z",
  "data": {
    "order": {
      "uid": "ord_…",
      "status": "PAYÉ",
      "partnerSessionUid": "…",
      "externalInvoiceId": "inv-12345",
      "partnerSource": "api"
    }
  }
}
  • source est l'API pour les sessions de l'API Vendeur.
  • La signature optionnelle utilise X-RMT-Timestamp et X-RMT-Signature. Vérifiez HMAC de la même manière que tout autre webhook vendeur.
  • checkout.canceled inclut la raison buyer_canceled lorsque l'acheteur quitte la page de paiement sans payer, ou la raison expired lorsque la durée de vie de la session de 24 heures expire sans paiement.
  • checkout.items liste les lignes verrouillées (nom, description, amount, quantity, imageUrl). Les valeurs de livraison ne sont jamais incluses dans les webhooks.

Ne pas remplir deux fois

Digiseller reçoit également son propre rappel de paiement. Si vous écoutez également pour checkout.completed, exécutez la commande une seule fois. Les sessions de l'API Seller n'envoient jamais ce rappel Digiseller.

Email invité et reçus

Les acheteurs doivent entrer un email sur la page de paiement afin que nous puissions envoyer le reçu et la facture fiscale. Les comptes RMT correspondants sont attachés sans connecter l'acheteur.

  • Si l'email appartient déjà à un compte RMT, la commande apparaît dans les Achats de ce compte. Aucun cookie de connexion n'est défini sur la page de paiement.
  • Un nouvel email crée un utilisateur léger afin que les reçus et la connexion ultérieure fonctionnent toujours.
  • Un email est requis pour finaliser le paiement. Votre boutique doit toujours écouter checkout.completed.

Devises et limites

Utilisez une devise ISO prise en charge comme USD ou EUR. Le paiement par carte fonctionne mieux en USD ou EUR. Les crypto-monnaies et PayPal peuvent encore fonctionner pour d'autres devises lorsque le fournisseur les accepte.

Pas dans cette version

Il n'y a pas de SDK iframe, de domaine de page de paiement personnalisé ou de solde de portefeuille sur la page de paiement hébergée. Les acheteurs utilisent le paiement par carte, PayPal ou la redirection de paiement crypto.

Avant de passer en direct

Liste de contrôle de staging

Les tests unitaires couvrent les frais, le HMAC et la réutilisation. Parcourez cette liste en staging avant d'envoyer de vrais acheteurs.

  • Postulez, confirmez le badge en attente, puis faites approuver par un administrateur. Les identifiants apparaissent uniquement lorsqu'ils sont approuvés. Une clé non approuvée sur POST /api/v1/checkout/sessions renvoie 403.
  • Créez une session avec itemName, description et categorySlug plus offering (ou un défaut enregistré). Ouvrez hosted_url. Le titre est le nom de l'objet ; la description est en dessous. La page de paiement n'a pas de navigation supérieure ni de barre latérale. Payez par carte en USD ou EUR. Les pages de carte, PayPal et crypto devraient afficher une étiquette de catalogue comme Jeux · Extensions, pas le titre de votre boutique.
  • Confirmez que checkout.completed inclut invoiceId, checkout.uid, et source, puis exécutez dans votre boutique. Annulez la page de paiement et confirmez checkout.canceled avec la raison buyer_canceled. Laissez une session dépasser 24 heures et confirmez que checkout.canceled avec la raison expired ne peut plus être payé.
  • Pour Digiseller, collez l'URL de paiement, l'URL de statut et le secret de paiement dans une méthode de paiement personnalisée. Confirmez que Digiseller peut voir le statut payé, et que vous exécutez la commande une seule fois.
  • Payez avec un email RMT existant : la commande arrive dans Achats et un reçu est envoyé, sans cookie de connexion. Un nouvel email crée un utilisateur léger. Un email est requis sur la page de paiement.
  • L'offre synthétique cachée ne doit pas apparaître dans la recherche du marché. Sur un hôte avec liste d'attente, /pay/:uid et les routes d'adaptateur fonctionnent toujours.
  • Envoyez imageUrl optionnel et items[] si vous avez besoin d'une image de produit ou de plusieurs lignes verrouillées. Confirmez que la page de paiement n'a pas de contrôles de quantité. Après le paiement, les champs de livraison apparaissent dans Achats et sur la page de commande. URLs d'images HTTPS uniquement.

Guides connexes

Postulez pour le checkout hébergé

Ouvrez Paramètres → Checkout hébergé pour postuler, ou passez à la référence API après avoir été approuvé.