stripe php sdk需匹配api版本:v14+默认用2024-06-20版,旧接口需降级至v13;密钥须从环境变量加载,禁止硬编码;金额单位为最小货币单位(如usd为美分),currency须小写且非空。

直接执行 composer require stripe/stripe-php 就能用,但版本选错会导致 API 调用失败
Stripe 官方 PHP 库的主包是 stripe/stripe-php,最新稳定版(v14+)默认使用 Stripe 的 v2024-06-20 及更新的 API 版本。如果你项目里还依赖旧版 API(比如用 charge.create 而非 payment_intents.create),装 v14 会直接报错 Invalid request: No such endpoint。
解决办法很简单:
- 查清你当前 Stripe Dashboard 里设置的 API version(在 Developers → API keys 页面底部),比如显示的是
2023-10-16 - 安装对应兼容版本:
composer require stripe/stripe-php:^13.0(v13 支持到 2023-10-16;v12 支持更老版本) - 别用
dev-main或无版本约束的composer require stripe/stripe-php,容易引入不兼容变更
require_once 不再需要,但 autoload.php 必须被正确加载
Composer 自动加载机制接管了类加载,你不需要手动 require_once 'vendor/autoload.php' —— 但前提是你的入口脚本(如 index.php 或 Laravel 的 public/index.php)确实执行了它。常见漏点:
- Laravel、Symfony 等框架已内置自动加载,无需额外操作
- 纯 PHP 项目必须确保第一行是
require __DIR__ . '/vendor/autoload.php';,路径写错(比如少个..)会导致Class 'Stripe\Stripe' not found - CLI 脚本和 Web 请求可能用不同工作目录,建议用
__DIR__而非dirname(__FILE__)或相对路径
初始化时必须调用 Stripe\Stripe::setApiKey(),且密钥不能硬编码
Stripe 要求每次请求都带 secret key,但这个 key 绝对不能写死在代码里。错误示例:Stripe\Stripe::setApiKey('sk_test_...'); —— 一旦提交 Git,密钥立刻泄露。
正确做法:
- 从环境变量读取:
Stripe\Stripe::setApiKey($_ENV['STRIPE_SECRET_KEY'] ?? getenv('STRIPE_SECRET_KEY')); - 用
vlucas/phpdotenv加载.env文件(需先composer require vlucas/phpdotenv) - 生产环境务必通过服务器环境变量注入(如 Nginx 的
fastcgi_param或 Docker 的-e STRIPE_SECRET_KEY=...) - 测试环境可临时用
php -d variables_order=EGPCS -S localhost:8000配合.env,但上线前必须切走
创建 PaymentIntent 时 amount 单位是「分」,且必须匹配 currency
Stripe 所有金额字段(amount)都是整数,单位为「最小货币单位」:USD 是美分,JPY 是日元(无小数),EUR 是欧分。传 1000 表示 $10.00,传 100000 表示 €1000.00 —— 但若 currency 设为 JPY,同样传 100000 就是 ¥100,000,不是 €1000。
典型错误:
- 前端传
{ amount: 10.99, currency: 'usd' }→ 后端没转成整数,直接塞进amount→ 报错Invalid integer - currency 写成大写
'USD'或带空格' usd '→ 返回Invalid currency - 没传
currency字段 → 默认用账户注册币种,但若账户是 EUR,用户想付 USD 就会失败
安全写法:$params = ['amount' => (int) round($amount * 100), 'currency' => strtolower(trim($currency))];
实际集成中,最常卡住的不是语法或命令,而是 API 版本错配、密钥暴露风险、以及金额单位换算这种“看起来 trivial 实则必崩”的细节。Stripe 的错误提示通常很准,但得看清楚是 invalid_request_error 还是 authentication_error —— 前者多半是参数或版本问题,后者基本就是密钥不对或没 set。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











