Stripe Integration

JS
S
JavaScript

Stripe 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
100

Created on 3/15/2021