Vercel部署Next.js应用时Stripe API兼容性问题排查
在Vercel部署的Next.js应用中调用Stripe Checkout Session API时出现以下错误:
Error: 2 UNKNOWN: Getting metadata from plugin failed with error: error:1E08010C:DECODER routines::unsupported
已尝试禁用gRPC并强制使用REST客户端,但问题未解决,以下是针对性解决方案:
1. 切换到稳定版Stripe API版本
你当前使用的2025-04-30.basil是Stripe的Beta版本,生产环境下Beta版本可能存在未公开的兼容性问题。将Stripe初始化的apiVersion改为正式稳定版本,比如:
const stripe = new Stripe(stripeSecretKey || '', { apiVersion: '2024-06-20', // 替换为最新稳定版 httpClient: Stripe.createFetchHttpClient(), });
2. 解决Node.js 20+的OpenSSL兼容性问题
Node.js 20默认使用OpenSSL 3.0,部分旧版依赖或加密逻辑会出现解码错误。在Vercel中添加环境变量:
- 环境变量名:
NODE_OPTIONS - 值:
--openssl-legacy-provider
或者在Next.js的API路由文件顶部添加Runtime配置,确保使用Node.js环境并传递该参数:
export const config = { runtime: 'nodejs', env: { NODE_OPTIONS: '--openssl-legacy-provider', }, };
3. 锁定Stripe SDK版本到兼容Node 20的稳定版
部分Stripe SDK版本与Node.js 20的OpenSSL 3.0存在冲突,在package.json中指定兼容的SDK版本,比如:
{ "dependencies": { "stripe": "^14.25.0" // 选择经过验证的稳定版本 } }
运行npm install或yarn install重新安装依赖后部署。
4. 隔离Firebase Admin与Stripe的依赖加载
你同时使用了Firebase Admin,可能两者的HTTP客户端或加密依赖存在冲突。尝试将Firebase Admin的导入改为动态导入,放在Stripe初始化之后:
// 替换原有的import语句 const { firestore } = await import("../../firebase/admin");
确保Firebase的初始化不会干扰Stripe的加密配置。
5. 明确指定Vercel Node.js Runtime版本
在Vercel项目设置中,将Runtime版本明确设置为Node.js 18.x或Node.js 20.x,避免自动切换到Edge Runtime或其他不兼容环境。也可以在vercel.json中配置:
{ "functions": { "pages/api/**/*.ts": { "runtime": "@vercel/node@3.2.1" // 指定兼容的Node runtime版本 } } }
内容的提问来源于stack exchange,提问作者Katsu

