2008-09-19 19 views
5

我正在處理鏈接到的PHP應用程序。爲了處理來自信用卡處理公司的「3D安全」請求,我需要將用戶轉發到其他網站,模仿已發佈的表單。我試圖使用cURL庫,但似乎遇到了問題。我的代碼如下:PHP :: Emulate <form method =「post」>,將用戶轉發到頁面

<?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表單,如果我可以避免它。

感謝您的幫助:-)

回答

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> 
0

我覺得你對捲曲有什麼困惑。它完全按照您的解釋進行操作,它的行爲類似於瀏覽器,並致電該網站並返回該帖子的內容。我不知道你可以實際重定向瀏覽器服務器端並代表一個帖子。我實際上會創建一個Javascript解決方案來做這樣的事情。

0

要將用戶重定向到PHP中的另一個頁面,您可以發送header("Location: http://example.com/newpage");。但是,不幸的是,由於程序重定向導致所有POST變量被刪除(出於安全原因)。如果你想讓用戶的瀏覽器發送一個POST請求到不同的URL,你將不得不創建一個自己提交的表單。 :(

0

我寧願使用像捲曲幕後的東西,因爲我不能保證我的用戶將啓用JS和顯示形式會導致一些其他的問題,我寧願避免的。這是我的B計劃雖然;-)

+0

由於需要轉發用戶,因此無法在「幕後」執行3D安全。我上面列出的解決方案是實現它的最佳方式,至少這是我們的付款提供商所認爲的。 – neu242 2008-09-19 19:46:57

0

您可以使用fsockopen()重定向到新的網站,同時保留您的POST變量。有一個關於如何完成here的好教程。

如果該網站被通過互聯網怪物吃掉,我複製和粘貼功能,但是我建議您查看原始網站上下文。

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; 
} 
0

啊,如果我誤解了cURL的功能,我想我會用JS自動提交來解決一個HTML表單。爲我創造了相當多的工作,但如果這是唯一的方法,我必須這樣做。

感謝您的幫助。

0

我認爲在這種情況下你需要使用一個表單。卡支付公司網站需要由用戶的瀏覽器訪問,而不是服務器端代碼。

是,3dsecure等,都相當討厭與整合,但他們確實提供了真正的安全性提升 - 使用它,因爲它的預期。

0

也許我失去了一些東西;它看起來像是試圖接收用戶的數據,通過cURL將其轉發到付款處理器,然後將用戶重定向到某個地方。對?

如果是這樣,你需要做的只是把這個在你的代碼的末尾:

標題(「位置:http://www.yoursite.com/yoururl」);

但是,爲了這個工作,腳本不能發送任何東西到客戶端,而它正在處理;這意味着腳本不應該在模板中間執行,而另一個gotcha則是在開始標記之前的文件開始處的空格。

如果您需要保存原始POST事務中的數據,請使用會話進行保存。

這應該適用於無JS的解決方案。

+0

我不能使用會話來存儲數據,因爲數據需要發送到另一個網站,並且用戶必須被顯示一個表單,輸入文本等。考慮到它,提示用戶進行的另一種形式是至少他們知道發生了什麼是最好的選擇。 – fistameeny 2008-09-19 22:10:45

0

我可能完全錯誤,但它聽起來像你正在嘗試做類似的代理模式。

我已經爲其他我曾經使用過的網站實施過類似的模式,但它確實需要一些修補措施才能正確使用。

我將RETURN_TRANSFER設置爲TRUE,以便您可以分析檢索到的響應並根據它進行應用程序級別的操作。

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

好運。

0

我發現上面的sendToHost()函數非常有用,但源代碼中有一個拼寫錯誤需要一些時間來調試:Content-type頭值包含'form-'和'urlencoded'之間的空格 - 應該'application/x-www-form-urlencoded'

相關問題