我已经使用 Stripe 设置了一个 Webhook,它在触发时调用无服务器函数。
该函数旨在在调用时更新我的数据库中的条目,表明用户已注册高级帐户。
当我在本地运行此程序时,Webhook 运行良好。它触发 API、更新用户并处理付款。
然而,当它上线运行时,我不断收到 308 错误:
重定向到 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 - 没有日志。
有人有什么建议吗?
问题出在 Vercel 中的默认域重定向。
推荐的方法是重定向到 www,所以这是您应该使用的格式:
错误:
https://[YOUR_DOMAIN].com/api/endpoint
右:
https://www.[YOUR_DOMAIN].com/api/endpoint
干杯
就我而言,事实证明我忘记了结尾的斜杠。
所以不要像这样调用条纹侦听器:
stripe listen --forward-to localhost:4242/webhook/
我是这样称呼它的:
stripe listen --forward-to localhost:4242/webhook
末尾没有 / ,导致服务器将请求重定向到正确的路径,从而出现 308 状态码。
如
308
错误所示,您的服务器似乎正在接收 Webhook,但试图将其重定向到另一个 URL。甚至有可能是相同的 URL,但通过 HTTPS。
Stripe 无法遵循重定向,因此这是服务器端的错误配置。您必须提供服务器期望接收 Webhooks 的确切 URL。
如果有人在使用 nextjs 时仍然遇到这个问题。对我来说,我必须在 next.config.js 中禁用它。
尾随斜杠:正确,
花了我2个小时🥲