通过API购买Stripe关联账户商品失败,附前后端代码求助
Stripe关联账户嵌入式Checkout支付失败排查
我在Stripe关联账户(connected account)中创建了一款商品,尝试按照官方文档的Checkout Session创建流程完成购买,但无法完成支付。以下是我的前后端实现代码:
服务端逻辑(Next.js)
import { NextRequest, NextResponse } from "next/server"; import Stripe from "stripe"; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, { apiVersion: "2024-04-10", typescript: true, }); export async function POST(req: NextRequest, res: NextResponse) { const { data } = await req.json(); const { price } = data; console.log(price); try { const session = await stripe.checkout.sessions.create( { mode: "payment", line_items: [ { price, quantity: 1, }, ], ui_mode: "embedded", return_url: "http://localhost:3000/pages/checkout/return?session_id={CHECKOUT_SESSION_ID}", }, { stripeAccount: "acct_**************", } ); console.log(session); return NextResponse.json({ session }); } catch (error: any) { console.log(error); return NextResponse.json({ error: error.message }, { status: 500 }); } }
前端代码(Next.js)
"use client"; import * as React from "react"; import { loadStripe } from "@stripe/stripe-js"; import { EmbeddedCheckoutProvider, EmbeddedCheckout, } from "@stripe/react-stripe-js"; import axios from "axios"; import { useEffect, useState } from "react"; const stripePromise = loadStripe( process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY as string ); const Checkout = () => { const [clientSecret, setClientSecret] = useState(""); useEffect(() => { const fetchClientSecret = async () => { try { const response = await axios.post("/api/stripe-checkout", { data: { price: "price_**************", // price id from connected account }, }); setClientSecret(response.data.session.client_secret); console.log(response.data); } catch (error) { console.error(error); throw new Error("Failed to fetch client secret"); } }; fetchClientSecret(); }, []); console.log(clientSecret); return ( <div style={{ backgroundColor: "white", height: "100vh" }}> {clientSecret && ( <EmbeddedCheckoutProvider stripe={stripePromise} options={{ clientSecret }} > <EmbeddedCheckout /> </EmbeddedCheckoutProvider> )} </div> ); }; export default Checkout;
排查方向
- 关联账户状态与权限:确认关联账户处于活跃状态,未被Stripe限制;平台账户的密钥拥有操作关联账户Checkout Session的权限。
- Price ID归属:验证传入的
price_**************确实属于指定的acct_**************关联账户,若Price属于平台账户会导致流程异常。 - Client Secret有效性:检查服务端日志中返回的
session.client_secret是否存在且格式正确(以cs_test_开头),前端是否正确获取并传入组件。 - 嵌入式Checkout配置:
- 确认关联账户已开启嵌入式Checkout功能;
- 本地开发的
return_url需添加到Stripe控制台的允许域名列表,生产环境必须使用HTTPS。
- 依赖版本兼容性:确保
@stripe/stripe-js和@stripe/react-stripe-js版本与使用的Stripe API版本(2024-04-10)匹配。 - 支付设置完整性:检查关联账户是否完成了收款账户绑定等必要支付配置,未完成会导致无法接收款项。
内容的提问来源于stack exchange,提问作者stam
相关产品推荐
相关产品推荐

