Flutterwave支付成功后数据无法传入CodeIgniter控制器问题
Flutterwave支付后CodeIgniter无法获取POST数据的解决方案
实现Flutterwave会员支付功能后,前端控制台能正常打印待提交的data,但后端CodeIgniter的insert_payment方法中,$this->input->post()获取的所有字段均为null,无法写入user_memberships表。
问题根源
- 前端通过
$.param(data)将数据转为**表单格式(application/x-www-form-urlencoded)**提交,但后端错误地尝试读取php://input解析JSON,两种格式不匹配。 - 后端代码中重复赋值
$data变量,先通过JSON解析得到$data,随后又用$this->input->post()的null值覆盖了该变量。
解决方案
方案一:保持前端表单格式提交,修复后端代码
删除后端中错误的JSON解析逻辑,直接使用CodeIgniter的$this->input->post()获取表单数据:
public function insert_payment() { // 直接通过input->post获取表单数据,添加true参数过滤XSS $store_id = $this->input->post('store_id', true); $plan_id = $this->input->post('plan_id', true); $start_date = $this->input->post('start_date', true); $end_date = $this->input->post('end_date', true); $status = $this->input->post('status', true); $price = $this->input->post('price', true); // 用新变量存储插入数据,避免覆盖原有变量 $insert_data = array( 'store_id' => $store_id, 'plan_id' => $plan_id, 'start_date' => $start_date, 'end_date' => $end_date, 'status' => $status, 'price' => $price, ); var_dump($insert_data); $insert = $this->db->insert('user_memberships', $insert_data); $response = array('status' => $insert ? 'success' : 'error'); echo json_encode($response); }
方案二:改为JSON格式提交,后端对应解析
如果更倾向于JSON格式传输,修改前端AJAX配置,并调整后端解析逻辑:
前端修改:
$.ajax({ type: "POST", url: "<?php echo admin_url('membership/insert_payment')?>", data: JSON.stringify(data), // 将对象转为JSON字符串 contentType: "application/json", // 指定请求内容类型为JSON success: function(response) { document.getElementById("createForm").submit(); }, error: function(xhr, status, error) { console.error("Error:", xhr.responseText); document.querySelector("#payment-failed").style.display = 'block'; } });
后端修改:
public function insert_payment() { // 读取JSON格式的请求体 $post_data = file_get_contents("php://input"); $data = json_decode($post_data, true); // 验证JSON解析是否成功 if(!$data) { $response = array('status' => 'error', 'msg' => '无效的JSON数据'); echo json_encode($response); return; } // 直接使用解析后的$data插入数据库 $insert = $this->db->insert('user_memberships', $data); $response = array('status' => $insert ? 'success' : 'error'); echo json_encode($response); }
额外注意事项
- 如果CodeIgniter开启了CSRF防护,需要在AJAX请求中携带CSRF令牌:
- 表单格式:在
data中添加csrf_token_name: $('input[name="csrf_token_name"]').val()(替换为你的CSRF令牌字段名) - JSON格式:在
data对象中加入CSRF令牌键值对,或在CodeIgniter配置中为该接口添加CSRF例外
- 表单格式:在
- 可通过浏览器开发者工具的网络请求面板,查看提交的参数是否正确,确认前端数据确实发送到后端
内容的提问来源于stack exchange,提问作者shayonix
相关产品推荐
相关产品推荐

