0

我目前正在将我管理的基于 PHP/MySQL 的电子商务网站与 RBS Worldpay 支付网关集成在一起。这是我的问题:

客户填满了他的购物篮,当他这样做时,内容将存储在$_SESSION全局数组中,同时也存储在 cookie 中。当客户结账时,他会被发送到 Worldpay 页面以输入他的付款详细信息。我正在使用“付款响应”/回调功能将成功的付款重定向到我自己的页面“confirmation.php”,它告诉客户一切正常,并在后台进行一些数据库查询。

一切都好!

但是,此时我也希望从$_SESSION数组中清空购物车数据并删除 cookie。很好,我只是使用:

$_SESSION['cart'] = array();
setcookie('cart', '', 0, '/');

但这不起作用。这与这个重定向页面的 URL 实际上是https://secure-test.wp3.rbsworldpay.com/wcc/purchase而不是www.mysite.co.uk/confirmation.php. 作为测试,我让我的确认页面回显了 phpinfo() 和 $_SERVER 变量,一切似乎都很好,例如:

_SERVER["DOCUMENT_ROOT"]    /var/www/vhosts/mysite.co.uk/httpdocs
_SERVER["SCRIPT_FILENAME"]  /var/www/vhosts/mysite.co.uk/httpdocs/confirmation.php
_SERVER["SERVER_PROTOCOL"]  HTTP/1.0
_SERVER["REQUEST_METHOD"]   POST
_SERVER["QUERY_STRING"] installation=[xxxxxx]&msgType=authResult
_SERVER["REQUEST_URI"]  /confirmation.php?installation=xxxxxx&msgType=authResult
_SERVER["SCRIPT_NAME"]  /confirmation.php
_SERVER["PHP_SELF"] /confirmation.php
_SERVER["HTTP_USER_AGENT"]  WJHRO/1.0 (WorldPay Java HTTP Request Object)

因此,由于 URL 指向不同的域,我的脚本似乎无法访问 $_SESSION 和 $_COOKIE 数据,也无法对其进行操作。我不知道这个 Worldpay 系统是如何做到的,它不是 iframe 或类似的东西,但我怀疑它与用户代理有关 - “WJHRO/1.0(WorldPay Java HTTP 请求对象)”

有人熟悉这个吗?我怎样才能解决这个问题?

谢谢阅读!

迈克尔

4

1 回答 1

2

当 WorldPay 完成付款处理时(请记住:您不知道客户在那里做了什么,因为所有使用卡详细信息的操作都是在 WorldPay 的网站上执行的)它会向您发送一个POST请求,告知交易结果(接受、拒绝、客户取消等) . 它是直接从他们的服务器而不是从客户计算机/浏览器完成的,因此您无法将此请求与属于客户的现有结帐会话(我假设您在这里做一些电子商务网站)相匹配。

将客户重定向到 WorldPay 时,您需要传递附加信息以及必填字段。此类字段具有MC_前缀,您可以传递其中不少(我在 2 年前做过,不记得所有细节)。

您需要在这些字段中发送足够的信息(但尽可能少并对其进行加密),因此当来自 WorldPay 的此类 POST 请求发送给您时,您confirmation.php可以提取这些附加字段并恢复会话(查看session_id()和相关函数)或其他内容类似的(取决于您如何实现会话处理;如果会话数据存储在数据库中 - 这更容易 - 只要您知道会话 ID,您就可以轻松模拟会话)并继续结帐。

请记住,您的输出confirmation.php将被发送回 WorldPay 而不是客户。WorldPay 将首先处理该页面,然后将其显示给客户。因此,这个页面应该非常简单(非常基本的界面,否则 WorldPay 可以删除一些标签),它应该只是将您的客户重定向回您的网站(例如,到real_confirmation.php),您将可以完全访问客户会话等,并且您将显示正确的确认页面。您可以使用简单的 JavaScript 或元标记(例如<meta http-equiv="refresh" content="2;url=http://www.example.com/real_confirmation.php">)来实现此类重定向。

您必须仔细检查这一点,因为它已经超过 2 年了,因为我已经编写了这个代码并且目前没有我的所有代码,并且从那时起情况/规则可能会发生变化(PS 我们不再使用 WorldPay,因此我无法确认我的代码现在可以 100% 工作——从那时起他们可能已经对整个过程进行了更改)。

于 2011-06-10T21:08:18.757 回答