PHP集成Stripe支付:无效卡信息无响应问题求助
Stripe支付网关无效卡信息无响应问题排查与修复
问题描述
PHP集成Stripe支付网关SDK后,正确银行卡信息可正常支付,但输入无效卡信息(如错误卡号)时无任何响应,排查发现此时无法创建Stripe Token。
原始代码
if(isset($_REQUEST)){ $cardno = $_POST['cardno']; $cardname = $_POST['cardno'; $cardmonth = $_POST['cardmonth']; $cardyear = $_POST['cardyear']; $cardcvv = $_POST['cardcvv']; require_once('vendor/autoload.php'); $stripeSecret = 'strpe_api_key'; \Stripe\Stripe::setApiKey($stripeSecret); $token = \Stripe\Token::create(array( "card" => array( "number" => $cardno, "exp_month" => $cardmonth, "exp_year" => $cardyear, "cvc" => $cardcvv ) )); //echo "10"; $charge = \Stripe\Charge::create(array( [ 'description' => "Package Subscription", 'shipping' => [ 'name' => 'sam', 'phone'=> '0123456789', 'address' => [ 'line1' => '510 Townsend St', 'postal_code' => '98140', 'city' => 'San Francisco', 'state' => 'CA', 'country' => 'US', ],//address ands ],//shipping ends 'amount' => round(10.00 * 100), 'currency' => 'usd', "source" => $token, ] )); }
已知明显错误
$cardname = $_POST['cardno';缺少闭合单引号,语法错误会直接中断脚本执行- Stripe密钥拼写错误:
strpe_api_key应为stripe_api_key,错误密钥会导致API请求失败
核心问题:缺失错误处理逻辑
输入无效卡信息时,Stripe的Token::create方法会抛出异常,但原代码未捕获这些异常,导致脚本静默失败,无任何响应返回给前端。
修复后的代码
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 安全处理POST参数,修复语法错误 $cardno = $_POST['cardno'] ?? ''; $cardname = $_POST['cardname'] ?? ''; // 修正:对应前端cardname字段,补全引号 $cardmonth = $_POST['cardmonth'] ?? ''; $cardyear = $_POST['cardyear'] ?? ''; $cardcvv = $_POST['cardcvv'] ?? ''; require_once('vendor/autoload.php'); // 修复密钥拼写错误 $stripeSecret = 'stripe_api_key'; \Stripe\Stripe::setApiKey($stripeSecret); try { // 创建Stripe Token $token = \Stripe\Token::create([ "card" => [ "number" => $cardno, "exp_month" => $cardmonth, "exp_year" => $cardyear, "cvc" => $cardcvv ] ]); // 创建支付订单 $charge = \Stripe\Charge::create([ 'description' => "Package Subscription", 'shipping' => [ 'name' => 'sam', 'phone' => '0123456789', 'address' => [ 'line1' => '510 Townsend St', 'postal_code' => '98140', 'city' => 'San Francisco', 'state' => 'CA', 'country' => 'US', ] ], 'amount' => round(10.00 * 100), 'currency' => 'usd', "source" => $token, ]); // 返回成功响应 echo json_encode([ 'success' => true, 'charge_id' => $charge->id ]); } catch (\Stripe\Exception\CardException $e) { // 捕获卡相关错误(无效卡号、过期卡、CVV错误等) echo json_encode([ 'success' => false, 'error' => $e->getError()->message ]); } catch (\Stripe\Exception\ApiErrorException $e) { // 捕获Stripe API层面的其他错误 echo json_encode([ 'success' => false, 'error' => '支付处理失败,请稍后重试' ]); } catch (Exception $e) { // 捕获通用意外错误 echo json_encode([ 'success' => false, 'error' => $e->getMessage() ]); } } ?>
关键改进说明
- 修复语法与参数错误:补全参数引号,修正
$cardname的取值逻辑,避免脚本中断 - 修正密钥:替换为正确的Stripe API密钥
- 添加异常捕获:
CardException:精准返回卡相关的具体错误信息,帮助用户定位问题ApiErrorException:处理所有Stripe API级别的错误- 通用
Exception:兜底捕获其他意外错误
- 严谨请求判断:用
$_SERVER['REQUEST_METHOD'] === 'POST'替代isset($_REQUEST),避免非POST请求触发逻辑 - 参数安全处理:用
?? ''避免未定义索引错误 - 结构化响应:用JSON格式返回结果,方便前端统一处理成功/失败场景
内容的提问来源于stack exchange,提问作者RAF Algowid
相关产品推荐
相关产品推荐

