PHP Redirect mit POST-Daten

Lesezeit: 9 Minuten

PHP Redirect mit POST Daten
Schiro

Ich habe einige Nachforschungen zu diesem Thema angestellt, und es gibt einige Experten, die gesagt haben, dass dies nicht möglich ist, daher möchte ich nach einer alternativen Lösung fragen.

Meine Situation:

Seite A: [checkout.php] Der Kunde gibt seine Rechnungsdaten ein.

Seite B: [process.php] Generieren Sie eine Rechnungsnummer und speichern Sie Kundendaten in der Datenbank.

Seite C: [thirdparty.com] Drittes Zahlungsgateway (NUR POST-DATEN AKZEPTIEREN).

Der Kunde gibt seine Daten ein und richtet seinen Warenkorb auf Seite A ein, dann POST auf Seite B. Speichern Sie in process.php die POST-Daten in der Datenbank und generieren Sie eine Rechnungsnummer. Senden Sie danach die Kundendaten und die Rechnungsnummer an das Zahlungsgateway von Thirdparty.com. Das Problem ist POST auf Seite B. cURL kann die Daten auf Seite C POSTen, aber das Problem ist, dass die Seite nicht auf Seite C umgeleitet wurde. Der Kunde muss Kreditkartendaten auf Seite C eingeben.

Das Drittanbieter-Zahlungsgateway hat uns das API-Muster gegeben, das Muster ist POST die Rechnungsnummer zusammen mit den Kundendetails. Wir möchten nicht, dass das System zu viele unerwünschte Rechnungsnummern generiert.

Gibt es dafür eine Lösung? Unsere aktuelle Lösung besteht darin, dass der Kunde Details auf Seite A ausfüllt, dann erstellen wir auf Seite B eine weitere Seite, die dort alle Kundendetails zeigt, wo der Benutzer auf eine BESTÄTIGEN-Schaltfläche klicken kann, um auf Seite C zu POSTEN.

Unser Ziel ist es, dass Kunden nur einmal klicken müssen.

Hoffe meine Frage ist klar 🙂

  • Ich glaube nicht, dass dies doppelt ist, weil mein Ziel innerhalb einer PHP-Seite ist, die POST-Daten weitergibt und sie umleitet. cURL Ich glaube nicht, dass es möglich ist, dies zu tun. Suchen Sie einfach nach Experten, die eine Alternative dafür haben

    – Schiro

    7. April 2011 um 9:40 Uhr


  • ʜᴛᴛᴘ 308 Umleitungscode ?

    – Benutzer2284570

    22. Februar 2019 um 11:05 Uhr

1646886849 587 PHP Redirect mit POST Daten
Peter

Generieren Sie ein Formular auf Seite B mit allen erforderlichen Daten und Aktionen auf Seite C und senden Sie es mit JavaScript beim Laden der Seite. Ihre Daten werden ohne großen Aufwand für den Benutzer an Seite C gesendet.

Dies ist der einzige Weg, dies zu tun. Eine Weiterleitung ist ein 303-HTTP-Header, den Sie nachlesen können http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlaber ich werde einige davon zitieren:

Die Antwort auf die Anfrage kann unter einem anderen URI gefunden werden und SOLLTE mit einer GET-Methode für diese Ressource abgerufen werden. Diese Methode dient hauptsächlich dazu, die Ausgabe eines POST-aktivierten Skripts zu ermöglichen, um den Benutzeragenten zu einer ausgewählten Ressource umzuleiten. Der neue URI ist kein Ersatzverweis für die ursprünglich angeforderte Ressource. Die 303-Antwort DARF NICHT zwischengespeichert werden, aber die Antwort auf die zweite (umgeleitete) Anfrage kann zwischengespeichert werden.

Die einzige Möglichkeit, das zu erreichen, was Sie tun, ist eine Zwischenseite, die den Benutzer zu Seite C weiterleitet. Hier ist ein kleiner/einfacher Ausschnitt, wie Sie das erreichen können:

<form id="myForm" action="Page_C.php" method="post">
<?php
    foreach ($_POST as $a => $b) {
        echo '<input type="hidden" name="'.htmlentities($a).'" value="'.htmlentities($b).'">';
    }
?>
</form>
<script type="text/javascript">
    document.getElementById('myForm').submit();
</script>

