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

WHMCS新客户购物车结账手机号验证钩子失效问题咨询

解决WHMCS新客户结账时手机号验证钩子失效的问题

我明白你的困扰——ShoppingCartValidateCheckout钩子对已登录客户没问题,但新客户在结账注册时因为还没生成客户ID,$_SESSION['uid']返回0,导致你没法验证他们的手机号状态。针对这个场景,有两个实用的解决方案:

方案1:改造现有钩子,兼容新客户逻辑

其实ShoppingCartValidateCheckout本身能覆盖新客户场景,只是需要调整你的判断逻辑:

  • 已登录客户:继续用$_SESSION['uid']查询数据库的验证状态;
  • 新客户:从结账提交的表单数据里提取手机号,验证该号码是否已经完成验证流程(你可以把验证记录和手机号绑定,而不是客户ID)。

修改后的代码示例:

add_hook('ShoppingCartValidateCheckout', 1, "PV");
function PV($vars) {
    $clientID = intval($_SESSION['uid']);
    $isVerified = false;

    if ($clientID !== 0) {
        // 处理已登录客户:查询该客户的手机号验证状态
        $result = select_query('tblclients', 'is_phone_verified', ['id' => $clientID]);
        $data = mysql_fetch_array($result);
        $isVerified = $data['is_phone_verified'] === 'true';
    } else {
        // 处理新客户:从结账表单获取手机号(假设表单字段名为phonenumber)
        $phoneNumber = $_POST['phonenumber'] ?? '';
        if (!empty($phoneNumber)) {
            // 查询该手机号是否已完成验证
            $result = select_query('phone_verifications', 'verified', ['phone' => $phoneNumber]);
            $data = mysql_fetch_array($result);
            $isVerified = $data['verified'] === 'true';
        }
    }

    if (!$isVerified) {
        // 返回验证链接,WHMCS会在结账页面显示这个提示
        return '<a href="index.php?m=module">请先验证你的手机号再继续结账</a>';
    }
}

方案2:用ShoppingCartCheckoutPageLoad提前拦截未登录客户

如果你想在新客户进入结账页面时就强制验证(而不是等他们填完表单再提示),ShoppingCartCheckoutPageLoad是更合适的钩子——它会在结账页面加载时触发,不管用户是否登录:

add_hook('ShoppingCartCheckoutPageLoad', 1, "RedirectToPhoneVerification");
function RedirectToPhoneVerification($vars) {
    $clientID = intval($_SESSION['uid']);
    $isVerified = false;

    if ($clientID !== 0) {
        // 已登录客户:查询验证状态
        $result = select_query('tblclients', 'is_phone_verified', ['id' => $clientID]);
        $data = mysql_fetch_array($result);
        $isVerified = $data['is_phone_verified'] === 'true';
    } else {
        // 新客户:检查SESSION中是否有验证标记(验证成功后设置)
        $isVerified = $_SESSION['temp_phone_verified'] ?? false;
    }

    if (!$isVerified) {
        // 直接重定向到验证模块
        header("Location: index.php?m=module");
        exit;
    }
}

额外提示

  • 新客户验证成功后,记得在你的验证模块里设置$_SESSION['temp_phone_verified'] = true,这样他们回到结账页面时能通过检查;
  • 当新客户完成注册后,记得把SESSION里的验证状态同步到tblclients表的对应字段,方便后续订单管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:55:41