Как перехватить значения формы перед отправкой? - PullRequest
8 голосов
/ 03 июня 2011

В настоящее время у меня есть большая форма, которая отправляется нашему авторизатору платежей (сделано действием action = "paymentautherizerURL"), однако я не получаю всю необходимую мне информацию обратно, когда я иду, чтобы сохранить транзакцию в моемDB.

Мне нужно либо перехватить данные формы перед их отправкой, чтобы я мог сохранить их в сеансе (мы используем PHP / jQuery), либо я также попытался отправить их в промежуточный скриптлет, который захватываетнеобходимую информацию, а затем с помощью $ .post () jQuery пересоздать и отправить данные авторизатору.

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

<?php
session_start();

$post = $_POST;

//gets all of the information that beanstream does not return to approved.php, but is still required to make
//a legitimate database entry. gets from the POST and stores in the session array for approved.PHP to access

$_SESSION['approvedArray']['billAddress'] = $_POST['ordAddress1'];
$_SESSION['approvedArray']['billProvince'] = $_POST['ordProvince'];
$_SESSION['approvedArray']['billCountry'] = $_POST['ordCountry'];
$_SESSION['approvedArray']['billPostalCode'] = $_POST['ordPostalCode'];
$_SESSION['approvedArray']['billCity'] = $_POST['ordCity'];

$_SESSION['approvedArray']['shipAddress'] = $_POST['shipAddress1'];
$_SESSION['approvedArray']['shipPostal'] = $_POST['shipPostalCode'];
$_SESSION['approvedArray']['shipCity'] = $_POST['shipCity'];
$_SESSION['approvedArray']['shipProvince'] = $_POST['shipProvince'];
$_SESSION['approvedArray']['shipCountry'] = $_POST['shipCountry'];

session_write_close();
//the javascript below will send what is required to beanstream as though it were sent from the form

<script type='text/javascript'>
$.post(, {
    <?php
    //rebuild the POST such that "name: value, " except the last name/value will not be followed by a comma
    $keys = array_keys($_POST);
    for($i = 0; $i < count($_POST); $i++) {
        $currentKey = $keys[$i];
        $currentPost = $_POST[i];
        echo $currentKey . ": " . $currentPost;
        if ($i < (count($_POST) - 1)) {
            echo ", ";
        }
    }
    ?>
});
</script> 

?>

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

Я открыт для всех форм критики, подходов и идей.Большое спасибо заранее, и если нужна какая-либо другая информация, пожалуйста, дайте мне знать!

Ответы [ 5 ]

3 голосов
/ 10 июня 2011

Как насчет изменения тега формы для включения атрибута onSubmit:

<form action="notmal_action.whatever" onSubmit="return save_data_function()">

Где функция save_data_ считывает значения из формы и отправляет их в скрипт на вашем сервере для сохранения в базе данных (или гдеКогда-либо).Я использую скрытые фреймы, чтобы скрыть этот запрос от пользователя ...

<script>
function save_data_function() {
$('#iframe_id').attr('src', 'data_saving_script.extension?data_1=' + $('form_data_1').val().serialize() + '&data_2=' + $('form_data_2').val().serialize());
}
</script>

Вы можете установить тайм-аут, если данные не передаются достаточно быстро в файл data_saving_script.extension.

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

Поскольку ваш существующий пример уже зависит от javascript, вы можете перейти к сохранению данных с помощью AJAX, а затем использовать традиционную отправку для выполнения "реального" POST на платежном шлюзе.

Предполагая, что ваша форма имеет id="foo", вы можете сделать что-то вроде этого:

<script>
$('form#foo').submit(function(event, doRealSubmit) {
    // this executes on the second pass
    if (doRealSubmit) {
        // returning true gets browser to do a real submit
        return true; 
    }

    // this executes on the first pass
    $.ajax({
        url: '/url/to/post/to/your/server',
        type: 'POST',
        // this serializes the form data in "application/x-www-form-urlencoded"
        data: $(this).serialize(),
        success: function(data) {
            // trigger 'submit' event again, but pass the doRealSubmit flag
            $('form#foo').trigger('submit', [true]);
        }
    });

    // returning false prevents browser from processing the real submit
    return false;
});
</script>
1 голос
/ 03 июня 2011

вместо action="paymentautherizerURL" вы должны отправить его на свою страницу:

<form action='process.php' method='post'>

теперь в вашем process.php вы можете работать с данными (проверка, фильтрация ..)

и когда вы закончите, вы можете отправить данные в нужное место, используя cURL

С помощью curl вы можете отправлять данные поста и ждать ответа, чтобы решить, какую страницу показывать.

0 голосов
/ 03 июня 2011

Не храните данные в сеансе - это неправильное место для хранения транзакционных данных.

Опубликуйте материал в размещенном вами сценарии, напишите только материал, который нужно сохранить в базе данных, сгенерируйте для него ссылку на заказ,

тогда ....

если вы используете платежный процессор (например, Paypal)

перенаправить на второй скрипт, передавая ссылку заказа в URL. Во втором сценарии введите форму со скрытыми полями, включающими только данные, необходимые вашему обработчику платежей, и некоторый javascript для автоматической отправки формы и сообщение пользователю, например «Подключение к Paypal ...»

Если вы используете сервис торговца для авторизации платежа

прежде чем генерировать выходные данные из сценария посадки, отправьте детали своему авторизатору, используя (например) curl, и проанализируйте ответ, запишите ответ на заказ в базе данных и выведите подходящее сообщение клиенту через веб-страницу

0 голосов
/ 03 июня 2011

Нет необходимости помещать данные в сеансы, при отправке формы, называемой функцией проверки, в которой выполняется вся проверка, а затем отправлять данные в ur process.php с помощью ajex, после чего они сохраняются на этой странице ...

...