Przeprowadziłem badania na ten temat, a niektórzy eksperci stwierdzili, że nie jest to możliwe , dlatego chciałbym poprosić o alternatywne rozwiązanie.
Moja sytuacja:
Strona A: [checkout.php] Klient wypełnia swoje dane rozliczeniowe.
Strona B: [process.php] Wygeneruj numer faktury i zapisz dane klienta w bazie danych.
Strona C: [Thirdparty.com] Trzecia bramka płatności (TYLKO AKCEPTUJEMY DANE POCZTOWE).
Klient wypełnia swoje dane i ustawia koszyk na stronie A, a następnie POST na stronie B. Wewnątrz process.php przechowuj dane POSTed w bazie danych i generuj numer faktury. Następnie WYŚLIJ dane klienta i numer faktury do bramki płatności thirdparty.com. Problem polega na wykonaniu testu POST na stronie B. cURL jest w stanie wysłać dane na stronę C, ale problem polega na tym, że strona nie przekierowała na stronę C. Klient musi wypełnić dane karty kredytowej na stronie C.
Brama płatności strony trzeciej dała nam próbkę API, próbka to POST numer faktury wraz ze szczegółami klienta. Nie chcemy, aby system generował nadmiar niechcianych numerów faktur.
Czy jest na to jakieś rozwiązanie? Nasze obecne rozwiązanie polega na tym, że klient wypełnia szczegóły na stronie A, a następnie na stronie B tworzymy kolejną stronę pokazującą wszystkie dane klienta, na której użytkownik może kliknąć przycisk POTWIERDŹ, aby przejść do strony C.
Naszym celem jest, aby klienci musieli kliknąć tylko raz.
Mam nadzieję, że moje pytanie jest jasne :)
Odpowiedzi:
Wygeneruj formularz na stronie B ze wszystkimi wymaganymi danymi i działaniami ustawionymi na stronę C i prześlij go za pomocą JavaScript przy ładowaniu strony. Twoje dane zostaną przesłane do strony C bez większych problemów dla użytkownika.
To jedyny sposób, aby to zrobić. Przekierowanie to nagłówek HTTP 303, który możesz przeczytać na http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , ale przytoczę niektóre z nich:
Jedynym sposobem na osiągnięcie tego, co robisz, jest strona pośrednia, która wysyła użytkownika do strony C. Oto krótki / prosty fragment, w jaki sposób możesz to osiągnąć:
Powinieneś także mieć prosty formularz „potwierdź” wewnątrz tagu noscript, aby mieć pewność, że użytkownicy bez Javascript będą mogli korzystać z Twojej usługi.
źródło
$a
i$b
za pomocąhtmlentities/htmlspecialchars
, zobacz stackoverflow.com/questions/6180072/php-forward-data-post/…<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
wewnątrz<form>
language
atrybut jest przestarzała, powinno być<script type="text/javascript">...</script>
źródło
$url
po prostu zastępuje zawartość istniejącej strony zawartością$url
strony. Co ważne , kod php na$url
stronie nie jest oceniany.redirect_post()
, po stronie serwera, kod php, wysyła żądanie do SERWERA dla$url
. Jeśli$url
jest to.php
strona, zauważam, że php nie jest analizowany - HTML jest zwracany z tagami php wciąż w nim zawartymi. Czy nie chodzi o wysyłanie danych POST do skryptu po stronie serwera?Mam inne rozwiązanie, które to umożliwia. Wymaga, aby klient uruchomił Javascript (co moim zdaniem jest obecnie słusznym wymogiem).
Wystarczy użyć żądania AJAX na stronie A, aby przejść do generowania numeru faktury i danych klienta w tle (poprzednia strona B), a następnie po pomyślnym zwróceniu żądania z poprawnymi informacjami - wystarczy wypełnić formularz na bramce płatności (Strona C).
W ten sposób użytkownik kliknie tylko jeden przycisk i przejdzie do bramki płatności. Poniżej znajduje się pseudokod
HTML:
JS (używając jQuery dla wygody, ale trywialny do stworzenia czystego Javascript):
źródło
$ _SESSION jest twoim przyjacielem, jeśli nie chcesz zadzierać z Javascriptem
Powiedzmy, że próbujesz przekazać wiadomość e-mail:
Na stronie A:
I na stronie B:
Aby zniszczyć sesję
źródło
Możesz pozwolić PHP wykonać test POST, ale wtedy twój php uzyska zwrot, z wszelkimi komplikacjami. Myślę, że najprościej byłoby pozwolić użytkownikowi wykonać test POST.
Więc, tak jak sugerowałeś, dostaniesz rzeczywiście tę część:
Dane do wypełnienia przez klienta na stronie A, a następnie na stronie B tworzymy kolejną stronę pokazującą wszystkie dane klienta, kliknij przycisk POTWIERDŹ, a następnie POST na stronie C.
Ale tak naprawdę możesz wykonać javascript na stronie B, więc nie ma potrzeby klikania. Zrób z niego stronę przekierowującą z animacją ładowania i gotowe.
źródło
Wiem, że to stare pytanie, ale mam jeszcze inne alternatywne rozwiązanie z jQuery:
Powyższy kod używa jQuery do utworzenia znacznika formularza, dodając ukryte pola jako pola post i przesyłając je w końcu. Strona zostanie przekazana do strony docelowej formularza z dołączonymi danymi POST.
ps JavaScript i jQuery są wymagane w tym przypadku. Jak sugerują komentarze do innych odpowiedzi, możesz użyć
<noscript>
znacznika, aby utworzyć standardowy formularz HTML na wypadek, gdyby JS został wyłączony.źródło
Istnieje prosty hack, użyj
$_SESSION
i utwórz jednąarray
z opublikowanych wartości, a kiedy przejdziesz do tej opcjiFile_C.php
, możesz jej użyć, a następnie przetworzyć, po czym ją zniszczyć.źródło
Wiem, że pytanie jest
php
zorientowane, alePOST
prawdopodobnie najlepszym sposobem na przekierowanie żądania jest.htaccess
:Wyjaśnienie:
Domyślnie, jeśli chcesz przekierować żądanie z danymi POST, przeglądarka przekierowuje je za pomocą GET za pomocą
302 redirect
. Spowoduje to także usunięcie wszystkich danych POST powiązanych z żądaniem . Przeglądarka robi to jako środek ostrożności, aby zapobiec niezamierzonemu ponownemu przesłaniu transakcji POST.Ale co jeśli chcesz przekierować żądanie POST z jego danymi? W HTTP 1.1 jest do tego kod stanu.Kod stanu
307
wskazuje, że żądanie należy powtórzyć przy użyciu tej samej metody HTTP i danych. Twoje żądanie POST zostanie powtórzone wraz z danymi, jeśli użyjesz tego kodu stanu.SRC
źródło
Napotkałem podobne problemy z żądaniem POST, w którym żądanie GET działało dobrze na moim backendie, który przekazuję moje zmienne itp. Problem polega na tym, że backend wykonuje wiele przekierowań, które nie działały z metodami fopen lub php.
Tak więc jedynym sposobem, w jaki działałem, było umieszczenie ukrytego formularza i przesuwanie wartości za pomocą przesyłania POST po załadowaniu strony.
źródło
Możesz użyć sesji do zapisania
$_POST
danych, a następnie pobrać te dane i ustawić je$_POST
na kolejne żądanie.Użytkownik przesyła żądanie do /dirty-submission-url.php
Wykonaj:
Następnie przeglądarka przekierowuje do
/clean-submission-url
serwera i wysyła żądania . Będziesz miał trochę wewnętrznego routingu, aby dowiedzieć się, co z tym zrobić.Na początku żądania wykonasz:
Teraz, poprzez resztę twojego żądania, możesz uzyskać dostęp
$_POST
tak, jak to możliwe przy pierwszym żądaniu.źródło
$_POST
dane na ciąg zapytania i w ten sposób przekazać je na kolejną stronę. Ale wtedy dane nie mogą być zbyt duże. I to prawdopodobnie nie działa, jeśli dotyczy to przesyłania plików, ale nie jestem pewien.Spróbuj tego:
Wyślij dane i poproś o nagłówek http na stronie B, aby przekierować do bramki
Dodatkowe nagłówki:
źródło
Oto inne podejście, które działa dla mnie:
jeśli musisz przekierować na inną stronę internetową (
user.php
) i zawiera zmienną PHP ($user[0]
):lub
źródło
Przykład:
źródło