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

Flutterwave支付成功后数据无法传入CodeIgniter控制器问题

Flutterwave支付后CodeIgniter无法获取POST数据的解决方案

实现Flutterwave会员支付功能后,前端控制台能正常打印待提交的data,但后端CodeIgniter的insert_payment方法中,$this->input->post()获取的所有字段均为null,无法写入user_memberships表。

问题根源

  1. 前端通过$.param(data)将数据转为**表单格式(application/x-www-form-urlencoded)**提交,但后端错误地尝试读取php://input解析JSON,两种格式不匹配。
  2. 后端代码中重复赋值$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:50:17