Как перехватить значения формы перед отправкой?

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

Мне либо нужно перехватить данные формы перед отправкой, чтобы я мог сохранить их в сеансе (мы используем PHP / jQuery), либо я также попытался отправить его в промежуточный скриптлет, который захватывает необходимую мне информацию, а затем с помощью 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 ответов


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

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

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

<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.файл расширений.


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

Если в форме есть 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>

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

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

сейчас в процессе.РНР вы можете работать с данными (проверка, фильтрация ..)

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

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


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


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

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

затем....

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

перенаправление на второй скрипт, передающий ссылку заказа в URL. На втором скрипте ставим форму со скрытыми полями cotaining только реквизиты вашей платежной системы и некоторые JavaScript для submiot форме автоматически и сообщение для пользователя как подключении к PayPal...'

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

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