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

