调用Vercel无服务器函数时Stripe Webhook返回308错误求助
问题:Stripe Webhook线上返回308错误,无服务器函数未触发
我已配置Stripe Webhook,触发时会调用一个无服务器函数,用于在用户开通高级账户时更新数据库条目。本地运行时Webhook工作完全正常,可触发API、更新用户信息并处理支付,但线上运行时持续返回308错误,提示:
Redirecting to my-app-url.com
以下是我的函数代码:
import { buffer } from "micro" import { createClient } from "@supabase/supabase-js"; require("dotenv").config(); const stripe = require("stripe")(process.env.STRIPE_LIVE_KEY) const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET const supabaseUrl = process.env.REACT_APP_SUPABASE_URL const supabaseAnonKey = process.env.REACT_APP_SUPABASE_ANON_KEY const supabase = createClient(supabaseUrl, supabaseAnonKey) module.exports = async (req, res) => { const signature = req.headers["stripe-signature"] const reqBuffer = await buffer(req) let event try { event = stripe.webhooks.constructEvent(reqBuffer, signature, endpointSecret) } catch (err) { console.log(err) return res.status(400).send(`Webhook error: ${err.message}`) } if (event.type === "checkout.session.completed") { console.log("Checkout completed!") const userId = String(event.data.object.client_reference_id) console.log(userId) const { error } = await supabase.from('profiles').update({ premium: 'true' }).eq('id', userId) if (error) { console.log(error) } } res.send({ received: true }) }
检查函数日志后发现,该函数似乎未触发,请求也未到达API,恳请各位提供解决建议。
解决建议
- 检查Webhook URL的HTTP/HTTPS配置:308是永久重定向状态码,大概率是你在Stripe后台配置的Webhook URL用了HTTP,但线上环境强制HTTPS,或者反过来。Stripe要求Webhook接收地址必须是HTTPS(除本地测试的localhost),确保配置的URL以
https://开头,且线上服务没有强制将HTTPS请求重定向到主站my-app-url.com。 - 验证无服务器函数的路由配置:很多无服务器平台(如Vercel、Netlify)的路由配置不当会自动重定向到主域名。比如函数部署在
https://my-app-url.com/api/stripe-webhook,但平台路由规则将未匹配请求重定向到主站,就会出现该问题。检查平台的函数路由设置,确保Webhook目标路径正确,未被重定向规则拦截。 - 确认请求方法是否被允许:Stripe Webhook发送的是POST请求,如果线上服务器或函数平台拦截POST请求,或配置了自动将POST重定向到GET(导致308),也会触发该问题。检查函数的请求方法限制,确保允许POST请求。
- 检查平台的重定向规则:部分托管平台默认会在带www和不带www的域名间互相重定向,或把根路径外的请求重定向到主站。查看平台的重定向配置文件(如Vercel的
vercel.json、Netlify的_redirects),排除Webhook路径被包含在重定向规则中的情况。 - 验证Stripe Webhook的签名配置:虽然本地运行正常,但线上的
STRIPE_WEBHOOK_SECRET环境变量可能配置错误。另外,确保线上使用的是生产环境的Webhook密钥,而非测试环境密钥。
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

