5

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フォームを作成する必要はありません。

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

4

10 に答える 10

2

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>
于 2008-09-19T19:40:25.140 に答える
0

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

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

于 2008-09-19T20:07:20.740 に答える
0

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

于 2008-09-19T19:42:32.360 に答える
0

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

于 2008-09-19T19:42:33.030 に答える
0

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

私が使用した他のサイトにも同様のパターンを実装しましたが、正しく機能させるには少し手を加える必要があります。

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

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

幸運を。

于 2008-09-19T23:06:11.013 に答える
0

多分私は何かが欠けています。ユーザーのデータを受信し、cURL 経由で支払い処理業者に転送し、ユーザーをどこかにリダイレクトしようとしているようです。右?

もしそうなら、あなたがする必要があるのは、これをコードの最後に置くだけです:

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

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

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

これは、JS を使用しないソリューションで機能するはずです。

于 2008-09-19T21:50:49.243 に答える
0

ユーザーがJSを有効にすることを保証できないため、cURLのような舞台裏で何かを使用したいと思います。また、フォームを表示すると、回避したい他の問題が発生します。それは私のプランBですが;-)

于 2008-09-19T19:43:42.043 に答える
0

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;
}
于 2008-09-19T19:45:38.920 に答える
0

ああ、cURL の機能を誤解している場合は、JS の自動送信機能を備えた HTML フォームに落ち着くと思います。かなり多くの作業が発生しますが、それが唯一の方法である場合は、それを実行する必要があります.

助けてくれてありがとう。

于 2008-09-19T19:45:49.700 に答える
0

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

于 2009-05-28T18:02:47.310 に答える