如何向WHMCS的viewinvoice.tpl传递自定义参数以显示自定义错误信息?
向WHMCS的viewinvoice.tpl传递自定义变量的可行方案
问题描述
我希望在viewinvoice.tpl中显示自定义错误信息,计划通过传递错误码参数实现。当前网关/回调文件结尾调用函数:
callback3DSecureRedirect($invoiceIdWhmcs, $paymentSuccess);
但该函数不支持传入第三个参数。之后我尝试通过自定义URL重定向:
header("Location: https://xxxx.com/viewinvoice.php?id=11470&paymentfailed=true&abc=bca")
但这种方法下会话无法正常工作。请问是否存在向viewinvoice.tpl传递变量的可行方法?
解决方案
1. 利用WHMCS会话存储传递变量
这是最稳妥的方案,不会影响核心文件的可维护性:
- 在网关/回调文件中,将自定义错误信息或错误码存入WHMCS会话:
// 存入自定义错误文本 $_SESSION['custom_invoice_error'] = "3D验证未通过,请重新尝试支付"; // 或者存入错误码,方便模板根据码显示对应信息 $_SESSION['custom_error_code'] = "3D_AUTH_FAILED"; // 正常调用原重定向函数 callback3DSecureRedirect($invoiceIdWhmcs, $paymentSuccess);
- 在
viewinvoice.tpl模板中读取会话变量并显示,显示后清空避免重复展示:
{if isset($_SESSION['custom_invoice_error'])} <div class="alert alert-danger">{$_SESSION['custom_invoice_error']}</div> {* 清空会话变量 *} {php}$_SESSION['custom_invoice_error'] = null;{/php} {/if}
2. 扩展callback3DSecureRedirect函数(需注意版本更新)
如果能接受修改核心文件(更新WHMCS时记得备份重写),可以直接扩展该函数支持自定义参数:
- 找到
includes/gatewayfunctions.php中的callback3DSecureRedirect函数,添加第三个参数:
function callback3DSecureRedirect($invoiceId, $paymentSuccess, $customData = []) { // 保留原函数所有逻辑 // 添加自定义数据存入会话的逻辑 if (!empty($customData)) { foreach ($customData as $key => $val) { $_SESSION['invoice_custom_' . $key] = $val; } } // 保留原重定向代码 }
- 调用时传入自定义参数:
callback3DSecureRedirect($invoiceIdWhmcs, $paymentSuccess, ['error_code' => 'PAYMENT_FAILED']);
- 在模板中读取对应会话变量即可。
3. 控制器层捕获URL参数并赋值模板
如果自定义重定向的会话问题是跨域导致的,可在viewinvoice.php开头添加参数捕获逻辑:
// 在viewinvoice.php的初始化部分添加 if (isset($_GET['paymentfailed']) && $_GET['paymentfailed'] === 'true') { // 根据参数生成对应错误信息 $errorMsg = "支付流程异常,请检查支付状态或联系客服"; // 赋值给Smarty模板 $smarty->assign('customInvoiceError', $errorMsg); }
- 在
viewinvoice.tpl中直接使用模板变量:
{if $customInvoiceError} <div class="alert alert-danger">{$customInvoiceError}</div> {/if}
这种方法需要确保WHMCS会话配置正确,若网关与WHMCS域名不同,需开启跨域会话支持。
内容的提问来源于stack exchange,提问作者yigitozmen
相关产品推荐
相关产品推荐

