8

現在、支払いオーソライザーに送信される大きなフォームがあります ( action="paymentautherizerURL" によって送信されます) が、DB にトランザクションを保存するときに、必要なすべての情報が返されません。

セッションに保存できるように、送信前にフォームデータをインターセプトする必要があります(PHP / jQueryを使用しています)、または必要な情報を取得する中間スクリプトレットに送信してから、 jQuery の $.post() を使用してデータを再構築し、オーソライザーに送信します。

2 番目のアプローチはうまくいかないようですが、少なくとも私の努力ではうまくいきません。$.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 つのページ (承認、拒否、エラー) のいずれかにリダイレクトし、そこから Web サイトが処理を行います。ただし、現在このページでスタックしているため、適切に送信されていないと思います。

私はあらゆる形の批判、アプローチ、アイデアを受け入れます。事前にどうもありがとうございました。他の情報が必要な場合はお知らせください。

4

5 に答える 5

3

onSubmit 属性を含むように form タグを変更するのはどうですか:

<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

セッションにデータを保存しないでください。トランザクション データを保存する場所としては不適切です。

ホストするスクリプトに投稿し、保持する必要があるものだけをデータベースに書き込み、その注文参照を生成します。

それから....

支払い処理業者 (Paypal など) を使用している場合

URL で注文参照を渡す 2 番目のスクリプトにリダイレクトします。2番目のスクリプトでは、支払い処理業者が必要とする詳細のみを含む非表示フィールドを持つフォームと、フォームを自動的に送信するためのJavaScriptと、「Paypalに接続しています...」などのユーザーへのメッセージを入力します。

マーチャントサービスを使用して支払いを承認している場合

ランディング スクリプトから出力を生成する前に、(例) curl を使用してオーソライザーに詳細を送信し、応答を解析し、注文に対する応答をデータベースに記録し、Web ページを介して顧客に適切なメッセージを出力します。

于 2011-06-03T08:56:41.857 に答える
0

セッションにデータを配置する必要はありません。すべての検証を行った検証関数と呼ばれるフォームの送信時に ajex を使用してデータを ur process.php に投稿すると、そのページに保持されます...

于 2011-06-03T05:56:47.657 に答える