L'utiliser sans le bouton d'achat
Le bouton d'achat est une couche de commodité. En dessous, Coin Moebius est un webhook loué plus quelques endpoints JSON. Si vous préférez construire votre propre interface, faire tourner votre propre flux de paiement, ou brancher Coin Moebius sur quelque chose que le bouton ne peut pas gérer (abonnements Square ou Authorize.Net, un formulaire de paiement personnalisé, un script côté serveur, une application mobile), chaque endpoint que le bouton utilise est aussi appelable depuis n'importe quoi. Aucun changement de code de notre côté.
Authentifier les appels backend
Les appels que vous faites depuis votre propre serveur peuvent porter la clé d'API de votre projet comme bearer token. Créez une clé dans le tableau de bord, sous les clés d'API de votre projet (elle commence par cmk_), et envoyez-la dans l'en-tête Authorization :
Authorization: Bearer cmk_live_xxxxxxxxxxxxxxxxxxxxxxxxLa clé est liée à un seul projet, et les appels authentifiés obtiennent une limite de débit plus élevée que les appels anonymes. Le bouton d'achat lui-même est public et n'a besoin d'aucune clé. Gardez votre clé sur votre serveur. Ne la mettez jamais dans le navigateur ni dans d'autre code côté client.
Tous ces endpoints vivent sous l'URL de votre projet. En production, cette base est https://api.coinmoebius.com. L'URL complète de chacun est indiquée ci-dessous (remplacez les parties {…} par vos propres valeurs).
| Endpoint | Ce qu'il fait |
|---|---|
POST https://api.coinmoebius.com/api/checkout/{provider}/{projectId} | Démarre un paiement. POST { productId, metadata } ; recevez en retour ce dont le fournisseur a besoin (une URL de redirection pour Stripe, une URL d'approbation pour PayPal, un token pour Authorize.Net Accept Hosted). Affichez-le comme vous voulez. |
POST https://api.coinmoebius.com/webhook/{provider}/{projectId} | Le fournisseur poste ici. Nous vérifions la signature, normalisons l'événement, le stockons, comptons le quota. Pointez le webhook du fournisseur vers cette URL, que le paiement initial vienne de notre bouton ou de votre propre intégration. |
GET https://api.coinmoebius.com/status/{projectId}/{txId} | Sondez l'état actuel d'un paiement ou d'un abonnement. Renvoie le même format normalisé que le bouton d'achat obtient. |
POST https://api.coinmoebius.com/api/subscriptions/{projectId}/{subscriptionId}/portal-url | Génère une URL de portail hébergé par le fournisseur pour que l'acheteur gère son abonnement. Fonctionne pour tout fournisseur qui a un portail. |
Identifiez l'acheteur dans votre propre système en transmettant metadata.customerRef sur l'appel de paiement. Il passe par le fournisseur et revient sur chaque événement de webhook, pour que vous puissiez relier les registres de Coin Moebius à votre propre base de données d'utilisateurs sans que nous stockions quoi que ce soit sur l'acheteur.
Pourquoi quelqu'un utilise cette voie : un créateur de site statique qui veut écrire son propre bouton pour l'accorder au design de son site et a juste besoin que le webhook soit géré. Un développeur qui veut sauter complètement le bouton et appeler l'API depuis son propre serveur. Un commerçant qui veut faire tourner des abonnements Square ou Authorize.Net et accepte de câbler lui-même la collecte de carte. Le bouton est un point de départ. L'API est le vrai produit.
Écouter les événements de l'acheteur
L'élément émet trois événements de navigateur. Écoutez avec addEventListener sur l'élément (ou sur document, les événements remontent). Tous les événements sont annulables, appeler event.preventDefault() arrête le flux par défaut.
| Événement | Quand il se déclenche | Charge utile detail |
|---|---|---|
cm-load-providers | La fenêtre du sélecteur est sur le point de demander à l'API la liste des fournisseurs configurés sur ce projet. | Vide. |
cm-checkout-started | L'acheteur a choisi un fournisseur et Coin Moebius est sur le point de créer une session de paiement (Stripe / NOWPayments) ou de générer un code de référence (manual). | { provider: 'stripe' | 'nowpayments' | 'manual', ... } |
cm-error | Quelque chose a échoué : erreur réseau, échec de signature, aucun fournisseur configuré. | { error: Error } |
document.addEventListener('cm-error', (event) => {
console.error('Coin Moebius:', event.detail.error);
// Show your own error UI, send to your analytics, etc.
});Il n'y a pas d'événement cm-success dans le navigateur de l'acheteur. Au moment où le paiement se finalise vraiment, l'acheteur a été redirigé vers le paiement hébergé du fournisseur (Stripe Checkout, page de facture NOWPayments). Il revient sur votre site via le success_url que vous avez configuré (voir la section suivante), et votre serveur apprend le paiement via le tableau de bord ou en sondant l'endpoint /status.
Sondage depuis votre backend
Pour une source de vérité côté serveur, sondez GET /status/:projectId/:txId depuis votre backend. Le format de réponse :
{
"status": "succeeded",
"amount": 29.99,
"currency": "USD",
"isTest": false,
"createdAt": "2026-05-14T01:04:21.000Z",
"updatedAt": "2026-05-14T01:04:21.000Z"
}Les valeurs de statut suivent le même enum que le tableau de bord (voir Statuts de transaction). L'endpoint est non authentifié mais limité à 60 requêtes / minute par IP. L'identifiant de transaction que vous passez est celui que le SDK a renvoyé dans l'événement cm-checkout-started ou celui affiché dans la colonne Référence du tableau de bord.
Un schéma typique : quand votre page success_url se charge, lancez une tâche backend qui sonde /status/:projectId/:txId toutes les 15 secondes jusqu'à voir succeeded (ou failed / un délai dépassé), puis traitez la commande.