You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:27:33