import Stripe from 'stripe'; import dotenv from 'dotenv'; dotenv.config(); const stripe = new Stripe(process.env.STRIPE_SECRET); export default class PaymentsHandler { static async finishConnectSetup(req, res) { const { code, networkId } = req.body; const response = await stripe.oauth.token({ grant_type: "authorization_code", code, }); const { stripe_user_id, access_token } = response; await db.networks.update( networkId, { stripeAccountId: stripe_user_id, stripeAccessToken: access_token, // rarely used, long-term access token for the platform } ); res.json({ success: true }); } static async getProfile(networkId) { let network = global.db.networks.get(networkId) if (network) { if (network.stripeAccountId) { const account = await stripe.accounts.retrieve(network.stripeAccountId); return { chargesEnabled: account.charges_enabled, payoutsEnabled: account.payouts_enabled, detailsSubmitted: account.details_submitted, email: account.email, country: account.country, } } else { return { connected: false } } } else { throw new Error(`Network ${networkId} not found`) } } static async getCustomers(networkId) { let network = global.db.networks.get(networkId) if(!network.stripeAccountId) { throw new Error("Can't get customers for account that doesn't exist!") } const customers = await stripe.customers.list( { limit: 100, expand: ['data.subscriptions'] }, { stripeAccount: network.stripeAccountId } ); console.log(customers) return customers.data.map(customer => ({ id: customer.id, email: customer.email, created: customer.created, name: customer.name, phone: customer.phone, city: customer.address?.city, subscriptions: customer.subscriptions?.data.map(sub => ({ id: sub.id, status: sub.status, amount: sub.items.data[0]?.price.unit_amount / 100, // converts cents to dollars currency: sub.items.data[0]?.price.currency, interval: sub.items.data[0]?.price.recurring?.interval })) })) } static async newSubscription(req, res) { try { const session = await stripe.checkout.sessions.create({ mode: "payment", payment_method_types: ["card"], metadata: { productId: "50_month_sub" }, line_items: [ { price_data: { currency: "usd", product_data: { name: "Monthly Subscription" }, unit_amount: 5000 }, quantity: 1 } ], success_url: `${process.env.PROTOCOL + process.env.BASE_URL}/success`, cancel_url: `${process.env.PROTOCOL + process.env.BASE_URL}/events` }); res.json({ url: session.url }); } catch (err) { console.error(err); res.status(500).json({ error: "Something went wrong." }); } } static webhook = (req, res) => { const sig = req.headers["stripe-signature"]; try { const event = stripe.webhooks.constructEvent( req.body, sig, process.env.WEBHOOK_SECRET ); if (event.type === "checkout.session.completed") { const session = event.data.object; let toStore = { "product": session.metadata.productId, "email": session.customer_details.email, "name": session.customer_details.name, "time": global.currentTime(), "amount": session.amount_total, } global.db.payments.add(toStore) } res.sendStatus(200); } catch (err) { console.error(err); res.sendStatus(400); } } }