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

如何在Vite+ViteSSG项目中创建服务端API路由实现Stripe安全支付

实现方案

注意:ViteSSG是构建时预渲染工具,仅在打包阶段运行生成静态HTML,没有运行时的服务端监听能力,无法直接处理用户的动态接口请求。

结合你当前部署在Netlify的情况,用Netlify自带的Serverless Functions实现是成本最低的方案,不需要额外搭建后端,也不用修改现有客户端的调用逻辑,具体步骤如下:


步骤1:配置服务端函数与路由重写

  • 在项目根目录新建netlify/functions文件夹,Netlify会自动识别这个目录下的文件为服务端函数
  • 新建netlify/functions/create-checkout-session.js,把你写的API逻辑挪进去,注意补全async/await语法,敏感密钥通过环境变量读取不要硬编码:
// netlify/functions/create-checkout-session.js
import Stripe from 'stripe'
import { useAPI } from '@/utils/GraphCMS'

const graphcms = useAPI()
// Stripe密钥存在环境变量中,不要硬编码到代码里
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)

exports.handler = async (event) => {
  // 仅允许POST请求
  if (event.httpMethod !== 'POST') {
    return {
      statusCode: 405,
      body: JSON.stringify({ error: 'Method not allowed' })
    }
  }

  try {
    const { slug } = JSON.parse(event.body)
    // 从GraphCMS拉取最新的商品数据,避免客户端篡改
    const product = await graphcms.getSingleProduct(slug)

    const session = await stripe.checkout.sessions.create({
      success_url: `${process.env.VITE_SITE_URL}/?id={CHECKOUT_SESSION_ID}`,
      cancel_url: `${process.env.VITE_SITE_URL}/services/${slug}`,
      payment_method_types: ['card'],
      line_items: [
        {
          price_data: {
            currency: 'cny', // 换成你实际使用的货币编码
            product_data: {
              name: product.name,
              description: product.description
            },
            unit_amount: product.price * 100 // Stripe金额单位为分
          },
          quantity: 1
        }
      ],
      mode: 'payment'
    })

    return {
      statusCode: 200,
      body: JSON.stringify(session)
    }
  } catch(e) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: { message: e.message } })
    }
  }
}
  • 根目录新建netlify.toml配置文件,指定函数目录和路由重写规则,让请求路径和你预期的/api/*格式一致:
[build]
  functions = "netlify/functions"
  command = "npm run build"
  publish = "dist"

[[redirects]]
  from = "/api/*"
  to = "/.netlify/functions/:splat"
  status = 200

配置完成后你现有的客户端调用代码不需要做任何修改,直接就能正常调用接口。


步骤2:本地开发适配

要在本地模拟Netlify Functions的运行效果,安装官方的Netlify CLI工具:

npm install -g netlify-cli

之后把本地启动命令从vite改成ntl dev,工具会同时启动Vite开发服务和本地函数模拟服务,本地访问/api/create-checkout-session的行为和线上完全一致。


步骤3:环境变量配置

把Stripe密钥、站点域名等敏感配置,放在Netlify后台的项目环境变量管理页中,本地开发时在根目录新建.env文件存储即可,注意不要把.env文件提交到Git仓库。


如果后续你要切换到Vercel部署,逻辑完全一致,只要把函数放在项目根目录的api/文件夹下,按照Vercel Functions的语法格式调整即可,客户端的调用代码不需要做任何改动。

内容的提问来源于stack exchange,提问作者Benjamin Fourgeaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:24:08