Deploy a Stripe webhook server to manage post-payment actions.
This template helps you:
checkout.session.completed
events via webhooknpm install -S stripe express cors body-parser node-fetch
price_XXXXX
sk_test_XXXXX
whsec_XXXXX
metadata
โ key: product
, value: (e.g. pro-plan
)
Use test cards below to simulate success/failure.Card Type | Number | Result |
---|---|---|
Success | 4242 4242 4242 4242 | Payment successful |
Insufficient Funds | 4000 0000 0000 9995 | Payment failed |
Expiration: any future date, CVC: 000
๐ Manually trigger event if needed:
stripe trigger checkout.session.completed
checkout.session.completed
checkout.session.async_payment_succeeded
checkout.session.async_payment_failed
metadata.product
field.Create stripe-properties.json
with your keys:
{
"stripe_key": "sk_test_XXXXX",
"stripe_ws_secret": "whsec_XXXXX",
"url_domain": "http://localhost:4242",
"product1_price": "price_XXXXX"
}
const credentials = loadBlock('stripe');
_fs.writeFileSync(`${__dirname}/stripe-properties.json`, credentials);
//exec: node
const properties = require("./stripe-properties.json");
const fetch = require('node-fetch');
const stripe = require('stripe')(properties.stripe_key);
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
app.use(cors());
const YOUR_DOMAIN = properties.url_domain;
const endpointSecret = properties.stripe_ws_secret;
app.get('/', (req, res) => res.sendStatus(200));
app.post('/webhook', bodyParser.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['stripe-signature'];
const payload = req.body;
let event;
try {
event = stripe.webhooks.constructEvent(payload, sig, endpointSecret);
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
const session = event.data.object;
console.log(`๐ฆ Received event: ${event.type}`);
if (event.type === 'checkout.session.completed') {
const product = session.metadata.product;
const email = session.customer_details.email;
console.log(`โ
Payment success: ${email} bought ${product}`);
// TODO: Generate license or deliver product here
}
res.sendStatus(200);
});
app.listen(4242, () => console.log('๐ Stripe backend running on http://localhost:4242'));
โ Next steps:
switch(event.type)