PHP – Omleiden en gegevens verzenden via POST

Ik heb een online gateway waarvoor een HTML-formulier met verborgen velden moet worden ingediend. Ik moet dit doen via een PHP-script zonder HTML-formulieren (ik heb de gegevens voor de verborgen velden in een DB)

Om dit te doen, verzendt u gegevens via GET:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John');

En om dit te doen, verzendt u gegevens via POST?


Antwoord 1, autoriteit 100%

Je kunt dit niet doen met PHP.

Zoals anderen al hebben gezegd, zou je cURL kunnen gebruiken, maar dan wordt de PHP-code de client in plaats van de browser.

Als je POST moet gebruiken, dan is de enige manier om dit te doen het genereren van het ingevulde formulier met PHP en het gebruik van de window.onload hook om javascript aan te roepen om het formulier in te dienen.


Antwoord 2, autoriteit 83%

hier is het voorbeeld van een tijdelijke oplossing.

function redirect_post($url, array $data)
{
    ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script type="text/javascript">
            function closethisasap() {
                document.forms["redirectpost"].submit();
            }
        </script>
    </head>
    <body onload="closethisasap();">
    <form name="redirectpost" method="post" action="<? echo $url; ?>">
        <?php
        if ( !is_null($data) ) {
            foreach ($data as $k => $v) {
                echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> ';
            }
        }
        ?>
    </form>
    </body>
    </html>
    <?php
    exit;
}

Antwoord 3, autoriteit 22%

Een andere oplossing als u een curl-oproep wilt vermijden en de browser zoals normaal wilt omleiden en een POST-oproep wilt nabootsen:

bewaar het bericht en voer een tijdelijke omleiding uit:

function post_redirect($url) {
    $_SESSION['post_data'] = $_POST;
    header('Location: ' . $url);
}

Controleer dan altijd op de sessievariabele post_data:

if (isset($_SESSION['post_data'])) {
    $_POST = $_SESSION['post_data'];
    $_SERVER['REQUEST_METHOD'] = 'POST';
    unset($_SESSION['post_data']);
}

Er zullen enkele componenten ontbreken, zoals de apache_request_headers() zal geen POST Content-header tonen, enz.


Antwoord 4, autoriteit 20%

Een betere en nettere oplossing zou zijn om $_SESSION:

. te gebruiken

De sessie gebruiken:

$_SESSION['POST'] = $_POST;

en gebruik voor het verzoek voor de omleidingsheader:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)

307is de http_response_codedie u kunt gebruiken voor het omleidingsverzoek met ingediende POST-waarden.


Antwoord 5, autoriteit 15%

Het zou gaan om de cURL PHP-extensie.

$ch = curl_init('http://www.provider.com/process.jsp');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John");
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);  // RETURN THE CONTENTS OF THE CALL
$resp = curl_exec($ch);

Antwoord 6, autoriteit 11%

/**
 * 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");
    }
}

Antwoord 7, autoriteit 4%

Gebruik hiervoor curl. Google voor “curl php post” en je vindt dit: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html.

Houd er rekening mee dat je ook een array kunt gebruiken voor de CURLOPT_POSTFIELDS-optie. Van php.net-documenten:

De volledige gegevens die moeten worden gepost in een HTTP “POST”-bewerking. Om een ​​bestand te posten, zet u een bestandsnaam vóór @ en gebruikt u het volledige pad. Dit kan worden doorgegeven als een urlencoded string zoals ‘para1=val1&para2=val2&…’ of als een array met de veldnaam als sleutel en veldgegevens als waarde. Als waarde een array is, wordt de koptekst Content-Type ingesteld op multipart/form-data.


Antwoord 8, autoriteit 2%

Je hebt CURL nodig voor die taak, vrees ik. Leuke gemakkelijke manier om het hier te doen: http://davidwalsh.name/execute-http- post-php-curl

Hoop dat dat helpt


Antwoord 9, autoriteit 2%

Als alternatief kan het instellen van een sessievariabele vóór de omleiding en deze testen in de bestemmings-URL dit probleem voor mij oplossen.


Antwoord 10, autoriteit 2%

Je moet een socket openen naar de site met fsockopenen simuleer een HTTP-Post-Request.
Google laat je veel fragmenten zien hoe je het verzoek kunt simuleren.


Antwoord 11

Ik heb de volgende code gebruikt om POST-gegevens vast te leggen die zijn ingediend vanuit form.php en deze vervolgens samen te voegen tot een URL om deze TERUG naar het formulier te sturen voor validatiecorrecties. Werkt als een tierelier en zet POST-gegevens in feite om in GET-gegevens.

foreach($_POST as $key => $value) {
   $urlArray[] =  $key."=".$value;  
}
$urlString = implode("&", $urlArray);
echo "Please <a href='form.php?".$urlString."'>go back</a>";

Antwoord 12

Een oud bericht, maar hier is hoe ik het heb aangepakt. De methode van newms87 gebruiken:

if($action == "redemption")
{
    if($redemptionId != "")
    {
        $results = json_decode($rewards->redeemPoints($redemptionId));
        if($results->success == true)
        {
            $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete';
            // put results in session and redirect back to same page passing an action paraameter
            $_SESSION['post_data'] = json_encode($results);
            header("Location:" . $redirectLocation);
            exit();
        }
    }
}
elseif($action == "redemptionComplete")
{
    // if data is in session pull it and unset it.
    if(isset($_SESSION['post_data']))
    {
        $results = json_decode($_SESSION['post_data']);
        unset($_SESSION['post_data']);
    }
    // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page.
    else
    {
        $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml';
        header("Location:" . $redirectLocation);
    }
}

Antwoord 13

Ja, u kunt dit doen in PHP, b.v. in

Silex of Symfony3

subverzoek gebruiken

$postParams = array(
    'email' => $request->get('email'),
    'agree_terms' => $request->get('agree_terms'),
);
$subRequest = Request::create('/register', 'POST', $postParams);
return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);

Other episodes