const stripe = require('stripe')(process.env.STRIPE_KEY);
const endpointSecret = process.env.WEBHOOK_SECRET;
function fetchSg(path, opts) {
return fetch(`https://your-business.storeganise.com/api/v1/admin/${path}`, {
method,
headers: {
Authorization: `ApiKey ${process.env.SG_API_KEY}`,
...body && { 'Content-Type': 'application/json' },
},
body: body && JSON.stringify(body),
})
.then(async r => {
const data = await r.json().catch(() => ({}));
if (r.ok) return data;
throw Object.assign(new Error('sg'), { status: r.status, ...data.error });
});
}
export default async (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(JSON.stringify(req.body), sig, endpointSecret);
} catch (err) {
res.statusCode = 400;
res.json({ message: err.message });
return;
}
try {
switch (event.type) {
case 'charge.succeeded':
const chargeSucceeded = event.data.object;
const { invoiceId } = chargeSucceeded.metadata;
const invoice = await fetchSg(`invoices/${invoiceId}`);
const site = await fetchSg(`sites/${invoice.siteId}?include=customFields`);
const transfer = await stripe.transfers.create({
amount: chargeSucceeded.amount,
currency: chargeSucceeded.currency,
destination: site.customFields.stripeAcct,
transfer_group: 'Test',
});
break;
default:
console.log(`Unhandled event type ${event.type}`);
}
res.json({ message: 'OK' });
} catch (err) {
console.log(err);
res.statusCode = 400;
res.json({ message: err.message });
}
}