Stripe Integration
JS
S
JavaScriptStripe Integration Snippet (client and backend)
1// Backend
2npm install stripe
3POST: /api/stripe/session
4
5server.post('/api/stripe/session', async (req, res) => {
6 const amount = req.body.amount
7
8 const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)
9 const session = await stripe.checkout.sessions.create({
10 payment_method_types: ['card'],
11 line_items: [
12 {
13 name: 'Booking house on Airbnb clone',
14 amount: amount * 100,
15 currency: 'usd',
16 quantity: 1
17 }
18 ],
19 success_url: process.env.BASE_URL + '/bookings',
20 cancel_url: process.env.BASE_URL + '/bookings'
21 })
22
23 res.writeHead(200, {
24 'Content-Type': 'application/json'
25 })
26 res.end(
27 JSON.stringify({
28 status: 'success',
29 sessionId: session.id,
30 stripePublicKey: process.env.STRIPE_PUBLIC_KEY
31 })
32 )
33})
34
35// Backend WebHook
36server.post('/api/stripe/webhook', async (req, res) => {
37 const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)
38 const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET
39 const sig = req.headers['stripe-signature']
40
41 let event
42
43 try {
44 event = stripe.webhooks.constructEvent(req.rawBody, sig, endpointSecret)
45 } catch (err) {
46 res.writeHead(400, {
47 'Content-Type': 'application/json'
48 })
49 console.error(err.message)
50 res.end(
51 JSON.stringify({
52 status: 'success',
53 message: `Webhook Error: ${err.message}`
54 })
55 )
56 return
57 }
58
59 if (event.type === 'checkout.session.completed') {
60 const sessionId = event.data.object.id
61
62 try {
63 Booking.update({ paid: true }, { where: { sessionId } })
64 } catch (err) {
65 console.error(err)
66 }
67 }
68
69 res.writeHead(200, {
70 'Content-Type': 'application/json'
71 })
72 res.end(JSON.stringify({ received: true }))
73})
74
75// Test WebHook using Stripe CLI
76stripe trigger checkout.session.completed
77
78
79
80
81// Frontend
82<script src="https://js.stripe.com/v3/"></script>
83const sessionResponse = await axios.post('/api/stripe/session', { amount: props.house.price * numberOfNightsBetweenDates })
84if (sessionResponse.data.status === 'error') {
85 alert(sessionResponse.data.message)
86 return
87}
88
89const sessionId = sessionResponse.data.sessionId
90const stripePublicKey = sessionResponse.data.stripePublicKey
91
92
93const stripe = Stripe(stripePublicKey)
94const { error } = await stripe.redirectToCheckout({
95 sessionId
96})
97
98// Test CARD: 4242 4242 4242 4242, you add 4 or 2
99
100Created on 3/15/2021