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

