RBS Worldpay中的支付响应(回调)功能(HTML重定向)无法使用我的cookie和会话数据



我目前正在将我管理的一个基于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请求对象)"有关

有人熟悉这个吗?我该怎么绕过这个?

感谢阅读!

Michael

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

将客户重定向到WorldPay时,您需要传递附加信息以及所需字段。这样的字段有MC_前缀,您可以传递其中相当多的字段(我两年多前就这样做了,不记得所有细节)。

您需要在这些字段中发送足够的信息(但要尽可能少并加密),因此当WorldPay的POST请求到达您的confirmation.php时,您可以提取这些额外的字段并恢复会话(查看session_id()和相关函数)或类似的信息(这取决于您如何实现会话处理;如果会话数据存储在DB中——这更容易——只要您知道会话id,您就可以轻松地模拟会话)并继续签出。

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

你必须仔细检查这一点,因为我已经编码了两年多了,目前还没有所有的代码,从那时起情况/规则可能会改变(请注意,我们不再使用WorldPay,因此我无法确认我的代码现在是否100%有效——从那时起,他们可能已经对整个过程进行了更改)。

最新更新