Функция ответа на платеж (обратный вызов) в RBS Worldpay (перенаправление HTML) не работает с моими файлами cookie и данными сеанса - PullRequest
0 голосов
/ 11 июня 2011

В настоящее время я работаю над интеграцией веб-сайта электронной коммерции на основе PHP / MySQL, которым я управляю, с платежным шлюзом RBS Worldpay.Вот моя проблема:

Клиент заполняет свою корзину покупок, и при этом содержимое сохраняется в глобальном массиве $_SESSION, а также сохраняется в файле cookie.Когда клиент выписывается, его отправляют на страницы Worldpay, чтобы указать свои платежные реквизиты.Я использую функцию «Ответ на платеж» / функцию обратного вызова, чтобы перенаправить успешный платеж на мою собственную страницу «translation.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 Request Object)"

Кто-нибудь знаком с этим?Как я могу обойти это?

Спасибо за чтение!

Майкл

1 Ответ

2 голосов
/ 11 июня 2011

Когда WorldPay заканчивает обработку платежа (помните: вы не знаете, что там делал клиент, поскольку все операции с данными карты были выполнены на сайте WorldPay), он отправляет вам запрос POST , сообщая о результате транзакции.(принято, отклонено, клиент отменен и т. д.).Это делается напрямую с их серверов и , а не с клиентского компьютера / браузера , поэтому вы не можете сопоставить этот запрос с вашим существующим сеансом проверки (я полагаю, вы делаете какой-то сайт электронной коммерции здесь), который принадлежит клиенту.

При перенаправлении клиента в WorldPay вам необходимо передать дополнительную информацию вместе с необходимыми полями.Такие поля имеют префикс MC_ , и вы можете передать довольно много из них (я делал это более 2 лет назад и не помню всех деталей).

Вам необходимо отправить достаточно информации вэти поля (но как можно меньше и их шифрование), поэтому, когда такой запрос POST от WorldPay поступает на ваш confirmation.php, вы извлекаете эти дополнительные поля и восстанавливаете сеанс (смотрите session_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% сейчас - они могли внести изменения во весь процесс с тех пор).

...