Sie sollten auch ein einfaches “Bestätigungs”-Formular in einem Noscript-Tag haben, um sicherzustellen, dass Benutzer ohne Javascript Ihren Dienst nutzen können.

  • Mein Ziel ist in Seite A -> Seite C, Seite B soll der Controller (Geschäftslogik) die Rechnungsnummer generieren. Aus Systemsicht ist Seite A-> Seite B-> Seite C, aber aus Benutzersicht sollte Seite A-> Seite B sein, sie sollten niemals Seite B freigeben.

    – Schiro

    7. April 2011 um 9:42 Uhr

  • @Peeter: intelligenter Vorschlag +1. Das einzige Problem ist, dass, wenn der Benutzer auf Seite C die Zurück-Taste drückt, erneut zu Seite C gesendet wird. Außerdem haben Sie vergessen, die zu codieren $a und $b durch die Nutzung htmlentities/htmlspecialcharssiehe stackoverflow.com/questions/6180072/php-forward-data-post/…

    – Marco Demaio

    16. Oktober 2011 um 14:44 Uhr

  • Frage hier ist, was ist, wenn Javascript auf dem Client deaktiviert ist? Seite B leitet dann nicht auf Seite C weiter, oder?

    – Imran Omar Bukhsh

    9. Dezember 2011 um 13:00 Uhr

  • <noscript><input type="submit" value="Click here if you are not redirected."/></noscript> innerhalb der <form>

    – Nichtigkeit

    27. März 2013 um 17:49 Uhr

  • der language Das Attribut ist veraltet, das sollte es sein <script type="text/javascript">...</script>

    – Alex W

    27. August 2013 um 21:17 Uhr

1646886849 116 PHP Redirect mit POST Daten
Eduardo Cuomo

/**
  * Redirect with POST data.
  *
  * @param string $url URL.
  * @param array $post_data POST data. Example: ['foo' => 'var', 'id' => 123]
  * @param array $headers Optional. Extra headers to send.
  */
