Home > Mobile >  Stripe: No signatures found matching the expected signature for payload using flask
Stripe: No signatures found matching the expected signature for payload using flask

Time:01-07

newbie here. I'm working on the Stripe payment method using flask and it all works well on my local machine but when I deploy my code on the server and listen to webhook events in the stripe dashboard, I get this error"No signatures found matching the expected signature for payload". Already tried so many solutions but nothing worked. Any help will be appreciated.

    def webhook_received(self, user_id):
        payload = request.data
        endpoint_secret = 'my_secret_key'
        sig_header = request.headers.get('stripe-signature')

        try:
            event = stripe.Webhook.construct_event(
                json.loads(payload), sig_header, endpoint_secret
            )
            data = event['data']
        except Exception as e:
            return str(e)
        event_type = event['type']
        if event_type == 'checkout.session.completed':
            self.handle_checkout_session(data, user_id)
        elif event_type == 'invoice.paid':
            pass

CodePudding user response:

Okay I think I see the problem but I'll try to cover both potential issues.

  1. (Most Likely): Stripe requires the raw, unmodified request body to form the webhook signature. In your try: block you are using json.loads(payload) which converts it to a Python dict object. Try using the raw payload data instead.

  2. If the problem only occurs when you deploy your code to a remote server then the most likely problem is with the endpoint_secret value. I would add some logging in your webhook_received() function to log the value after it's loaded and make sure the value matches the webhook signing secret you can view in your Stripe dashboard.

Lastly, it's important to return proper responses to avoid webhook delivery retries. I know Flask does some stuff implicitly (a pet peeve of mine) but I'm not seeing a 200 or 500 response being returned here. You'll want to make sure you respond appropriately to avoid headaches later. You can check the best practices here. There's also a handy webhook builder here so you can check your implementation against Stripe's Flask code.

  •  Tags:  
  • Related