You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:58:14