stripe/stripe-cli

Stripe Webhooks Connection Issue on Fedora 38

Closed this issue ยท 1 comments

YO-SC commented

Hello Stripe community! ๐Ÿ‘‹ I am currently facing some challenges while using Stripe Webhooks on my Fedora 38 system. I have followed the instructions and used the stripe login command successfully in my terminal.

Next, I forwarded the events to my local server's webhook using the command stripe listen --forward-to localhost:4242/webhook, which seems to be working fine.

However, when I try to trigger an event in another terminal instance using stripe trigger payment_intent.succeeded, I encounter the following error:

2023-07-20 20:55:41   --> charge.succeeded [evt_3NW7d9ElhJRNJy1r1mjvP0WG]
2023-07-20 20:55:41            [ERROR] Failed to POST: Post "http://localhost:4242/webhook": dial tcp [::1]:4242: connect: connection refused

2023-07-20 20:55:41   --> payment_intent.succeeded [evt_3NW7d9ElhJRNJy1r13bYAcrf]
2023-07-20 20:55:41            [ERROR] Failed to POST: Post "http://localhost:4242/webhook": dial tcp [::1]:4242: connect: connection refused

2023-07-20 20:55:41   --> payment_intent.created [evt_3NW7d9ElhJRNJy1r17JzkvDh]
2023-07-20 20:55:41            [ERROR] Failed to POST: Post "http://localhost:4242/webhook": dial tcp [::1]:4242: connect: connection refused

Additional Context

I am running Fedora 38, and I believe there might be some configuration required to resolve this issue. If anyone has encountered a similar problem or knows how to fix it, I would greatly appreciate your assistance.

Thank you all for your support! ๐Ÿ˜‡

YO-SC commented

Whoops

Alright, I managed to resolve my issue! It turned out that the missing step was to have the webhook code running via Node.js. In the Stripe video tutorial I followed, they didn't explicitly mention this crucial step (unlike in the written documentation). Lesson learned - always read the docs thoroughly!

Here's the solution: You need to create a server.js file with the following code:

// server.js
//
// Use this sample code to handle webhook events in your integration.
//
// 1) Paste this code into a new file (server.js)
//
// 2) Install dependencies
//   npm install stripe
//   npm install express
//
// 3) Run the server on http://localhost:4242
//   node server.js

// The library needs to be configured with your account's secret key.
// Ensure the key is kept out of any version control system you might be using.
const stripe = require('stripe')('sk_test_...')
const express = require('express')
const app = express()

// This is your Stripe CLI webhook secret for testing your endpoint locally.
const endpointSecret =
  'your endpoint secret here'

app.post(
  '/webhook',
  express.raw({ type: 'application/json' }),
  (request, response) => {
    const sig = request.headers['stripe-signature']

    let event

    try {
      event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret)
    } catch (err) {
      response.status(400).send(`Webhook Error: ${err.message}`)
      return
    }

    // Handle the event
    switch (event.type) {
      case 'payment_intent.succeeded':
        const paymentIntentSucceeded = event.data.object
        // Then define and call a function to handle the event payment_intent.succeeded
        break
      // ... handle other event types
      default:
        console.log(`Unhandled event type ${event.type}`)
    }

    // Return a 200 response to acknowledge receipt of the event
    response.send()
  }
)

app.listen(4242, () => console.log('Running on port 4242'))

Once you have created the server.js file, execute node server.js in a terminal instance to run the server. Additionally, ensure that you are running stripe listen --forward-to localhost:4242/webhook in another terminal instance. Finally, trigger the event on yet another terminal instance using stripe trigger payment_intent.succeeded.

I apologize for my earlier confusion, but I hope this detailed solution helps others facing similar issues.

post request successful