Stripe:未找到与使用 Flask 的有效负载的预期签名相匹配的签名

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

这里是新手。我正在使用 flask 处理 Stripe 支付方式,它在我的本地机器上运行良好,但是当我在服务器上部署我的代码并在 stripe 仪表板中监听 webhook 事件时,我收到这个错误No找到的签名与有效负载 的预期签名相匹配”。已经尝试了很多解决方案,但没有任何效果。任何帮助将不胜感激。

    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

好的,我想我看到了问题,但我会尝试解决这两个潜在问题。

  1. (最有可能):Stripe 需要原始的、未修改的请求主体来形成 webhook 签名。在您的 try: 块中,您正在使用 json.loads(payload) 将其转换为 Python dict 对象。尝试使用原始 payload 数据。

  2. 如果问题仅在您将代码部署到远程服务器时出现,那么最有可能的问题是 endpoint_secret 值。我会在您的 webhook_received() 函数中添加一些日志记录,以在加载后记录该值,并确保该值与您可以在 Stripe 仪表板中查看的 webhook 签名密码相匹配。

最后,return 正确响应以避免重试 webhook 传递很重要。我知道 Flask 会隐式地做一些事情(这是我的一个小毛病),但我没有看到 200500 响应被 returned 在这里。您需要确保做出适当的回应以避免以后出现头痛。您可以查看最佳实践 here. There's also a handy webhook builder here,这样您就可以根据 Stripe 的 Flask 代码检查您的实现。