Проверка PHP - передача значений http POST в стороннюю кассу - PullRequest
2 голосов
/ 03 февраля 2010

Я не знаю, возможно ли это, я не могу найти другие справочные руководства, так что это может быть невозможно ...

У меня есть страница оформления заказа, которая отправляет загрузку переменных в сторонний обработчик платежей (WorldPay).

Я хочу знать, возможно ли поместить какой-либо сценарий PHP между двумя страницами для проверки.

Например, если товар в корзине был распродан во время заполнения формы, он может поймать покупателя до того, как будут приняты деньги. Или полезно, если они вмешиваются в данные формы.

Если бы я делал это на своем собственном сайте, я мог бы использовать сеансы для передачи данных POST, но, поскольку это внешний веб-сайт, я не знаю, как отправить данные без создания другой HTML-страницы со скрытой формой и обновления экземпляр.

Возможно ли сделать это "невидимо" - фактически не отображая промежуточную HTML-страницу?

Ответы [ 5 ]

2 голосов
/ 04 февраля 2010

Да, вы можете сделать это, подключившись к обработчику 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, но это откат-safe: форма по-прежнему отправляется без поддержки JS.

2 голосов
/ 03 февраля 2010

EDIT

Эшли сказала:

Хорошо, я посмотрел на CURL Руководство и написано это очень просто скрипт для пересылки значений POST сторонний заказ. Это просто отображает содержимое оформления заказа страница хотя. URL-адрес показывает сценарий в настоящее время работает, а не пересылка на сторонний сайт. Также все их относительно связанные графики не будет работать. Может ли «истинное» переадресация быть достигнутым с помощью 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/success и secure.wp3.rbsworldpay.com/wcc/error показывают, была ли транзакция успешной или неудачной соответственно.

Тогда вам действительно нужно будет сделать 2 запроса извне, как часть процесса транзакции, которые можно обобщить следующим образом:

  1. Пользователь делает покупки на вашем сайте и добавляет товары в корзину
  2. Пользователь нажимает на оформление заказа, и вы проверяете данные корзины / пользователя
  3. Если данные из # 2 были действительны, вы упаковываете данные и отправляете в secure.wp3.rbsworldpay.com/wcc/purchase через cURL
  4. Если ответ cURL от # 3 был успешным, вы создаете свою собственную страницу подтверждения, используя данные из ответа cURL, и отображаете ее для пользователя.
  5. Пользователь отправляет подтверждение покупки на ваш сервер.
  6. Вы упаковываете данные, отправленные на ваш сервер, в # 5 и отправляете их на secure.wp3.rbsworldpay.com/wcc/confirm через cURL.
  7. Если ответ cURL от # 6 был успешным, вы анализируете его на предмет ожидаемого сообщения об ошибке или успеха, возвращенного с внешнего сервера, и отображаете их или ваши собственные сообщения об ошибках.
  8. В случае ошибки промыть и повторить ;-)

Вообще говоря, большинство платежных процессоров имеют опцию обработки, которая поддерживает этот базовый процесс, который часто позволяет легко анализировать данные в виде XML, JSON или Plain Text вместо HTML. Возможно, вы захотите посмотреть на это. Часто у них часто бывают библиотеки, созданные для различных языков программирования, чтобы облегчить процесс интеграции.


Да, конечно ... я обычно использую расширение curl для таких вещей или класс клиента http, который использует curl. Возможно, вы захотите сделать это немного проще для себя и использовать одну из этих библиотек классов - например, Zend_Http_Client. Он поддерживает не только curl, но также сокеты и прокси.

0 голосов
/ 03 февраля 2010

Мне скорее нравится пакет HTTP_Request2 от PEAR, который в основном оборачивает cURL и / или сокеты в некоторые простые объекты. POSTing работает отлично. Вы можете использовать это, чтобы отправить запрос POST вашему контролеру проверки, а затем обработчику платежей.

0 голосов
/ 03 февраля 2010

Да, вы можете. То, что вы ищете, это функция CURL:

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

Также см .:

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

0 голосов
/ 03 февраля 2010

Я бы посоветовал вам поступить так:

Прежде чем направлять пользователя в форму, вы проверяете (с помощью SQL-запросов), был ли товар в корзине распродан.Если он был продан, перенаправьте пользователя на другую страницу, сообщив, что этот предмет был продан, в противном случае дайте ему перейти к форме для новой покупки.

...