如何在发送之前拦截表单的值?

时间:2011-06-03 04:56:04

标签: php jquery forms post beanstream

我目前有一个大型表格被发送到我们的付款授权人(通过action =“paymentautherizerURL”这样做),但是当我将交易存储在我的邮件中时,我无法获得他要求的所有信息。 DB。

我要么在提交之前拦截表单数据,以便我可以将它存储在会话中(我们使用的是PHP / jQuery),或者我也尝试将其发送到中间scriptlet来获取我需要的信息,然后使用jQuery的$ .post()重新构建并将数据发送给授权人。

然而,第二种方法似乎不起作用,至少在我的努力中是这样。我不确定$ .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 个答案:

答案 0 :(得分:3)

如何更改表单标记以包含onSubmit属性:

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

save_data_function从表单中读取值并将其发送到服务器上的脚本以保存在数据库中(或任何地方)。我使用隐藏的iframe来向用户隐藏此请求...

<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”文件,则可以设置超时。

答案 1 :(得分:2)

由于您的现有示例已经依赖于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>

答案 2 :(得分:1)

而不是action="paymentautherizerURL"您应该将其发送到您自己的页面:

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

现在在您的process.php中,您可以使用数据(验证,过滤..)

完成后,您可以使用cURL

将数据发送到正确的位置

使用curl,您可以发送帖子数据并等待响应以决定显示哪个页面。

答案 3 :(得分:0)

无需将数据放入会话中,提交称为验证函数的表单,其中完成所有验证,然后使用ajex将数据发布到ur process.php,然后它将保留在该页面上... < / p>

答案 4 :(得分:0)

不要将数据存储在会话中 - 这是保留交易数据的错误位置。

将这些内容发布到您托管的脚本中,只需 您需要保存到数据库中的内容,为其生成订单参考,

然后...

如果您使用的是付款处理程序(例如Paypal)

重定向到第二个脚本,传递URL中的订单引用。在第二个脚本中放入一个隐藏字段的表单,其中包含您的支付处理器所需的详细信息以及一些javascript以自动转发表单并向用户发送消息,如“正在连接到Paypal ......”

如果您使用商家服务授权付款

在您从登陆脚本生成输出之前,使用(例如)curl将详细信息发送给您的授权人并解析响应,根据数据库中的订单记录响应,并通过网页向客户输出合适的消息< / p>