如何修复AWS API Gateway+Python Lambda的Stripe Webhook签名失败问题
Stripe Webhook集成AWS Lambda签名验证失败排查建议
我正在通过AWS API Gateway将Stripe Webhook集成到Python编写的Lambda函数中,目前遇到签名验证失败的错误。本地用Flask服务器测试代码完全正常,也对比过CloudWatch日志里各属性的数据类型,求解决该错误的建议。
相关代码
Lambda函数代码
import json import base64 import stripe STRIPE_ENDPOINT_SECRET = "你的Webhook密钥" # 需与Stripe后台配置一致 def lambda_handler(event, context): print("!!!Raw event:", json.dumps(event)) print("!!! event.get('isBase64Encoded'): ", event.get('isBase64Encoded')) payload = base64.b64decode(event['body']).decode('utf-8') if event.get('isBase64Encoded') else event['body'] sig_header = event['headers'].get('Stripe-Signature') or event['headers'].get('stripe-signature') print("!!!STRIPE_ENDPOINT_SECRET:", STRIPE_ENDPOINT_SECRET) print("!!!Payload Type:", type(payload)) print("!!!Payload:", payload) # 日志记录payload print("!!!Signature Header:", sig_header) # 日志记录签名Header try: stripe_event = stripe.Webhook.construct_event(payload, sig_header, STRIPE_ENDPOINT_SECRET) print(f"Successfully processed Stripe webhook: {stripe_event['type']}") except ValueError as e: print("ValueError:", str(e)) # 日志记录错误 return { 'statusCode': 400, 'body': json.dumps({'error': 'Invalid payload'}) } except stripe.error.SignatureVerificationError as e: print("SignatureVerificationError:", str(e)) # 日志记录错误 return { 'statusCode': 400, 'body': json.dumps({'error': 'Invalid signature'}) }
本地Flask测试代码
from flask import Flask, request import json app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): payload = request.data.decode("utf-8") event = { "body": payload, "headers": {key: value for key, value in request.headers.items()}, "isBase64Encoded": False } return lambda_handler(event, None) if __name__ == '__main__': app.run(port=4242)
排查建议
- 确认API Gateway集成模式:如果使用
LAMBDA_PROXY集成,isBase64Encoded标记会自动设置;若为其他集成模式,需手动确认body是否被Base64编码,避免解码错误。 - 校验payload原始一致性:Stripe签名验证依赖原始请求体的字节内容,不能对payload做任何格式化、转义等修改。对比CloudWacth日志中的payload与Stripe Dashboard中Webhook日志的原始内容,确保完全一致。
- 检查Header完整性:API Gateway可能会将Header键名转为小写,你的代码已兼容
Stripe-Signature和stripe-signature,但需确认日志中获取到的签名值完整,无截断或篡改。 - 核对Endpoint Secret:确保Lambda中配置的
STRIPE_ENDPOINT_SECRET与Stripe后台Webhook端点的secret完全一致,无空格、字符缺失等输入错误。 - 避免二次处理payload:不要对解码后的payload做
json.loads再json.dumps的操作,这会改变原始字符格式(如空格、换行),导致签名验证失败。 - 禁用API Gateway压缩:若API Gateway开启了gzip等压缩功能,需在集成设置中禁用,否则Lambda接收到的是压缩后的字节,解码后内容不符。
内容的提问来源于stack exchange,提问作者forhadmethun
相关产品推荐
相关产品推荐

