3

不敢相信我在问这个问题,但这里......

(在 Codeigniter 中使用 PHP)

我正在将 Barclays 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');
}

(注意添加的“退出”)。

一旦我包含此退出,代码就会在所有测试用例中按需要执行,我们开始看到支付成功页面。移除出口会立即恢复到 100% 测试失败。

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

4

3 回答 3

1

唯一可能的解释是 $success 没有更新并且它的预分配值为 false 的情况。通过 var_dump 检查 $success 的值。

于 2013-04-09T11:53:05.953 回答
1

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

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

于 2013-04-10T09:12:19.623 回答
0

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

于 2013-04-09T11:52:34.657 回答