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

CodeIgniter控制器方法中如何获取回调URL的$txid等变量?

在CodeIgniter控制器中处理支付API的JSON回调数据

嘿,我来帮你搞定这个支付回调的问题~因为你的API是发送Raw JSON格式的交易数据,所以不能直接用CodeIgniter常规的$this->input->post()方法(它只处理表单编码的数据),得用下面的步骤来获取并处理数据:

步骤1:创建回调控制器方法

首先在你的控制器里新建一个方法,比如payment_callback(),用来接收API的回调请求:

public function payment_callback() {
    // 1. 获取Raw JSON请求体
    $raw_json = $this->input->raw_input_stream;
    
    // 2. 解码JSON为关联数组(true参数转成数组,方便操作)
    $transaction_data = json_decode($raw_json, true);

    // 检查JSON解码是否成功
    if (json_last_error() !== JSON_ERROR_NONE) {
        // 返回400错误告诉API数据格式不对
        http_response_code(400);
        echo json_encode(['status' => 'error', 'message' => '无效的JSON数据']);
        return;
    }

    // 3. 提取你需要的变量
    $txid = isset($transaction_data['txid']) ? $transaction_data['txid'] : null;
    $reason = isset($transaction_data['reason']) ? $transaction_data['reason'] : null;
    $reference = isset($transaction_data['reference']) ? $transaction_data['reference'] : null;

    // 🔴 非常重要:验证回调的合法性!
    // 这一步绝对不能省,防止恶意伪造的回调请求
    // 举个例子,假设API会发送一个signature字段,你用自己的API密钥验证:
    // $received_signature = $transaction_data['signature'] ?? '';
    // $expected_signature = hash_hmac('sha256', $raw_json, '你的API密钥');
    // if ($received_signature !== $expected_signature) {
    //     http_response_code(403);
    //     echo json_encode(['status' => 'error', 'message' => '签名验证失败']);
    //     return;
    // }

    // 4. 验证数据完整性并更新支付状态
    if ($txid && $reference && $reason === 'paid') {
        // 加载你的支付模型(假设模型叫Payment_model)
        $this->load->model('Payment_model');
        
        // 调用模型方法更新数据库,标记支付为已完成
        $update_success = $this->Payment_model->mark_transaction_as_paid($reference, $txid);

        if ($update_success) {
            // 返回200成功响应,告诉API你已经处理完成
            http_response_code(200);
            echo json_encode(['status' => 'success']);
        } else {
            // 数据库更新失败,返回500错误
            http_response_code(500);
            echo json_encode(['status' => 'error', 'message' => '支付状态更新失败']);
        }
    } else {
        // 缺少必要数据或者支付状态不是paid,返回400错误
        http_response_code(400);
        echo json_encode(['status' => 'error', 'message' => '缺少必要交易数据或支付未成功']);
    }
}

步骤2:配置回调URL

把你的回调URL设置成这个控制器方法的访问地址,比如:https://你的域名/index.php/支付控制器名/payment_callback(如果开启了URL重写,就是https://你的域名/支付控制器名/payment_callback)

关键注意事项

  • 安全第一:一定要做签名验证!每个正规的支付API都会提供签名机制,按照API文档的要求验证回调数据的真实性,避免被恶意请求篡改支付状态。
  • 响应规范:必须返回正确的HTTP状态码和JSON响应,支付API会根据这个判断是否需要重试回调。
  • 错误处理:要考虑各种异常情况,比如JSON解析失败、数据缺失、数据库更新失败等,都要返回对应的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:02:42