2

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

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

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

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

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

是否可以“不可见”地做到这一点 - 实际上不显示中间的 HTML 页面?

4

5 回答 5

2

编辑

阿什利 说:

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

简短的回答 -

使用您描述付款流程的方式,如果您想在场外流程的中间进行操作(自定义 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通过 cURL发布到
  4. 如果来自 #3 的 cURL 响应成功,您可以使用 cURL 响应中的数据构建自己的确认页面并将其显示给用户。
  5. 用户向您的服务器提交购买确认。
  6. 您将在#5 中提交到服务器的数据打包并secure.wp3.rbsworldpay.com/wcc/confirm通过 cURL 发布。
  7. 如果来自 #6 的 cURL 响应成功,则将其解析为从外部服务器返回的预期“错误”或“成功”消息,并显示它们或您自己的自定义错误消息。
  8. 如果出现错误,请冲洗并重复;-)

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


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

于 2010-02-02T21:48:57.097 回答
2

是的,您可以通过连接到表单的 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 */
  }
};

我们使用此代码段将表单数据存储在会话中,然后再发布到第 3 方,以便在第 3 方返回我们的页面时使用它。

编辑:请记住,这仅适用于启用 JS,但它是回退安全的:表单仍然在没有 JS 支持的情况下提交。

于 2010-02-04T14:52:33.843 回答
0

我建议你这样做:

在将用户引导至表单之前,您(通过 SQL 查询)检查篮子中的商品是否已售罄。如果已售出,则将用户重定向到其他页面,说明该商品已售罄,否则让他转到新购买表格。

于 2010-02-02T21:48:36.160 回答
0

是的你可以。您正在寻找的是 CURL 功能:

http://php.net/manual/en/book.curl.php

另见:

http://php.dzone.com/news/execute-http-post-using-php-cu

于 2010-02-02T21:48:57.770 回答
0

我更喜欢 PEAR 的HTTP_Request2包,它基本上将 cURL 和/或套接字包装在一些简单的对象中。发布效果很好。您可以使用它将 POST 请求退回到您的验证检查器,然后发送到支付处理器。

于 2010-02-02T22:04:14.003 回答