Ich habe zu diesem Thema recherchiert, und es gibt einige Experten, die gesagt haben, dass dies nicht möglich ist. Deshalb möchte ich nach einer alternativen Lösung fragen.
Meine Situation:
Seite A: [checkout.php] Der Kunde gibt seine Rechnungsdetails ein.
Seite B: [process.php] Generieren Sie eine Rechnungsnummer und speichern Sie Kundendaten in der Datenbank.
Seite C: [Drittanbieter.com] Drittes Zahlungsgateway (NUR POSTDATEN AKZEPTIEREN).
Der Kunde gibt seine Daten ein und richtet seinen Warenkorb auf Seite A ein, dann POSTs auf Seite B. Speichern Sie in process.php die POST-Daten in der Datenbank und generieren Sie eine Rechnungsnummer. Danach POSTEN Sie die Kundendaten und die Rechnungsnummer an das Zahlungsgateway von Drittanbieter. Das Problem besteht darin, POST auf Seite B durchzuführen. CURL kann die Daten auf Seite C POSTEN, das Problem ist jedoch, dass die Seite nicht auf Seite C umgeleitet wurde. Der Kunde muss die Kreditkartendetails auf Seite C eingeben.
Das Zahlungsgateway eines Drittanbieters hat uns das API-Muster zur Verfügung gestellt. Das Muster ist POST der Rechnungsnummer zusammen mit den Kundendetails. Wir möchten nicht, dass das System einen Überschuss an unerwünschten Rechnungsnummern generiert.
Gibt es dafür eine Lösung? Unsere aktuelle Lösung besteht darin, dass der Kunde Details auf Seite A ausfüllt. Anschließend erstellen wir auf Seite B eine weitere Seite mit allen Kundendaten, auf der der Benutzer auf die Schaltfläche BESTÄTIGEN klicken kann, um auf Seite C zu POSTEN.
Unser Ziel ist es, dass Kunden nur einmal klicken müssen.
Hoffe meine Frage ist klar :)
Antworten:
Generieren Sie auf Seite B ein Formular mit allen erforderlichen Daten und Aktionen auf Seite C und senden Sie es beim Laden der Seite mit JavaScript. Ihre Daten werden ohne großen Aufwand an den Benutzer an Seite C gesendet.
Dies ist der einzige Weg, dies zu tun. Eine Weiterleitung ist ein 303-HTTP-Header, den Sie unter http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html nachlesen können , aber ich werde einige davon zitieren:
Der einzige Weg, um das zu erreichen, was Sie tun, ist eine Zwischenseite, die den Benutzer zu Seite C sendet. Hier ist ein kleiner / einfacher Ausschnitt, wie Sie dies erreichen können:
Sie sollten auch ein einfaches Bestätigungsformular in einem Noscript-Tag haben, um sicherzustellen, dass Benutzer ohne Javascript Ihren Dienst nutzen können.
quelle
$a
und$b
durch die Verwendunghtmlentities/htmlspecialchars
finden stackoverflow.com/questions/6180072/php-forward-data-post/...<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
innerhalb der<form>
language
Attribut ist veraltet, es sollte sein<script type="text/javascript">...</script>
quelle
$url
stelle ich fest, dass es nicht zur bereitgestellten umleitet - Es ersetzt nur den Inhalt der vorhandenen Seite durch den Inhalt der$url
Seite. Wichtig ist , dass der PHP-Code auf der$url
Seite nicht ausgewertet wird.redirect_post()
Der serverseitige PHP-Code sendet eine Anfrage an den SERVER für a$url
. Wenn das$url
eine.php
Seite ist, stelle ich fest, dass das PHP nicht ausgewertet wird - HTML wird mit PHP-Tags zurückgegeben, die noch darin sind. Ist es nicht der springende Punkt, POST-Daten an ein serverseitiges Skript zu senden?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 (Ihre vorherige Seite B) zu generieren. Sobald die Anfrage erfolgreich mit den richtigen Informationen zurückgesandt wurde, füllen Sie einfach das Formular aus, das Sie an Ihr Zahlungsgateway senden (Seite C).
Dadurch wird Ihr Ergebnis erzielt, wenn der Benutzer nur auf eine Schaltfläche klickt und zum Zahlungsgateway fährt. Unten ist ein Pseudocode
HTML:
JS (mit jQuery aus Bequemlichkeitsgründen, aber trivial, um reines Javascript zu erstellen):
quelle
$ _SESSION ist dein Freund, wenn du dich nicht mit Javascript anlegen willst
Angenommen, Sie versuchen, eine E-Mail zu senden:
Auf Seite A:
Und auf Seite B:
Um die Sitzung zu zerstören
quelle
Sie können PHP einen POST machen lassen, aber dann wird Ihr PHP die Rückgabe mit allen möglichen Komplikationen erhalten. Ich denke, das Einfachste wäre, den Benutzer tatsächlich den POST machen zu lassen.
So wie Sie es vorgeschlagen haben, erhalten Sie tatsächlich diesen Teil:
Kunden füllen Details auf Seite A aus, dann erstellen wir auf Seite B eine weitere Seite, auf der alle Kundendetails angezeigt werden. Klicken Sie auf die Schaltfläche BESTÄTIGEN und dann auf Seite C POSTEN.
Sie können jedoch tatsächlich eine Javascript-Übermittlung auf Seite B durchführen, sodass kein Klick erforderlich ist. Machen Sie es zu einer "Umleitungs" -Seite mit einer Ladeanimation, und schon sind Sie fertig.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich habe noch eine andere alternative Lösung mit jQuery:
Der obige Code verwendet jQuery, um ein Formular-Tag zu erstellen, versteckte Felder als Post-Felder anzuhängen und es schließlich zu senden. Die Seite wird mit den angehängten POST-Daten an die Formularzielseite weitergeleitet.
ps Für diesen Fall sind JavaScript und jQuery erforderlich. Wie aus den Kommentaren der anderen Antworten hervorgeht, können Sie mithilfe des
<noscript>
Tags ein Standard-HTML-Formular erstellen, falls JS deaktiviert ist.quelle
Es gibt einen einfachen Hack, verwenden
$_SESSION
und erstellen Sie einenarray
der veröffentlichten Werte, und sobald Sie zu dem gehen,File_C.php
können Sie ihn verwenden, dann verarbeiten Sie ihn danach und zerstören ihn.quelle
Ich bin mir bewusst, dass die Frage
php
orientiert ist, aber der beste Weg, einePOST
Anfrage umzuleiten, ist wahrscheinlich die Verwendung von.htaccess
:Erläuterung:
Wenn Sie eine Anforderung mit POST-Daten umleiten möchten, leitet der Browser diese standardmäßig über GET mit um
302 redirect
. Dadurch werden auch alle mit der Anforderung verknüpften POST-Daten gelöscht . Der Browser tut dies als Vorsichtsmaßnahme, um ein unbeabsichtigtes erneutes Senden der POST-Transaktion zu verhindern.Aber was ist, wenn Sie die POST-Anfrage trotzdem mit ihren Daten umleiten möchten? In HTTP 1.1 gibt es hierfür einen Statuscode. Der Statuscode
307
gibt an, dass die Anforderung mit derselben HTTP-Methode und denselben Daten wiederholt werden soll . Wenn Sie diesen Statuscode verwenden, wird Ihre POST-Anfrage zusammen mit den Daten wiederholt.SRC
quelle
Ich hatte ähnliche Probleme mit POST Request, bei denen GET Request auf meinem Backend einwandfrei funktionierte, wobei ich meine Variablen usw. übergebe. Das Problem besteht darin, dass das Backend viele Weiterleitungen ausführt, die mit fopen oder den PHP-Header-Methoden nicht funktionierten.
Die einzige Möglichkeit, es zum Laufen zu bringen, bestand darin, ein verstecktes Formular einzufügen und die Werte mit einem POST-Submit zu verschieben, wenn die Seite geladen wird.
quelle
Sie können Sitzungen verwenden, um
$_POST
Daten zu speichern, diese Daten dann abzurufen und$_POST
bei der nachfolgenden Anforderung festzulegen.Benutzer überfordern zu /dirty-submission-url.php
Do:
Anschließend leitet der Browser zu
/clean-submission-url
Ihrem Server weiter und fordert ihn an. Sie haben ein internes Routing, um herauszufinden, was Sie damit tun sollen.Zu Beginn der Anfrage werden Sie Folgendes tun:
Jetzt können Sie über den Rest Ihrer Anfrage
$_POST
wie bei der ersten Anfrage darauf zugreifen .quelle
$_POST
Daten zu einer Abfragezeichenfolge verarbeiten und auf diese Weise an die nachfolgende Seite übergeben. Aber dann können die Daten nicht zu groß sein. Und das funktioniert wahrscheinlich nicht, wenn Dateien hochgeladen werden, aber ich bin mir nicht sicher.Versuche dies:
Senden Sie Daten und fordern Sie mit dem http-Header auf Seite B an, zum Gateway umzuleiten
Zusätzliche Überschriften:
quelle
Hier gibt es einen anderen Ansatz, der für mich funktioniert:
Wenn Sie zu einer anderen Webseite umleiten müssen (
user.php
) und eine PHP-Variable ($user[0]
) enthält:oder
quelle
Beispiel:
quelle