PHP重定向POST數據


Answers

/**
 * Redirect with POST data.
 *
 * @param string $url URL.
 * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123)
 * @param array $headers Optional. Extra headers to send.
 */
public function redirect_post($url, array $data, array $headers = null) {
    $params = array(
        'http' => array(
            'method' => 'POST',
            'content' => http_build_query($data)
        )
    );
    if (!is_null($headers)) {
        $params['http']['header'] = '';
        foreach ($headers as $k => $v) {
            $params['http']['header'] .= "$k: $v\n";
        }
    }
    $ctx = stream_context_create($params);
    $fp = @fopen($url, 'rb', false, $ctx);
    if ($fp) {
        echo @stream_get_contents($fp);
        die();
    } else {
        // Error
        throw new Exception("Error loading '$url', $php_errormsg");
    }
}
Question

我對這個話題做了一些研究,並且有些專家說過這是possible ,所以我想問一個替代方案。

我的情況:

頁面A:[checkout.php]客戶填寫他們的賬單細節。

頁面B:[process.php]生成發票號碼並將客戶詳細信息存儲在數據庫中。

頁面C:[thirdparty.com]第三個支付網關(僅接受發布數據)。

客戶填寫他們的詳細信息並在頁面A中設置他們的購物車,然後發佈到頁面B.在process.php中,將發布的數據存儲在數據庫中並生成發票號碼。 之後,將客戶數據和發票號碼發佈到thirdparty.com支付網關。 問題是在頁面B中進行POST。cURL能夠將數據發佈到頁面C,但問題是頁面沒有重定向到頁面C.客戶需要在頁面C上填寫信用卡詳細信息。

第三方支付網關確實向我們提供了API示例,示例將發票編號與客戶詳細信息一起發布。 我們不希望系統產生多餘的不需要的發票號碼。

有沒有解決方案? 我們目前的解決方案是讓客戶在頁面A中填寫詳細信息,然後在頁面B中創建另一個頁面,其中顯示所有客戶詳細信息,用戶可以點擊確認按鈕發佈到頁面C.

我們的目標是客戶只需點擊一次。

希望我的問題是明確的:)




你可以讓PHP做POST,但是你的PHP會得到回報,帶來各種各樣的困難。 我認為最簡單的就是讓用戶去做POST。

所以,你所建議的,你會得到這個部分:

客戶在頁面A中填寫詳細信息,然後在頁面B中創建另一個頁面,其中顯示所有客戶詳細信息,點擊確認按鈕,然後發佈到頁面C.

但你實際上可以在頁面B上做一個javascript提交,所以不需要點擊。 使用加載動畫將其設為“重定向”頁面,然後進行設置。




我知道這是一個老問題,但我還有另一種jQuery替代解決方案:

var actionForm = $('<form>', {'action': 'nextpage.php', 'method': 'post'}).append($('<input>', {'name': 'action', 'value': 'delete', 'type': 'hidden'}), $('<input>', {'name': 'id', 'value': 'some_id', 'type': 'hidden'}));
actionForm.submit();

上面的代碼使用jQuery創建一個表單標籤,將隱藏的字段作為後置字段添加並最後提交。 該頁面將轉發到附帶POST數據的表單目標頁面。

ps JavaScript和jQuery是這種情況所必需的。 正如其他答案的評論所建議的那樣,如果JS被禁用,您可以使用<noscript>標籤創建標準的HTML表單。




function post(path, params, method) {
    method = method || "post"; // Set method to post by default if not specified.



    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}

例:

 post('url', {name: 'Johnny Bravo'});



Links



Tags

php php   post