J'ai fait des recherches sur ce sujet, et certains experts ont dit que ce n'était pas possible , alors je voudrais demander une solution alternative.
Ma situation:
Page A: [checkout.php] Le client remplit ses informations de facturation.
Page B: [process.php] Générez un numéro de facture et stockez les détails du client dans la base de données.
Page C: [thirdparty.com] Troisième passerelle de paiement (ACCEPTER UNIQUEMENT LES DONNÉES DE POST).
Le client remplit ses coordonnées et configure son panier dans la page A, puis les POST dans la page B. Dans process.php, stockez les données POST dans la base de données et générez un numéro de facture. Après cela, POSTEZ les données client et le numéro de facture sur la passerelle de paiement thirdparty.com. Le problème est en train de POST sur la page B. cURL est capable de POSTER les données sur la page C, mais le problème est que la page n'a pas été redirigée vers la page C. Le client doit remplir les détails de la carte de crédit sur la page C.
La passerelle de paiement tiers nous a donné l'échantillon API, l'échantillon est POST le numéro de facture avec les détails du client. Nous ne voulons pas que le système génère un excès de numéros de factures indésirables.
Existe-t-il une solution à ça? Notre solution actuelle est que le client remplisse les détails dans la page A, puis dans la page B, nous créons une autre page affichant tous les détails du client là-bas, où l'utilisateur peut cliquer sur un bouton CONFIRMER pour POSTER sur la page C.
Notre objectif est que les clients n'aient à cliquer qu'une seule fois.
J'espère que ma question est claire :)
Réponses:
Générez un formulaire sur la page B avec toutes les données et actions requises définies sur la page C et soumettez-le avec JavaScript au chargement de la page. Vos données seront envoyées à la page C sans trop de soucis pour l'utilisateur.
C'est la seule façon de le faire. Une redirection est un en-tête HTTP 303 que vous pouvez lire sur http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , mais je vais en citer une partie:
La seule façon d'atteindre ce que vous faites est d'utiliser une page intermédiaire qui envoie l'utilisateur à la page C.
Vous devriez également avoir un simple formulaire de «confirmation» à l'intérieur d'une balise noscript pour vous assurer que les utilisateurs sans Javascript pourront utiliser votre service.
la source
$a
et$b
en utilisanthtmlentities/htmlspecialchars
, voir stackoverflow.com/questions/6180072/php-forward-data-post/…<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
à l'intérieur de<form>
language
attribut est obsolète, il devrait l'être<script type="text/javascript">...</script>
la source
$url
réponse fournie - Elle remplace simplement le contenu de la page existante par le contenu de la$url
page. Surtout , le code php dans la$url
page n'est pas évalué.redirect_post()
, qui est côté serveur, le code php, envoie une requête au SERVEUR pour a$url
. Si$url
c'est une.php
page, je note que le php n'est pas évalué - le html est retourné avec des balises php toujours dedans. N'est-il pas utile d'envoyer des données POST à un script côté serveur?J'ai une autre solution qui rend cela possible. Cela nécessite que le client exécute Javascript (ce qui, je pense, est une exigence équitable de nos jours).
Utilisez simplement une demande AJAX sur la page A pour aller générer votre numéro de facture et les détails du client en arrière-plan (votre page B précédente), puis une fois que la demande est retournée avec succès avec les informations correctes - remplissez simplement le formulaire via votre passerelle de paiement (Page C).
Vous obtiendrez ainsi votre résultat en cliquant sur un seul bouton et en passant à la passerelle de paiement. Voici un pseudocode
HTML:
JS (en utilisant jQuery pour plus de commodité mais trivial pour faire du Javascript pur):
la source
$ _SESSION est votre ami si vous ne voulez pas jouer avec Javascript
Supposons que vous essayez de transmettre un e-mail:
À la page A:
Et à la page B:
Pour détruire la session
la source
Vous pouvez laisser PHP faire un POST, mais votre php obtiendra le retour, avec toutes sortes de complications. Je pense que le plus simple serait de laisser l'utilisateur faire le POST.
Donc, en quelque sorte ce que vous avez suggéré, vous obtiendrez en effet cette partie:
Détails de remplissage du client dans la page A, puis dans la page B, nous créons une autre page pour afficher tous les détails du client, cliquez sur un bouton CONFIRMER, puis POSTEZ sur la page C.
Mais vous pouvez réellement faire une soumission javascript sur la page B, donc il n'est pas nécessaire de cliquer. Faites-en une page de "redirection" avec une animation de chargement, et vous êtes prêt.
la source
Je sais que c'est une vieille question, mais j'ai encore une autre solution alternative avec jQuery:
Le code ci-dessus utilise jQuery pour créer une balise de formulaire, en ajoutant des champs masqués en tant que champs de publication, et le soumettre enfin. La page sera transmise à la page cible du formulaire avec les données POST jointes.
ps JavaScript et jQuery sont requis pour ce cas. Comme suggéré par les commentaires des autres réponses, vous pouvez utiliser la
<noscript>
balise pour créer un formulaire HTML standard au cas où JS serait désactivé.la source
Il y a un simple hack, utilisez
$_SESSION
et créez unearray
des valeurs publiées, et une fois que vous allez sur le site,File_C.php
vous pouvez l'utiliser, puis le traitez-vous après l'avoir détruit.la source
Je suis conscient que la question est
php
orientée, mais la meilleure façon de rediriger unPOST
demande est probablement d'utiliser.htaccess
, c'est-à-dire:Explication:
Par défaut, si vous souhaitez rediriger la demande avec des données POST, le navigateur la redirige via GET avec
302 redirect
. Cela supprime également toutes les données POST associées à la demande . Le navigateur le fait par précaution pour empêcher toute nouvelle soumission involontaire de la transaction POST.Mais que se passe-t-il si vous souhaitez rediriger de toute façon la demande POST avec ses données? Dans HTTP 1.1, il existe un code d'état pour cela.Le code d'état
307
indique que la demande doit être répétée avec la même méthode HTTP et les mêmes données. Ainsi, votre demande POST sera répétée avec ses données si vous utilisez ce code d'état.SRC
la source
J'ai rencontré des problèmes similaires avec POST Request où GET Request fonctionnait bien sur mon backend, je transmets mes variables, etc. Le problème réside dans le fait que le backend fait beaucoup de redirections, ce qui ne fonctionnait pas avec fopen ou les méthodes d'en-tête php.
Donc, la seule façon de le faire fonctionner était de mettre un formulaire caché et de pousser les valeurs avec une soumission POST lorsque la page est chargée.
la source
Vous pouvez utiliser des sessions pour enregistrer des
$_POST
données, puis récupérer ces données et les définir$_POST
sur la demande suivante.Soumet l' utilisateur demande à /dirty-submission-url.php
Do:
Ensuite, le navigateur redirige et demande
/clean-submission-url
à votre serveur. Vous aurez un routage interne pour savoir quoi faire avec cela.Au début de la demande, vous ferez:
Maintenant, pendant le reste de votre demande, vous pouvez accéder
$_POST
comme vous le pouviez à la première demande.la source
$_POST
données dans une chaîne de requête et les transmettre à la page suivante de cette façon. Mais alors les données ne peuvent pas être trop terriblement volumineuses. Et cela ne fonctionne probablement pas si des téléchargements de fichiers sont impliqués, mais je ne suis pas sûr.Essaye ça:
Envoyer des données et demander avec l'en-tête http dans la page B pour rediriger vers la passerelle
En-têtes supplémentaires:
la source
Voici une autre approche qui fonctionne pour moi:
si vous devez rediriger vers une autre page Web (
user.php
) et inclut une variable PHP ($user[0]
):ou
la source
Exemple:
la source