Saya melakukan riset tentang topik ini, dan ada beberapa ahli yang mengatakan bahwa itu tidak mungkin , jadi saya ingin meminta solusi alternatif.
Situasi saya:
Halaman A: [checkout.php] Pelanggan mengisi rincian tagihan mereka.
Halaman B: [process.php] Menghasilkan nomor faktur dan menyimpan detail pelanggan dalam database.
Halaman C: [thirdparty.com] Gateway Pembayaran Ketiga (HANYA MENERIMA DATA POST).
Pelanggan mengisi rincian mereka dan mengatur keranjang mereka di Halaman A, kemudian POST ke Halaman B. Di dalam process.php, simpan data POST di dalam basis data dan buat nomor faktur. Setelah itu, POSTkan data pelanggan dan nomor faktur ke gateway pembayaran thirdparty.com. Masalahnya adalah melakukan POST di halaman B. cURL dapat mengirim data ke Halaman C, tetapi masalahnya adalah halaman tidak dialihkan ke halaman C. Pelanggan harus mengisi rincian Kartu Kredit pada Halaman C.
Gateway pembayaran pihak ketiga memberi kami sampel API, sampel POST nomor faktur bersama dengan detail pelanggan. Kami tidak ingin sistem menghasilkan kelebihan jumlah faktur yang tidak diinginkan.
Apakah ada solusi untuk ini? Solusi kami saat ini adalah agar pelanggan mengisi detail di Halaman A, lalu di Halaman B kami membuat halaman lain yang menunjukkan semua detail pelanggan di sana, di mana pengguna dapat mengklik tombol CONFIRM untuk POST ke Halaman C.
Tujuan kami adalah agar pelanggan hanya perlu mengklik sekali.
Semoga pertanyaan saya jelas :)
Jawaban:
Buat formulir di Halaman B dengan semua data dan tindakan yang diperlukan diatur ke Halaman C dan kirimkan dengan JavaScript di pemuatan halaman. Data Anda akan dikirim ke Halaman C tanpa banyak kesulitan bagi pengguna.
Ini satu-satunya cara untuk melakukannya. Arahan ulang adalah tajuk HTTP 303 yang dapat Anda baca di http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , tetapi saya akan mengutip beberapa di antaranya:
Satu-satunya cara untuk mencapai apa yang Anda lakukan adalah dengan laman perantara yang mengirim pengguna ke Halaman C. Berikut cuplikan kecil / sederhana tentang cara Anda dapat mencapainya:
Anda juga harus memiliki formulir "konfirmasi" sederhana di dalam tag noscript untuk memastikan pengguna tanpa Javascript akan dapat menggunakan layanan Anda.
sumber
$a
dan$b
dengan menggunakanhtmlentities/htmlspecialchars
, lihat stackoverflow.com/questions/6180072/php-forward-data-post/…<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
di dalam<form>
language
atribut usang, harus<script type="text/javascript">...</script>
sumber
$url
Itu hanya mengganti konten halaman yang ada dengan konten$url
halaman. Yang penting , kode php di$url
halaman tidak dievaluasi.redirect_post()
, yang merupakan sisi server, kode php, mengirimkan permintaan ke SERVER untuk a$url
. Jika halaman$url
adalah.php
, saya perhatikan bahwa php tidak dievaluasi - html dikembalikan dengan tag php masih di dalamnya. Bukankah seluruh titik untuk mengirim data POST ke skrip sisi server?Saya punya solusi lain yang memungkinkan ini terjadi. Ini mengharuskan klien menjalankan Javascript (yang saya pikir merupakan persyaratan yang adil hari ini).
Cukup gunakan permintaan AJAX di Halaman A untuk membuka dan menghasilkan nomor faktur dan detail pelanggan Anda di latar belakang (Halaman B Anda sebelumnya), lalu setelah permintaan berhasil dikembalikan dengan informasi yang benar - cukup isi formulir pengiriman ke gateway pembayaran Anda (Halaman C).
Ini akan mencapai hasil Anda dari pengguna hanya mengklik satu tombol dan melanjutkan ke gateway pembayaran. Di bawah ini adalah beberapa kodesemu
HTML:
JS (menggunakan jQuery untuk kenyamanan tetapi sepele untuk membuat Javascript murni):
sumber
$ _SESSION adalah teman Anda jika Anda tidak ingin mengacaukan Javascript
Katakanlah Anda mencoba mengirim email:
Di halaman A:
Dan di Halaman B:
Untuk menghancurkan sesi
sumber
Anda dapat membiarkan PHP melakukan POST, tetapi kemudian php Anda akan mendapatkan pengembaliannya, dengan segala macam komplikasi. Saya pikir yang paling sederhana adalah membiarkan pengguna melakukan POST.
Jadi, seperti apa yang Anda sarankan, Anda akan mendapatkan bagian ini:
Pelanggan mengisi detail di Halaman A, lalu di Halaman B kami membuat halaman lain menunjukkan semua detail pelanggan di sana, klik tombol CONFIRM kemudian POST ke Halaman C.
Tetapi Anda benar-benar dapat melakukan pengiriman javascript di halaman B, jadi tidak perlu klik. Jadikan itu halaman "redirect" dengan animasi memuat, dan Anda sudah siap.
sumber
Saya tahu ini adalah pertanyaan lama, tapi saya punya solusi alternatif lain dengan jQuery:
Kode di atas menggunakan jQuery untuk membuat tag formulir, menambahkan bidang tersembunyi sebagai bidang posting, dan mengirimkannya pada akhirnya. Halaman akan meneruskan ke halaman target formulir dengan data POST terlampir.
ps JavaScript & jQuery diperlukan untuk kasus ini. Seperti yang disarankan oleh komentar dari jawaban lain, Anda dapat menggunakan
<noscript>
tag untuk membuat formulir HTML standar jika JS dinonaktifkan.sumber
Ada peretasan sederhana, gunakan
$_SESSION
dan buat salah satuarray
dari nilai yang diposting, dan sekali Anda pergi keFile_C.php
Anda dapat menggunakannya lalu lakukan proses setelah itu hancurkan.sumber
Saya menyadari bahwa pertanyaannya
php
berorientasi, tetapi cara terbaik untuk mengarahkan kembali suatuPOST
permintaan mungkin menggunakan.htaccess
, yaitu:Penjelasan:
Secara default, jika Anda ingin mengarahkan permintaan dengan data POST, browser mengalihkannya melalui GET dengan
302 redirect
. Ini juga menjatuhkan semua data POST yang terkait dengan permintaan . Browser melakukan ini sebagai tindakan pencegahan untuk mencegah pengiriman ulang transaksi POST yang tidak disengaja.Tetapi bagaimana jika Anda tetap ingin mengarahkan permintaan POST dengan datanya? Di HTTP 1.1, ada kode status untuk ini. Kode status
307
menunjukkan bahwa permintaan harus diulangi dengan metode dan data HTTP yang sama. Jadi permintaan POST Anda akan diulang bersama dengan datanya jika Anda menggunakan kode status ini.SRC
sumber
Saya menghadapi masalah serupa dengan Permintaan POST di mana Permintaan GET bekerja dengan baik pada backend saya yang saya lewati variabel saya dll. Masalahnya terletak di sana bahwa backend melakukan banyak pengalihan, yang tidak bekerja dengan metode fopen atau header php.
Jadi satu-satunya cara saya membuatnya bekerja adalah dengan meletakkan formulir tersembunyi dan mendorong nilai-nilai dengan mengirimkan POST ketika halaman dimuat.
sumber
Anda dapat menggunakan sesi untuk menyimpan
$_POST
data, lalu mengambil data itu dan mengaturnya$_POST
sesuai permintaan berikutnya.Pengguna mengirimkan permintaan ke /dirty-submission-url.php
Do:
Kemudian browser mengalihkan ke dan permintaan
/clean-submission-url
dari server Anda. Anda akan memiliki beberapa perutean internal untuk mencari tahu apa yang harus dilakukan dengan ini.Di awal permintaan, Anda akan melakukan:
Sekarang, melalui sisa permintaan Anda, Anda dapat mengakses
$_POST
sebanyak yang Anda bisa atas permintaan pertama.sumber
$_POST
data sebagai string kueri dan meneruskannya ke halaman berikutnya dengan cara itu. Tapi kemudian datanya tidak bisa terlalu besar. Dan ini mungkin tidak berfungsi jika unggahan file terlibat, tapi saya tidak yakin.Coba ini:
Kirim data dan permintaan dengan header http di halaman B untuk mengarahkan ulang ke Gateway
Tajuk Tambahan:
sumber
Di sini ada pendekatan lain yang berfungsi untuk saya:
jika Anda perlu mengarahkan ulang ke halaman web lain (
user.php
) dan menyertakan variabel PHP ($user[0]
):atau
sumber
Contoh:
sumber