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
相关产品推荐
相关产品推荐