public function redirect_post($url, array $data, array $headers = null) {
  $params = [
    'http' => [
      '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");
  }
}

  • Während dies zunächst auch besser aussieht als die akzeptierte Antwort, stelle ich fest, dass es nicht auf die bereitgestellte umleitet $url–Es ersetzt einfach den Inhalt der vorhandenen Seite durch den Inhalt der $url Seite. WichtigPHP-Code in der $url Seite wird nicht ausgewertet.

    – iPadEntwickler2011

    17. Oktober 2013 um 4:25 Uhr


  • @iPadDeveloper2011, in der URL haben Sie keinen PHP-Code! Der PHP-Code wird im SERVER ausgeführt, nicht im Client.

    – Eduardo Cuomo

    17. Oktober 2013 um 19:07 Uhr


  • redirect_post()das ist serverseitiger PHP-Code, sendet eine Anfrage an den SERVER für a $url. Wenn die $url ist ein .php Seite, stelle ich fest, dass das PHP nicht ausgewertet wird – HTML wird mit noch darin enthaltenen PHP-Tags zurückgegeben. Ist es nicht der springende Punkt, POST-Daten an ein serverseitiges Skript zu senden?

    – iPadEntwickler2011

    18. Oktober 2013 um 1:46 Uhr

  • @EduardoCuomo Diese Methode funktioniert nur mit absoluten URLs, da fopen() funktioniert: php.net/manual/en/function.fopen.php Es ist immer noch eine ziemlich raffinierte Antwort.

    – Omen

    23. Oktober 2013 um 23:03 Uhr

  • @omn du hast recht! “Das funktioniert nicht mit relativer URL?” ist keine Frage, ist eine Aussage. Sorry für die Verwirrung

    – Eduardo Cuomo

    2. Dezember 2013 um 17:42 Uhr

PHP Redirect mit POST Daten
Robert Sinclair

$_SESSION ist Ihr Freund, wenn Sie sich nicht mit Javascript anlegen wollen

Angenommen, Sie versuchen, eine E-Mail weiterzuleiten:

Auf Seite A:

// Start the session
session_start();

// Set session variables
$_SESSION["email"] = "[email protected]";

header('Location: page_b.php');

Und auf Seite B:

// Start the session
session_start();

// Show me the session!  
echo "<pre>";
print_r($_SESSION);
echo "</pre>";

Um die Sitzung zu zerstören

unset($_SESSION['email']);
session_destroy();

  • Warum halten Sie dies für weniger sicher als die Javascript-Version?

    – Adam Baranyai

    9. November 2017 um 12:54 Uhr

  • Nein, ich meine nicht im Vergleich zu Javascript. Im Allgemeinen kann $_SESSION allein etwas weniger sicher sein als beispielsweise $_SESSION + Cookie, obwohl $_SESSION an sich ziemlich sicher ist. Mehr Infos hier: stackoverflow.com/questions/17413480/session-spoofing-php

    – Robert Sinclair

    9. November 2017 um 16:54 Uhr

  • und wie schließe ich die Sitzung?

    – Sayed Muhammed Idrees

    16. Oktober 2019 um 20:15 Uhr

  • Dies ist keine gültige Option, da Page_C auf der der Benutzer Informationen posten möchte, ist eine externe Seite und $_SESSION stünden dafür nicht zur Verfügung.

    – Dawson Irvine

    16. Januar 2021 um 20:11 Uhr

  • @Robert Sinclair vielen Dank für Ihre umfassende Antwort. Es ist wirklich sehr hilfreich.

    – Muhammad Khan

    1. Mai 2021 um 12:50 Uhr

Ich habe eine andere Lösung, die dies ermöglicht. Es erfordert, dass der Client Javascript ausführt (was meiner Meinung nach heutzutage eine faire Anforderung ist).

Verwenden Sie einfach eine AJAX-Anfrage auf Seite A, um Ihre Rechnungsnummer und Kundendaten im Hintergrund zu generieren (Ihre vorherige Seite B), und sobald die Anfrage erfolgreich mit den richtigen Informationen zurückgesendet wurde, füllen Sie einfach die Formularübermittlung an Ihr Zahlungsgateway aus (Seite C).

Dadurch wird erreicht, dass der Benutzer nur auf eine Schaltfläche klickt und zum Zahlungsgateway weitergeht. Unten ist etwas Pseudocode

HTML:

<form id="paymentForm" method="post" action="https://example.com">
  <input type="hidden" id="customInvoiceId" .... />
  <input type="hidden" .... />

  <input type="submit" id="submitButton" />
</form>

JS (mit jQuery zur Bequemlichkeit, aber trivial, um reines Javascript zu erstellen):

$('#submitButton').click(function(e) {
  e.preventDefault(); //This will prevent form from submitting

  //Do some stuff like build a list of things being purchased and customer details

  $.getJSON('setupOrder.php', {listOfProducts: products, customerDetails: details }, function(data) {
  if (!data.error) {
    $('#paymentForm #customInvoiceID').val(data.id);
    $('#paymentForm').submit();   //Send client to the payment processor
  }
});

Ich weiß, dass dies eine alte Frage ist, aber ich habe noch eine andere alternative Lösung mit 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();

Der obige Code verwendet jQuery, um ein Formular-Tag zu erstellen, versteckte Felder als Post-Felder anzuhängen und es schließlich zu übermitteln. Die Seite wird mit den angehängten POST-Daten zur Zielseite des Formulars weitergeleitet.

ps JavaScript & jQuery sind für diesen Fall erforderlich. Wie aus den Kommentaren der anderen Antworten hervorgeht, können Sie davon Gebrauch machen <noscript> -Tag, um ein Standard-HTML-Formular zu erstellen, falls JS deaktiviert ist.

Ich bin mir bewusst, die Frage ist php orientiert, aber der beste Weg, um a POST Anfrage verwendet wahrscheinlich .htaccessdh:

RewriteEngine on
RewriteCond %{REQUEST_URI} string_to_match_in_url
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ https://domain.tld/$1 [L,R=307]

Erläuterung:

Wenn Sie eine Anfrage mit POST-Daten umleiten möchten, leitet der Browser sie standardmäßig über GET mit um 302 redirect. Dadurch werden auch alle mit der Anfrage verbundenen POST-Daten gelöscht. Der Browser tut dies als Vorsichtsmaßnahme, um eine unbeabsichtigte erneute Übermittlung der POST-Transaktion zu verhindern.

Aber was ist, wenn Sie die POST-Anfrage mit ihren Daten trotzdem umleiten möchten? In HTTP 1.1 gibt es dafür einen Statuscode. Statuscode 307 gibt an, dass die Anfrage wiederholt werden soll mit der gleichen HTTP-Methode und den gleichen Daten. Daher wird Ihre POST-Anforderung zusammen mit ihren Daten wiederholt, wenn Sie diesen Statuscode verwenden.

SRC

1646886850 102 PHP Redirect mit POST Daten
Nanne

Sie können PHP einen POST durchführen lassen, aber dann wird Ihr PHP die Rückgabe erhalten, mit allen möglichen Komplikationen. Ich denke, das einfachste wäre, den Benutzer den POST tatsächlich machen zu lassen.

Also, so wie Sie es vorgeschlagen haben, erhalten Sie tatsächlich diesen Teil:

Kundendetails auf Seite A ausfüllen, dann erstellen wir auf Seite B eine weitere Seite, die dort alle Kundendetails zeigt, auf eine BESTÄTIGEN-Schaltfläche klicken und dann auf Seite C POSTEN.

Aber Sie können tatsächlich eine Javascript-Übermittlung auf Seite B durchführen, sodass kein Klick erforderlich ist. Machen Sie daraus eine “umleitende” Seite mit einer Ladeanimation, und schon sind Sie fertig.

  • Das machen wir jetzt. Ich denke, gibt es eine bessere PHP-Logik, um es zu lösen. Danke. 😉

    – Schiro

    7. April 2011 um 9:44 Uhr

  • Ja, mehr in Richtung HTTP, aber ich arbeite in einer PHP-Umgebung, also denke ich, dass beides Tag ist. Danke! Oberst Schrapnell.

    – Schiro

    8. April 2011 um 0:58 Uhr

986180cookie-checkPHP Redirect mit POST-Daten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy