但是我在生产和开发中仍然遇到同样的问题。正如你所看到的,它用 308 重定向了我。
我当前的 webhook 端点格式如下所示:
https://mydomain.vercel.app/api/webhooks/stripe/
该网站托管在 vercel 上,我正在使用 nextjs。我还没有使用过 webhooks 或 stripe。这对我来说是全新的,并且已经被困在这里这么久了。
我也在使用 clerk webhook。这就是为什么我使用名为 webhooks 的父目录,它有两个子目录
/clerk/route.ts
和 /stripe/route.ts
。
这是我的
/api/webhooks/stripe
api 路线:
import Stripe from "stripe";
import { headers } from "next/headers";
import { NextResponse } from "next/server";
import { db } from "@/db";
export async function POST(req: Request) {
const body = await req.text();
const signature = headers().get("Stripe-Signature") as string;
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
let event: Stripe.Event;
try {
event = stripe.webhooks.constructEvent(
body,
signature,
process.env.STRIPE_WEBHOOK_SECRET!
);
} catch (error: any) {
console.error(error);
return new NextResponse(`Webhook Error: ${error.message}`, { status: 400 });
}
const session = event.data.object as Stripe.Checkout.Session;
const subscription = await stripe.subscriptions.retrieve(
session.subscription as string
);
if (event.type === "charge.succeeded") {
console.log("====================================");
console.log("Charge succeeded");
console.log("====================================");
}
if (event.type === "checkout.session.completed") {
const subscription = await stripe.subscriptions.retrieve(
session.subscription as string
);
await db.user.update({
where: {
id: session.client_reference_id as string,
},
data: {
credits: {
increment: 5,
},
},
});
}
if (event.type === "payment_intent.payment_failed") {
console.log("====================================");
console.log("Payment failed");
console.log("====================================");
}
if (event.type === "payment_intent.succeeded") {
console.log("====================================");
console.log("Payment succeeded");
console.log("====================================");
}
if (event.type === "payment_intent.created") {
console.log("====================================");
console.log("Payment created");
console.log("====================================");
}
if (event.type === "customer.created") {
console.log("====================================");
console.log("Customer created");
console.log("====================================");
}
if (event.type === "invoice.payment_succeeded") {
const subscription = await stripe.subscriptions.retrieve(
session.subscription as string
);
}
return new NextResponse(null, { status: 200 });
}
提前致谢:)
当您在 Vercel 中添加域名时,您是否选择将 domain.com 重定向到 www.domain.com?如果是这样,在仪表板的 Webhook 部分中,您是否使用了 domain.com 或 www.domain.com 作为 URL。
总而言之,无论 Vercel 使用什么,Webhook 都需要使用
** 来自@royanger 在店员不和谐中的回答