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

如何在URL中传递Order Id并获取响应?排查API调用报错及写入JSON

解决API调用错误及实现响应写入文件的方案

一、修复API调用的错误问题

你收到的错误提示说明当前的请求方式或参数传递不符合目标API的要求,我们分两种常见场景调整代码:

场景1:API期望通过URL参数(GET请求)传递OrderId

如果目标API是通过GET方式接收OrderId,修改请求代码如下:

function my_api_call( $order_id ){ 
    // Order Setup Via WooCommerce 
    $order = new WC_Order( $order_id ); 
    // 若后续无需用到订单商品,可暂时注释以下代码减少资源消耗
    // $items = $order->get_items(); 

    // 将OrderId作为URL参数拼接(urlencode避免特殊字符问题)
    $url = "http://example.com/Api/WooCommerceApi/SaveSubscriptionAndZoomData?OrderId=" . urlencode($order_id); 
    $ch = curl_init( $url ); 

    // 显式声明GET请求(curl默认即为GET,此步可增强代码可读性)
    curl_setopt( $ch, CURLOPT_HTTPGET, 1); 
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt( $ch, CURLOPT_HEADER, 0); 
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); 

    $response = curl_exec( $ch ); 

    // 检查Curl请求是否失败,便于排查问题
    if(curl_errno($ch)){
        $error_msg = curl_error($ch);
        write_log("Curl Error: " . $error_msg);
    }
    curl_close($ch); // 记得关闭Curl资源,避免内存泄漏

    write_log ("Order Id for new user: " .$order_id ." and Response is : ".$response); 

    // 调用响应写入文件的函数
    save_response_to_file($response, $order_id);
} 
add_action( 'woocommerce_payment_complete', 'my_api_call');

场景2:API期望POST请求且接收JSON格式的请求体

如果API要求通过POST传递JSON数据,调整代码如下(需设置正确的请求头):

function my_api_call( $order_id ){ 
    // Order Setup Via WooCommerce 
    $order = new WC_Order( $order_id ); 
    // $items = $order->get_items(); 

    $url = "http://example.com/Api/WooCommerceApi/SaveSubscriptionAndZoomData"; 
    // 构造JSON格式的请求数据
    $post_data = json_encode(['OrderId' => $order_id]);

    $ch = curl_init( $url ); 
    curl_setopt( $ch, CURLOPT_POST, 1); 
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_data); 
    // 设置Content-Type为application/json,告知API请求体格式
    curl_setopt( $ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($post_data)
    ]);
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt( $ch, CURLOPT_HEADER, 0); 
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); 

    $response = curl_exec( $ch ); 

    if(curl_errno($ch)){
        $error_msg = curl_error($ch);
        write_log("Curl Error: " . $error_msg);
    }
    curl_close($ch);

    write_log ("Order Id for new user: " .$order_id ." and Response is : ".$response); 

    save_response_to_file($response, $order_id);
} 
add_action( 'woocommerce_payment_complete', 'my_api_call');

二、实现将JSON响应写入文件的功能

添加以下辅助函数,它会把API响应写入到WordPress上传目录的子文件夹中(需确保目录有写入权限):

function save_response_to_file($response, $order_id){
    // 定义响应文件的保存目录(可根据需求修改)
    $save_dir = WP_CONTENT_DIR . '/api_responses/';
    // 如果目录不存在则自动创建
    if(!is_dir($save_dir)){
        mkdir($save_dir, 0755, true);
    }
    // 生成唯一文件名,避免不同订单的响应文件被覆盖
    $file_name = 'order_' . $order_id . '_response_' . date('YmdHis') . '.json';
    $file_path = $save_dir . $file_name;

    // 写入文件并检查结果
    $write_result = file_put_contents($file_path, $response);
    if($write_result === false){
        write_log("Failed to save response for order " . $order_id . " to file.");
    } else {
        write_log("Response saved successfully to: " . $file_path);
    }
}

额外提示

  • 优先查看目标API的官方文档,明确它支持的请求方法、参数传递规则,这是彻底解决错误的核心前提。
  • 若文件保存失败,检查WP_CONTENT_DIR目录的权限,通常设置为755即可(部分服务器可能需要777,需根据实际情况调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:22:53