boxy/app/lib/stripe.ts
2025-06-25 01:34:47 +05:30

114 lines
3.2 KiB
TypeScript

import { headers } from 'next/headers';
// Helper function to create a payment intent (server-side only)
export async function createPaymentIntent(amount: number, currency: string = 'usd') {
try {
console.log('Creating Stripe payment intent with:', { amount, currency });
// This function should only be called from server-side code
const { default: Stripe } = await import('stripe');
const stripeSecretKey = process.env.STRIPE_SECRET_KEY;
if (!stripeSecretKey) {
throw new Error('STRIPE_SECRET_KEY is not configured');
}
const stripe = new Stripe(stripeSecretKey, {
apiVersion: '2025-05-28.basil',
typescript: true,
});
console.log('Stripe instance created, creating payment intent...');
const paymentIntent = await stripe.paymentIntents.create({
amount: Math.round(amount * 100), // Convert to cents
currency,
automatic_payment_methods: {
enabled: true,
},
});
console.log('Payment intent created:', {
id: paymentIntent.id,
amount: paymentIntent.amount,
currency: paymentIntent.currency,
status: paymentIntent.status
});
return {
clientSecret: paymentIntent.client_secret,
paymentIntentId: paymentIntent.id,
};
} catch (error) {
console.error('Error creating payment intent:', error);
throw error;
}
}
// Helper function to create a checkout session (server-side only)
export async function createCheckoutSession(
boxId: string,
boxName: string,
amount: number,
currency: string = 'usd',
request?: Request
) {
try {
// This function should only be called from server-side code
const { default: Stripe } = await import('stripe');
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: '2025-05-28.basil',
typescript: true,
});
// Determine the base URL dynamically
let baseUrl = process.env.NEXT_PUBLIC_BASE_URL;
if (!baseUrl && request) {
// Fallback: extract from request headers
const headersList = await headers();
const host = headersList.get('host');
const protocol = headersList.get('x-forwarded-proto') || 'http';
if (host) {
baseUrl = `${protocol}://${host}`;
}
}
// Final fallback for development
if (!baseUrl) {
baseUrl = 'http://localhost:3000';
}
console.log('Using base URL for Stripe checkout:', baseUrl);
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [
{
price_data: {
currency,
product_data: {
name: boxName,
description: `Mystery Box Purchase - ${boxName}`,
},
unit_amount: Math.round(amount * 100), // Convert to cents
},
quantity: 1,
},
],
mode: 'payment',
success_url: `${baseUrl}/boxes/success?box_id=${boxId}&session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${baseUrl}/boxes?canceled=true`,
metadata: {
boxId,
},
});
return session;
} catch (error) {
console.error('Error creating checkout session:', error);
throw error;
}
}