Accepter un paiement
Acceptez des paiements en toute sécurité avec votre application MCP.
Vous pouvez collecter des paiements en dehors de votre application à l’aide d’une page de paiement hébergée par Stripe. Ce guide explique comment :
- Définissez des outils Model Context Protocol (MCP) pour afficher des produits et permettre aux clients de sélectionner des éléments à acheter.
- Collectez les informations de paiement avec une page de paiement préconfigurée et hébergée par Stripe
- Surveillez les webhooks après un paiement réussi
Configurer Stripe
Pour configurer Stripe, ajoutez la bibliothèque Stripe API à votre back-end.
Créer des produits et tarifs
Dans cet exemple, vous pouvez afficher un groupe de produits dans l’application MCP. Découvrez comment créer des produits et des prix dans le Dashboard ou à l’aide de l’interface en ligne de commande Stripe.
Enregistrez un outil MCP pour Checkout
Enregistrez un outil MCP qui crée une session Checkout pour un ensemble de Prices. Cet outil est appelé depuis l’application MCP lors d’une étape ultérieure.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, } from "@modelcontextprotocol/ext-apps/server"; import { readFileSync } from "node:fs"; import Stripe from "stripe"; import { z } from "zod"; const stripe = new Stripe() const server = new McpServer({ name: "my-mcp-server", version: "1.0.0" }); const resourceUri = "ui://list-products.html"; async function createCheckoutSession(priceIds) { const lineItems = priceIds.map((price) => ({ price, quantity: 1 })); const session = await stripe.checkout.sessions.create({ mode: "payment", line_items: lineItems, success_url: "https://example.com/checkout/success", }); return session; } // Register the tool that creates a checkout session server.registerTool( "buy-products", { title: "Buy products", description: "Create a checkout page link for purchasing the selected products", inputSchema: { priceIds: z.array(z.string()) }, }, async ({ priceIds }) => { const session = await createCheckoutSession(priceIds); return { content: [ { type: "text", text: `[Complete your purchase here](${session.url})`, }, ], structuredContent: { checkoutSessionId: session.id, checkoutSessionUrl: session.url, }, }; } );"sk_test_BQokikJOvBiI2HlWgH4olfQ2"
Enregistrez un outil et une ressource d’interface utilisateur
Configurez l’interface utilisateur de votre application MCP en enregistrant un outil MCP et une ressource. Cette interface utilisateur :
- Affiche la liste des produits
- Permet au client de sélectionner les produits à acheter
- Rediriger vers la page Stripe Checkout pour finaliser le paiement
Enregistrez un outil MCP de liste des produits
Créez un outil MCP de liste des produits. Sa fonction de rappel renvoie les ID de prix des produits à afficher dans l’interface utilisateur.
registerAppTool( server, "list-products", { title: "List products", description: "List the products available for purchase", _meta: { ui: { resourceUri } }, }, async () => { const suggestedProducts = [ // The price IDs from the earlier step { priceId:, name: "Test product 1" }, { priceId:"{{PRICE_ID}}", name: "Test product 2" }, ]; return { structuredContent: { products: suggestedProducts }, content: [], }; } );"{{PRICE_ID}}"
Enregistrez une ressource d’interface utilisateur pour la liste des produits
Créez une ressource MCP pour le widget de liste de produits. Elle définit le code de l’interface utilisateur qui affiche les produits.
// Register the resource that serves the bundled HTML registerAppResource( server, "list-products-widget", resourceUri, { mimeType: RESOURCE_MIME_TYPE }, async () => { const html = readFileSync("dist/ui/list-products.html", "utf8"); return { contents: [ { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html, }, ], }; } );
Cet exemple utilise une majoration minimale. Dans une application de production, vous pouvez utiliser un framework tel que React. Consultez la documentation des applications MCP pour découvrir d’autres exemples.
<div id="root"></div> <script type="module" src="/ui/mcp-app.js"></script>
import { App } from "@modelcontextprotocol/ext-apps"; const app = new App({ name: "ProductList", version: "1.0.0" }); // Establish communication with the host await app.connect(); /** * UI markup and event handlers */ const renderProduct = (product) => { return ` <label> <input type="checkbox" name="cart[]" value="${product.priceId}"> ${product.name} </label> `; }; const handleSubmit = async (event) => { // We'll fill this in next } const renderApp = (products) => { const root = document.querySelector("#root"); root.innerHTML = ` <h1>Select products to purchase</h1> <form id="product-form"> ${products.map(renderProduct).join("")} <button type="submit">Buy</button> </form> `; document .querySelector("#product-form") ?.addEventListener("submit", handleSubmit); }; /** * Render the list of products from the tool's structuredContent */ app.ontoolresult = (params) => { const { products } = params.structuredContent ?? {}; if (products) { renderApp(products); } };
Rediriger vers Checkout
Lorsque le client clique sur Acheter dans l’application MCP :
- Appelez l’outil que vous avez créé pour acheter un produit afin de générer une URL de session Checkout.
- Ouvrez l’URL de la session Checkout.
Mettez à jour la fonction handleSubmit :
const handleSubmit = async (event) => { event.preventDefault(); const formData = new FormData(event.target); const priceIds = Array.from(formData.values()); // Call the buy-products tool to create a Checkout Session const { structuredContent } = await app.callServerTool({ name: "buy-products", arguments: { priceIds }, }); if (typeof structuredContent?.checkoutSessionUrl === "string") { await app.openLink({ url: structuredContent.checkoutSessionUrl }); } };
Gérez les commandes réussies
Vous pouvez gérer les commandes réussies en écoutant l’événement checkout. (et checkout. pour les moyens de paiement différés), puis en appelant une fonction de réalisation idempotente qui récupère la session Checkout (en utilisant le paramètre expand pour inclure line_), vérifie payment_status et traite les éléments.
Utilisez une page d’accueil success_ pour déclencher la réalisation immédiatement après la redirection, mais appuyez-vous sur des webhooks pour vous assurer que chaque paiement est traité.
Vous pouvez ensuite effectuer des tests en local avec l’interface en ligne de commande Stripe, puis déployer votre endpoint de webhook.
Découvrez comment traiter les paiements reçus avec l’API Checkout Sessions.