8

我目前有一个大表格发送给我们的付款授权人(通过 action="paymentautherizerURL" 完成),但是当我将交易存储在我的数据库中时,我没有从他们那里得到我需要的所有信息。

我要么需要在提交之前拦截表单数据,以便我可以将其存储在会话中(我们使用的是 PHP / jQuery),要么我也尝试将其发送到获取我需要的信息的中间小脚本,然后使用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 个页面之一(已批准、已拒绝、错误),我们的网站会从那里完成这项工作。但是,它目前停留在此页面,这让我觉得它没有正确发送。

我对各种形式的批评、方法和想法持开放态度。提前非常感谢,如果需要任何其他信息,请告诉我!

4

5 回答 5

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

于 2011-06-10T17:26:15.130 回答
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>
于 2011-06-15T06:55:39.777 回答
1

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

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

现在在您的 process.php 中,您可以处理数据(验证、过滤 ..)

完成后,您可以使用cURL将数据发送到正确的位置

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

于 2011-06-03T05:05:19.193 回答
0

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

于 2011-06-03T05:56:47.657 回答
0

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

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

然后....

如果您使用支付处理器(例如 Paypal)

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

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

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

于 2011-06-03T08:56:41.857 回答