Woocommerce COD订单短信API集成报错,请求排查代码问题
解决WooCommerce COD下单短信通知的PHP错误与代码优化
首先,你遇到的PHP Fatal error: Call to undefined function curl()是因为误用了CURL函数,PHP里根本没有curl()这个函数,这是最核心的问题。除此之外,你的代码还有几个需要修正的地方,我一步步给你梳理:
1. 修正CURL调用的核心错误
你混淆了CURL的调用流程:正确的步骤是用curl_init()初始化请求句柄,然后用curl_setopt()配置各种请求选项,最后用curl_exec()执行请求,而不是错误地调用不存在的curl()函数。同时你还犯了变量名不一致的错误——把初始化的句柄存在$jsonurl里,后面却用$ch来设置选项,这会导致未定义变量的问题。
2. 添加COD支付方式的判断
你的需求是仅当用户选择货到付款(COD)时发送短信,但原代码没有做这个判断,需要新增支付方式的校验逻辑。
3. 优化手机号获取逻辑
如果是未注册的访客用户,$order->user_id会是0,这时候通过get_user_meta()拿不到手机号,应该直接从订单对象里获取账单手机号:$order->get_billing_phone()。
4. 完善短信参数与错误处理
原代码里的[msg]是占位符,需要替换成实际的短信内容,同时要对短信内容做URL编码,避免特殊字符破坏请求格式;另外建议添加CURL请求的错误捕获,方便排查问题。
修正后的完整代码
add_action('woocommerce_thankyou', 'custom_cod_order_sms_notification', 10, 1); function custom_cod_order_sms_notification($order_id) { // 跳过无效订单ID if (!$order_id) return; // 获取订单对象(WooCommerce 3.0+推荐用法) $order = wc_get_order($order_id); // 仅当支付方式为COD时执行 if ($order->get_payment_method() !== 'cod') return; // 获取客户手机号 $billing_phone = $order->get_billing_phone(); // 如果手机号为空,直接返回 if (empty($billing_phone)) return; // 短信API参数配置 $user_id = '[你的API用户ID]'; $password = '[你的API密码]'; $sms_message = urlencode('感谢您的下单!您的订单号是:' . $order->get_order_number() . ',我们将尽快为您发货。'); // 构造请求数据 $post_data = http_build_query([ 'userid' => $user_id, 'pwd' => $password, 'msg' => $sms_message, 'mobileno' => $billing_phone ]); // 初始化CURL请求 $ch = curl_init('http://b2bsms.telecard.com.pk/SMSPortal/Customer/ProcessSMS.aspx'); // 设置CURL选项 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:禁用SSL证书校验(如果目标网站证书有问题,生产环境不建议) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 执行请求并获取结果 $result = curl_exec($ch); // 捕获CURL错误 if (curl_errno($ch)) { error_log('SMS API请求错误:' . curl_error($ch)); } // 关闭CURL句柄 curl_close($ch); // 可选:打印结果用于调试(生产环境建议注释掉) // echo $result; return $order_id; }
额外说明
- 记得把代码里的
[你的API用户ID]和[你的API密码]替换成实际的API凭证; urlencode()用于处理短信内容里的特殊字符,确保请求参数格式正确;- 生产环境建议注释掉
echo $result,避免干扰页面渲染,改用error_log()记录请求结果方便排查; - 如果目标API使用HTTPS,建议保留SSL证书校验(不要开启那两行注释的选项),确保请求安全。
内容的提问来源于stack exchange,提问作者Atif
相关产品推荐
相关产品推荐

