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

