Files
2026-03-18 18:26:24 +08:00

49 lines
1.3 KiB
TypeScript

import { createHmac } from 'crypto';
export function verifyWebhookSignature(
payload: string,
signature: string
): boolean {
const secret = process.env.LEMONSQUEEZY_WEBHOOK_SECRET || '';
const hmac = createHmac('sha256', secret);
const digest = hmac.update(payload).digest('hex');
return signature === digest;
}
export async function createCheckout(
variantId: string,
sessionId: string,
email?: string
): Promise<string> {
const response = await fetch('https://api.lemonsqueezy.com/v1/checkouts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.LEMONSQUEEZY_API_KEY}`,
'Content-Type': 'application/vnd.api+json',
'Accept': 'application/vnd.api+json',
},
body: JSON.stringify({
data: {
type: 'checkouts',
attributes: {
checkout_data: {
email: email || undefined,
custom: { session_id: sessionId },
},
},
relationships: {
store: {
data: { type: 'stores', id: process.env.LEMONSQUEEZY_STORE_ID },
},
variant: {
data: { type: 'variants', id: variantId },
},
},
},
}),
});
const data = await response.json();
return data.data.attributes.url;
}