PHP ::<form method=”post”> をエミュレートし、ユーザーをページに転送します

StackOverflow https://stackoverflow.com/questions/104872

  •  01-07-2019
  •  | 
  •  

質問

私は取り組んでいます PHP にリンクするアプリケーション Protx VSP Direct payment gateway. 。クレジット カード処理会社からの「3D セキュア」リクエストを処理するには、投稿されたフォームを模倣して、ユーザーを別の Web サイトに転送する必要があります。を使用しようとしています cURL ライブラリを作成しましたが、問題が発生したようです。私のコードは次のとおりです。

<?php  
$ch = curl_init();  
// Set the URL  
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/');  
// Perform a POST  
curl_setopt($ch, CURLOPT_POST, 1);  
// If not set, curl prints output to the browser  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);   
// Set the "form fields"  
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);  
$output = curl_exec($ch);  
curl_close($ch);  
?>  

これは、渡された URL のコンテンツを取得するだけであり、ユーザーをどこにも転送しません。グーグルで調べたり、できる限り読んでみたりしましたが、何が足りないのかわかりません。何か案は?できれば自動送信される HTML フォームを作成する必要はありません。

助けてくれてありがとう:-)

役に立ちましたか?

解決

3D セキュア API では、バックグラウンドでリクエストを実行することはできません。ユーザーを 3D セキュア サイトに転送する必要があります。JavaScript を使用してフォームを自動的に送信します。私たちのプロバイダーが提案するのは次のとおりです。

<html> 
    <head> 
        <title>Processing your request...</title> 
    </head> 
    <body OnLoad="OnLoadEvent();"> 
        <form name="downloadForm" action="<%=RedirURL%>" method="POST"> 
            <noscript> 
                <br> 
                <br> 
                <div align="center"> 
                    <h1>Processing your 3-D Secure Transaction</h1> 
                    <h2>JavaScript is currently disabled or is not supported by your browser.</h2><BR> 
                    <h3>Please click Submit to continue the processing of your 3-D Secure transaction.</h3><BR> 
                    <input type="submit" value="Submit"> 
                </div> 
            </noscript> 
            <input type="hidden" name="PaReq" value="<%=PAREQ%>"> 
            <input type="hidden" name="MD" value="<%=TransactionID%>"> 
            <input type="hidden" name="TermUrl" value="<%=TermUrl%>"> 
        </form> 
        <SCRIPT LANGUAGE="Javascript"> 
            <!-- 
            function OnLoadEvent() { 
                document.downloadForm.submit(); 
            } 
            //--> 
        </SCRIPT> 
    </body> 
</html>

他のヒント

あなたはcurlが何をするのか少し混乱していると思います。これはあなたが説明したことを正確に実行し、ブラウザのように動作し、サイトを呼び出し、その投稿のコンテンツを返します。実際にブラウザのサーバー側をリダイレクトして投稿を表す方法はわかりません。実際にそのようなことを行うための JavaScript ソリューションを作成します。

ユーザーを PHP の別のページにリダイレクトするには、 header("Location: http://example.com/newpage");. 。ただし、残念なことに、プログラムのリダイレクトにより、すべての POST 変数が削除されます (セキュリティ上の理由から)。ユーザーのブラウザに別の URL に POST リクエストを送信させたい場合は、それ自体を送信するフォームを作成する必要があります。:(

ユーザーが JS を有効にしているかどうかは保証できず、フォームを表示すると避けたい他の問題が発生するため、cURL のようなバックグラウンドでの使用を希望します。それは私のプラン B ですが ;-)

fsockopen() を使用すると、POST 変数を保持したまま新しい Web サイトにリダイレクトできます。これを達成する方法については良いチュートリアルがあります ここ.

Web サイトがインターネット モンスターに食い荒らされた場合に備えて、関数をコピーして貼り付けましたが、元の Web サイトでコンテキストを確認することをお勧めします。

function sendToHost($host,$method,$path,$data,$useragent=0)
{
    // Supply a default method of GET if the one passed was empty
    if (empty($method)) {
        $method = 'GET';
    }
    $method = strtoupper($method);
    $fp = fsockopen($host, 80);
    if ($method == 'GET') {
        $path .= '?' . $data;
    }
    fputs($fp, "$method $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp,"Content-type: application/x-www-form- urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    if ($useragent) {
        fputs($fp, "User-Agent: MSIE\r\n");
    }
    fputs($fp, "Connection: close\r\n\r\n");
    if ($method == 'POST') {
        fputs($fp, $data);
    }

    while (!feof($fp)) {
        $buf .= fgets($fp,128);
    }
    fclose($fp);
    return $buf;
}

ああ、cURL の機能を誤解しているのであれば、JS 自動送信機能を備えた HTML フォームで解決すると思います。かなりの作業が増えますが、それが唯一の方法である場合は、そうするしかありません。

皆さん助けてくれてありがとう。

この場合はフォームを使用する必要があると思います。カード決済会社の Web サイトには、サーバー側のコードではなく、ユーザーのブラウザからアクセスする必要があります。

はい、3dsecure などは統合するのが非常に面倒ですが、実際のセキュリティを強化します。意図したとおりに使用してください。

もしかしたら私には何かが欠けているのかもしれません。ユーザーのデータを受信し、それを cURL 経由で決済プロセッサに転送し、ユーザーをどこかにリダイレクトしようとしているようです。右?

その場合は、これをコードの最後に追加するだけです。

header("場所: http://www.yoursite.com/yoururl");

ただし、これが機能するには、スクリプトの処理中にクライアントに何も送信することはできません。これは、スクリプトをテンプレートの途中で実行すべきではないことを意味します。また、もう 1 つの問題は、ファイルの先頭の開始タグの前にある空白です。

元の POST トランザクションのデータを保存する必要がある場合は、セッションを使用してデータを保存します。

これは JS フリーのソリューションで機能するはずです。

私は完全に間違っているかもしれませんが、プロキシパターンと似たようなことをしようとしているように思えます。

私はこれまでに作業した他のサイトにも同様のパターンを実装しましたが、正しくするためには少し工夫が必要です。

RETURN_TRANSFER を TRUE に設定すると、取得した応答を分析し、それに応じてアプリケーション レベルのアクションを実行できるようになります。

http://en.wikipedia.org/wiki/Proxy_pattern

幸運を。

上記の sendToHost() 関数は非常に便利だと思いましたが、ソースにタイプミスがあり、デバッグに時間がかかりました。Content-type ヘッダー値には「form-」と「urlencoded」の間にスペースが含まれています。「application/x-www-form-urlencoded」である必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top