GCP云函数部署Flask应用:Stripe Webhook签名验证失败且Payload为空
GCP Flask云函数Stripe Webhook Payload空+签名验证失败解决方案
问题根源
你遇到的问题核心是两个关键错误:
- GCP的Flask环境会自动解析请求体,导致
request.get_data()无法获取原始Payload - 代码中手动将签名验证后的
event重置为None,直接破坏了后续事件处理逻辑
修复步骤
1. 阻止Flask自动解析请求体
在路由装饰器中添加get_json=False参数,避免Flask提前解析并清空请求体,确保get_data()能拿到完整原始Payload:
@app.route('/webhook', methods=['POST'], get_json=False)
2. 删除致命的event = None代码行
你在签名验证成功后,手动把event设为None,这会导致后续的事件类型判断永远不成立,哪怕验证通过也返回失败。直接删掉这行代码:
# 移除这行:event = None
3. 确认Content-Type未被篡改
Stripe Webhook发送的请求Content-Type为application/json,如果GCP网关或负载均衡修改了这个请求头,会导致解析异常。可以通过日志确认该值是否正确,若异常需检查GCP侧配置。
修复后的完整代码
@app.route('/webhook', methods=['POST'], get_json=False) def stripe_webhook(): event = None payload = request.get_data(as_text=True) logging.info(f"Raw request payload: {payload}") sig_header = request.headers.get('Stripe-Signature') logging.info(f"Stripe-Signature header: {sig_header}") content_type = request.headers.get('Content-Type') logging.info(f"Request Content-Type: {content_type}") logging.info(f'endpoint secret: {endpoint_secret}') if endpoint_secret: try: event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret ) except stripe.error.SignatureVerificationError as e: logging.error(f"Webhook signature verification failed: {e}") return jsonify(success=False) if event and event['type'] == 'customer.subscription.deleted': subscription = event['data']['object'] customer_id = subscription['customer'] handle_subscription_deleted(customer_id) return jsonify(success=True) return jsonify(success=False)
测试建议
部署完成后用Stripe CLI测试:
stripe listen --forward-to https://<你的GCP函数URL>/webhook
触发测试事件后,查看GCP云函数日志,确认Payload正常、签名验证通过。
内容的提问来源于stack exchange,提问作者calebtjohnson
相关产品推荐
相关产品推荐

