我不知道这是否可能,我似乎找不到任何其他帮助指南,所以这可能不可能......

我有一个结账页面,它将大量变量转发到第三方支付处理器(WorldPay)。

我想知道是否可以在两个页面之间放置某种 PHP 脚本以进行验证。

例如,如果购物篮中的商品在填写表格时已售完,则可能会在客户付款之前抓住客户。或者如果他们篡改表单数据则很有用。

如果我在自己的网站上执行此操作,我可以使用会话来转发 POST 数据,但由于它是外部网站,我不知道如何在不创建另一个带有隐藏表单和刷新的 HTML 页面的情况下发送数据。

是否可以“隐形”地做到这一点——实际上不显示 HTML 页面?

有帮助吗?

解决方案

是可以通过钩到形式的的onsubmit钩和发出调用Ajax这样做(使用jQuery):


$('#myform')[0].onsubmit = function() {
  if (form_check_elements(this.elements)) { /* ««« eg JS validator here */
    data = $('#myform').serialize();
    $.post('/ajax_validator.php', data, function(data, textStatus) {
      $('#myform')[0].submit();  /* ««« check the textStatus before here and
                                        eventually do not submit (wrap it in
                                        an if-clause) */
    });
    return false; /* make the form not post directly */
  } else {
    return false; /* do not post if JS validation fails */
  }
};

我们用这个片段存储的表单数据在会议之前发布到第三方,所以我们把它时可用的第三方返回到我们的页面。

编辑:请记住,这只有在工作JS启用,但它是回退安全:该表格还提交了一个不支持JS

其他提示

编辑:

阿什利说:

好的,我看了看卷曲手册,并编写了这个非常简单的脚本,以将帖子值转发到第三方结帐。不过,这只是显示结帐页面的内容。URL地址显示当前正在运行的脚本而不是转发到第三方网站。同样,他们所有相对链接的图形将不起作用。可以使用卷发来实现“真实的”转发吗?

简短的回答 - .

按照您描述付款流程的方式,如果您想在场外流程中进行操作(自定义 html/消息、验证数据等),那么您需要处理 cURL 允许您执行的整个流程。

使用 cURL,您不会“转发”请求,而是“代理”请求。因此,浏览器 URL 永远不会改变并且相关图形不起作用的事实是预期的。通过使用 cURL 或类似的东西,您永远不会让用户最终用户知道他们甚至正在触摸外部页面。您将在您的服务器上处理对该外部服务器的所有请求,然后简单地将外部服务器的响应显示给您的用户或解析该响应,以便您可以以自定义方式使用其中的数据。

本质上这意味着如果 secure.wp3.rbsworldpay.com/wcc/purchase 返回一个需要用户进一步交互的表单,您必须在服务器上模仿此表单并显示它。然后,当用户提交您的表单时,您再次使用 cURL 向外部服务器发出请求 - 这次是发布用户提交的下一轮数据。举例来说:

  • secure.wp3.rbsworldpay.com/wcc/purchase 显示购物车
  • secure.wp3.rbsworldpay.com/wcc/confirm 显示付款的最终确认
  • secure.wp3.rbsworldpay.com/wcc/successsecure.wp3.rbsworldpay.com/wcc/error 分别显示交易是成功还是失败。

那么,作为交易流程的一部分,您实际上需要向外部发出 2 个请求,可以总结如下:

  1. 用户在您的网站上购物并将商品添加到购物车
  2. 用户点击结账,您验证购物车/用户数据
  3. 如果 #2 中的数据有效,则将数据打包并发布到 secure.wp3.rbsworldpay.com/wcc/purchase 通过卷曲
  4. 如果 #3 的 cURL 响应成功,您可以使用 cURL 响应中的数据构建自己的确认页面并将其显示给用户。
  5. 用户向您的服务器提交购买确认。
  6. 您将#5 中提交到服务器的数据打包并发布到 secure.wp3.rbsworldpay.com/wcc/confirm 通过卷曲。
  7. 如果 #6 的 cURL 响应成功,则您可以解析它以获取从外部服务器返回的预期“错误”或“成功”消息,并显示它们或您自己的自定义错误消息。
  8. 如果出现错误,请冲洗并重复;-)

一般来说,大多数支付处理器都有支持此基本流程的处理选项,通常返回易于解析的数据为 XML、JSON 或纯文本而不是 HTML。你可能想看看这个。很多时候,他们通常会为各种编程语言构建库,以帮助简化集成过程。


是的,确实是...我通常使用 curl 扩展来做这样的事情,或者使用一个 http 客户端类 curl. 。您可能想让自己更轻松一点并使用这些类库之一 - 例如 Zend_Http_Client. 。它不仅支持 curl 还有套接字和代理。

我比较喜欢从PEAR的 HTTP_Request2 包,其中基本上包裹卷曲和/或插座在一些简单的对象。张贴的伟大工程。你可以用它来反弹POST请求您的验证检查器,然后到支付处理器。

我建议你去这样的:

用户引导到表单之前,检查(通过SQL查询)在篮中的项目是否已经售完。如果它已被出售,将用户重定向至其他网页说,这个项目已经卖完了,否则让他去的形式对新购买。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top