Skip to main content
Glama
stripe.ts3.54 kB
import Stripe from 'stripe'; import express from 'express'; // ============================================ // Configuration // ============================================ const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16', // Update to latest }); const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET!; // ============================================ // Services // ============================================ export const stripeService = { // Create Checkout Session async createCheckoutSession(priceId: string, customerId?: string) { const session = await stripe.checkout.sessions.create({ mode: 'subscription', // or 'payment' payment_method_types: ['card'], line_items: [ { price: priceId, quantity: 1, }, ], customer: customerId, success_url: `${process.env.DOMAIN}/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${process.env.DOMAIN}/cancel`, }); return session; }, // Create Customer Portal Session async createPortalSession(customerId: string) { const session = await stripe.billingPortal.sessions.create({ customer: customerId, return_url: `${process.env.DOMAIN}/account`, }); return session; }, // Get Customer Subscription async getSubscription(customerId: string) { const subscriptions = await stripe.subscriptions.list({ customer: customerId, status: 'active', limit: 1, }); return subscriptions.data[0] || null; } }; // ============================================ // Webhook Handler // ============================================ export const webhookHandler = async (req: express.Request, res: express.Response) => { const sig = req.headers['stripe-signature']; let event: Stripe.Event; try { event = stripe.webhooks.constructEvent( req.body, // Must be raw buffer sig!, endpointSecret ); } catch (err: any) { console.error(`Webhook Error: ${err.message}`); return res.status(400).send(`Webhook Error: ${err.message}`); } // Handle the event try { switch (event.type) { case 'checkout.session.completed': { const session = event.data.object as Stripe.Checkout.Session; // Provision access, update database, send email console.log('Payment successful for session:', session.id); break; } case 'customer.subscription.updated': { const subscription = event.data.object as Stripe.Subscription; // Update subscription status in DB console.log('Subscription updated:', subscription.id); break; } case 'customer.subscription.deleted': { const subscription = event.data.object as Stripe.Subscription; // Revoke access console.log('Subscription canceled:', subscription.id); break; } default: console.log(`Unhandled event type ${event.type}`); } } catch (error) { console.error('Error processing webhook:', error); return res.status(500).send('Error processing webhook'); } res.json({ received: true }); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/millsydotdev/Code-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server