0

0

Stripe 测试卡在旧版 Checkout 中始终成功:原因与解决方案

心靈之曲

心靈之曲

发布时间:2026-01-21 14:25:02

|

126人浏览过

|

来源于php中文网

原创

Stripe 测试卡在旧版 Checkout 中始终成功:原因与解决方案

本文解释为何 stripe 旧版 checkout(modal 弹窗)无法触发测试卡拒绝行为,并指出根本原因是未使用前端提交的 `stripetoken`,而是错误地复用了已有客户默认卡;同时提供迁移至现代支付流程的完整方案。

你遇到的问题非常典型:Stripe 测试卡(如 4000000000000002)在旧版 Checkout 集成中始终显示“succeeded”,完全不触发拒绝逻辑。这不是测试环境失效,而是集成方式存在关键缺陷。

? 根本原因:未使用实时生成的支付凭证

你的前端代码通过 checkout.js 正确弹出支付弹窗并生成了 stripeToken(例如 tok_1P...),但后端 PHP 处理逻辑中却完全忽略了它:

// ❌ 错误:仅使用 customer_id,复用客户已绑定的「成功卡」
'customer' => $_POST['customer_id'], // ← 这里跳过了本次输入的卡片!

$_POST['customer_id'] 对应的是 Stripe Customer 对象 ID(如 cus_XXX)。当你调用 \Stripe\Charge::create() 并只传入 customer 参数时,Stripe 自动对客户默认支付方式(default_source)发起扣款——而该卡极大概率是你之前测试成功的卡(如 4242...4242),因此无论你前端输入什么测试卡(甚至无效卡号/过期年份/CVC),后端实际扣的都不是你刚输的那张卡。

真正应使用的参数是 source(或 payment_method,取决于 API 版本):

// ✅ 正确:使用前端实时提交的 token(代表本次输入的卡片)
try {
    $charge = \Stripe\Charge::create([
        'amount' => 1000,
        'currency' => 'usd',
        'source' => $_POST['stripeToken'], // ← 关键!必须传此值
        'description' => "Single Credit Purchase"
    ]);
} catch (\Stripe\Exception\CardException $e) {
    // 此处才能捕获 card_declined、insufficient_funds 等真实拒绝
    $errors[] = $e->getError()->message;
} catch (\Stripe\Exception\StripeException $e) {
    $errors[] = 'Payment failed: ' . $e->getMessage();
}
⚠️ 注意:$_POST['stripeToken'] 是 Checkout.js 在用户完成填写后自动注入表单并提交的隐藏字段值。请确认你的表单 确实接收并提交了该字段(可通过浏览器开发者工具 Network → Form Data 验证)。

? 为什么旧版 Checkout 已不可靠?

Stripe 官方已于 2019 年正式弃用(deprecated)checkout.js(v2),并停止对其新增功能支持:

  • 不支持 SCA(Strong Customer Authentication)和 3D Secure 2 —— 欧盟/英国等地区强制要求,否则交易将被拒;
  • 无动态错误反馈(如实时 CVC/日期校验);
  • 无法处理订阅、多币种、发票等现代支付场景;
  • 测试卡行为不一致(正如你所见),因底层逻辑绕过真实卡路由

✅ 推荐方案:迁移到 Stripe Elements + Confirm Card Payment

以下是轻量级、安全且兼容测试卡的现代实现(无需重写全部前端):

LobeHub
LobeHub

LobeChat brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude

下载

1. 前端(HTML + JS)





2. 后端(charge.php

\Stripe\Stripe::setApiKey('sk_test_...'); // 私钥

try {
  $charge = \Stripe\Charge::create([
    'amount' => 1000,
    'currency' => 'usd',
    'source' => $_POST['stripeToken'], // ✅ 使用本次 token
    'description' => 'One Credit Purchase'
  ]);
  echo json_encode(['success' => true]);
} catch (\Stripe\Exception\CardException $e) {
  $error = $e->getError();
  echo json_encode(['error' => $error->message]); // 如 "Your card was declined."
} catch (\Stripe\Exception\StripeException $e) {
  echo json_encode(['error' => 'Payment failed']);
}

✅ 此方案下,输入 4000000000000002 将明确返回 card_declined 错误;输入 4000000000009995 返回 insufficient_funds —— 完全符合 Stripe 测试卡文档预期。

? 总结

问题环节 正确做法
前端 确保 checkout.js 表单提交 stripeToken,或改用 stripe.elements() 获取实时 token
后端 必须使用 source => $_POST['stripeToken'],禁止仅依赖 customer 参数
长期 立即弃用 checkout.js,采用 Stripe Elements + confirmCardPayment,满足 SCA 合规与测试卡可靠性

迁移成本远低于维护一个已停更、不合规且行为异常的旧集成。Stripe 的测试卡机制本身完全可靠——只要你的代码真正让它“参与”到支付流程中。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2730

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1669

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1530

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1444

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1529

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号