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
好的,我想我看到了问题,但我会尝试解决这两个潜在问题。
(最有可能):Stripe 需要原始的、未修改的请求主体来形成 webhook 签名。在您的 try:
块中,您正在使用 json.loads(payload)
将其转换为 Python dict
对象。尝试使用原始 payload
数据。
如果问题仅在您将代码部署到远程服务器时出现,那么最有可能的问题是 endpoint_secret
值。我会在您的 webhook_received()
函数中添加一些日志记录,以在加载后记录该值,并确保该值与您可以在 Stripe 仪表板中查看的 webhook 签名密码相匹配。
最后,return 正确响应以避免重试 webhook 传递很重要。我知道 Flask 会隐式地做一些事情(这是我的一个小毛病),但我没有看到 200
或 500
响应被 returned 在这里。您需要确保做出适当的回应以避免以后出现头痛。您可以查看最佳实践 here. There's also a handy webhook builder here,这样您就可以根据 Stripe 的 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
好的,我想我看到了问题,但我会尝试解决这两个潜在问题。
(最有可能):Stripe 需要原始的、未修改的请求主体来形成 webhook 签名。在您的
try:
块中,您正在使用json.loads(payload)
将其转换为 Pythondict
对象。尝试使用原始payload
数据。如果问题仅在您将代码部署到远程服务器时出现,那么最有可能的问题是
endpoint_secret
值。我会在您的webhook_received()
函数中添加一些日志记录,以在加载后记录该值,并确保该值与您可以在 Stripe 仪表板中查看的 webhook 签名密码相匹配。
最后,return 正确响应以避免重试 webhook 传递很重要。我知道 Flask 会隐式地做一些事情(这是我的一个小毛病),但我没有看到 200
或 500
响应被 returned 在这里。您需要确保做出适当的回应以避免以后出现头痛。您可以查看最佳实践 here. There's also a handy webhook builder here,这样您就可以根据 Stripe 的 Flask 代码检查您的实现。