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

CodeIgniter重定向传数据及Stripe支付失败数据传视图问题

解决CodeIgniter集成Stripe时支付失败数据无法传递到视图的问题

嘿,作为经常在CodeIgniter里折腾支付网关的开发者,我太懂你这种新手遇到的坑了!支付成功一切顺畅,失败就卡壳,大概率是你没正确捕获Stripe的异常,也没把错误数据传递给视图。我结合你的代码片段给你修正下:

核心问题分析

你当前的代码只有try块,却没有处理catch逻辑——当Stripe支付失败时(比如卡余额不足、过期、被拒等),会抛出对应的异常,如果不捕获这些异常,程序要么直接报错中断,要么没法把错误信息传递到视图。

修正后的完整代码

public function stripepay() {
    // 获取POST过来的支付相关变量
    $amount = $this->input->post('amount');
    $stripe_token = $this->input->post('stripeToken');

    try {
        require_once APPPATH."third_party/stripe/init.php";
        // 设置Stripe API密钥
        $stripe_config = array(
            "secret_key" => "sk_test_gSev8A4OJf0F3BXXXXXXXX",
            "publishable_key" => "pk_test_XZZxorO1rYsZT..."
        );
        \Stripe\Stripe::setApiKey($stripe_config['secret_key']);

        // 创建Stripe收费请求(如果是新版Stripe推荐用PaymentIntent,这里先按你可能用的Charge示例)
        $charge = \Stripe\Charge::create([
            'amount' => $amount * 100, // Stripe要求金额以"分"为单位
            'currency' => 'usd',
            'description' => '你的订单描述',
            'source' => $stripe_token,
        ]);

        // 支付成功:把成功数据传递到视图
        $view_data['payment_status'] = 'success';
        $view_data['charge_info'] = $charge;
        $this->load->view('payment_result', $view_data);

    } catch(\Stripe\Exception\CardException $e) {
        // 捕获最常见的卡支付失败异常(比如余额不足、卡过期、CVV错误等)
        $stripe_error = $e->getError();
        $view_data['payment_status'] = 'failed';
        $view_data['error_message'] = $stripe_error['message']; // 具体的用户友好错误提示
        $this->load->view('payment_result', $view_data);
    } catch(\Stripe\Exception\ApiErrorException $e) {
        // 捕获其他Stripe API层面的错误(比如密钥错误、参数错误)
        $view_data['payment_status'] = 'failed';
        $view_data['error_message'] = '支付请求处理失败,请稍后重试';
        $this->load->view('payment_result', $view_data);
    } catch(Exception $e) {
        // 捕获所有其他非Stripe的异常(比如服务器内部错误)
        $view_data['payment_status'] = 'failed';
        $view_data['error_message'] = '系统异常:'.$e->getMessage();
        $this->load->view('payment_result', $view_data);
    }
}

视图层如何展示数据

在你的支付结果视图(比如payment_result.php)里,就可以根据传递的变量来展示不同状态:

<?php if($payment_status == 'success'): ?>
    <div class="alert alert-success">
        支付成功!交易ID:<?php echo $charge_info->id; ?>
    </div>
<?php else: ?>
    <div class="alert alert-danger">
        支付失败:<?php echo $error_message; ?>
    </div>
<?php endif; ?>

关键注意点

  • 异常分层捕获:Stripe会抛出不同类型的异常,CardException是用户支付失败最常见的场景,里面包含对用户友好的错误提示,优先处理这个能提升用户体验;
  • 数据传递方式:CodeIgniter里通过$this->load->view()的第二个参数传递数组,视图里直接用数组键名访问变量;
  • 金额单位:Stripe要求金额以"分"为单位,所以记得把你收到的元(或其他货币单位)乘以100。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:47