49 lines
1.3 KiB
TypeScript
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;
|
|
}
|