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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:04