PHP出口使我的代码工作



真不敢相信我会问这个问题....

(在Codeigniter中使用PHP)

我正在整合巴克莱EPDQ到一个电子商务网站接受信用卡支付。支付成功后,EPDQ通过URL中的查询字符串参数重定向回站点。我正在寻找从EPDQ发送回来的orderID,如果它在那里,我在PHP会话中存储一些东西,并重定向到支付确认页面。如果付款不成功,则订单ID将不在那里,因此我将重定向到显示CI视图文件的付款失败方法。

这个检查和会话保存例程的条件如下:

$success = false;
if($_GET['orderID'])
{
    $_SESSION['payment']['order_id']  = $_GET['orderID'];
    $_SESSION['payment']['method']    = 'card';
    $_SESSION['payment']['ref']       = $_GET['PAYID'];
    $_SESSION['payment']['status']    = 'Completed';
    $success = true;
}

(请注意,在执行此代码之前,会话已初始化,支付数组已创建)

到目前为止很简单,对吧?指示的代码看起来像这样:

if(!$success)
{
    redirect('payment/card/fail');
}
else
{
    redirect('payment/confirmation');
}

我遇到的问题是这个重定向不像我期望的那样工作。EPDQ报告成功付款,并根据需要重定向回我们的网站。但是,当我的脚本计算它发送的GET参数并进行重定向时,它总是使用失败的重定向............除非,这是真正难倒我的地方,我这样做:

if(!$success)
{
    exit('Failed');
    redirect('payment/card/fail');
}
else
{
    redirect('payment/confirmation');
}

(注意添加的'exit')。

一旦我包含这个出口,代码在所有测试用例中按预期执行,我们开始看到支付成功页面。删除出口将立即恢复到100%测试失败状态。

有没有人知道为什么会发生这种情况,因为我以前从未见过这种情况?

唯一可能的解释是,$success没有更新,它取的是预赋的值false。通过var_dump查看$success的值

发生这种情况的原因是由于巴克莱EPDQ内部的一个设置,它在主支付响应之前发送了一个响应(这是一个预先响应,允许根据传入的成功或失败对站点进行定制)。这意味着我的函数被击中两次,一次是在第一次击中时没有GET参数,另一次是在返回带有参数的完整支付响应时带有GET参数。放入出口意味着没有执行第一次命中的失败重定向,因此允许脚本显示成功条件。从EPDQ中删除/取消此预响应现在意味着所有条件都按要求执行。

最后不是真正的PHP问题,但值得注意的是,如果有人正在集成EPDQ,并错误地将此响应设置在EPDQ的管理界面

最有可能的是,如果达到重定向('payment/confirmation')的唯一方法是通过添加调用退出构造,我认为重定向到失败路由在所有情况下都会发生(即使脚本应该成功结束)。

相关内容

最新更新