Eu fiz algumas pesquisas sobre esse tópico e alguns especialistas disseram que isso não é possível , então eu gostaria de pedir uma solução alternativa.
Minha situação:
Página A: [checkout.php] O cliente preenche seus detalhes de cobrança.
Página B: [process.php] Gere um número de fatura e armazene detalhes do cliente no banco de dados.
Página C: [thirdparty.com] Terceiro gateway de pagamento (SOMENTE ACEITE DADOS PÓS-POST).
O Cliente preenche seus detalhes e configura seu carrinho na Página A e, em seguida, POSTs na Página B. No process.php, armazene os dados POSTed no banco de dados e gere um número de fatura. Depois disso, envie os dados do cliente e o número da fatura para o gateway de pagamento thirdparty.com. O problema está no POST na página B. O cURL pode POSTAR os dados na página C, mas o problema é que a página não foi redirecionada para a página C. O cliente precisa preencher os detalhes do cartão de crédito na página C.
O gateway de pagamento de terceiros nos deu a amostra da API, a amostra é POST o número da fatura junto com os detalhes do cliente. Não queremos que o sistema gere um excesso de números de faturas indesejados.
Existe alguma solução para isso? Nossa solução atual é que o cliente preencha os detalhes na página A e, na página B, criamos outra página mostrando todos os detalhes do cliente, onde o usuário pode clicar em um botão CONFIRMAR para POSTAR na página C.
Nosso objetivo é que os clientes tenham apenas que clicar uma vez.
Espero que minha pergunta seja clara :)
Respostas:
Gere um formulário na Página B com todos os dados e ações necessários configurados para a Página C e envie-o com JavaScript no carregamento da página. Seus dados serão enviados para a página C sem muito incômodo para o usuário.
Esta é a única maneira de fazê-lo. Um redirecionamento é um cabeçalho HTTP 303 que você pode ler em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , mas vou citar alguns deles:
A única maneira de conseguir o que você está fazendo é com uma página intermediária que envia o usuário para a página C. Aqui está um pequeno / simples trecho de como você pode conseguir isso:
Você também deve ter um formulário "confirmar" simples dentro de uma tag noscript para garantir que usuários sem Javascript possam usar seu serviço.
fonte
$a
e$b
usandohtmlentities/htmlspecialchars
, consulte stackoverflow.com/questions/6180072/php-forward-data-post/…<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
dentro do<form>
language
atributo foi descontinuado, deveria ser #<script type="text/javascript">...</script>
fonte
$url
- apenas substitui o conteúdo da página existente pelo conteúdo da$url
página. Importante , o código php na$url
página não é avaliado.redirect_post()
, que é do lado do servidor, código php, envia uma solicitação ao SERVIDOR para a$url
. Se$url
for uma.php
página, observo que o php não é avaliado - o html é retornado com as tags php ainda nele. O objetivo principal não é enviar dados POST para um script do lado do servidor?Eu tenho outra solução que torna isso possível. Requer que o cliente esteja executando Javascript (o que eu acho que é um requisito justo nos dias de hoje).
Basta usar uma solicitação AJAX na página A para gerar o número da fatura e os detalhes do cliente em segundo plano (sua página B anterior) e, depois que a solicitação for retornada com sucesso com as informações corretas - basta preencher o envio do formulário no seu gateway de pagamento (Página C).
Isso alcançará o resultado do usuário clicando apenas em um botão e prosseguindo para o gateway de pagamento. Abaixo está algum pseudocódigo
HTML:
JS (usando jQuery por conveniência, mas trivial para criar Javascript puro):
fonte
$ _SESSION é seu amigo se você não quiser mexer com Javascript
Digamos que você esteja tentando passar um email:
Na página A:
E na página B:
Para destruir a sessão
fonte
Você pode deixar o PHP fazer um POST, mas o seu php receberá o retorno, com todo tipo de complicações. Eu acho que o mais simples seria realmente deixar o usuário fazer o POST.
Então, tipo o que você sugeriu, você terá essa parte:
Detalhes de preenchimento do cliente na página A e, na página B, criamos outra página, mostrando todos os detalhes do cliente, clique no botão CONFIRMAR e, em seguida, POSTAR na página C.
Mas você pode realmente enviar um envio de javascript na página B, para que não seja necessário clicar. Torne uma página de "redirecionamento" com uma animação de carregamento e pronto.
fonte
Sei que essa é uma pergunta antiga, mas tenho outra solução alternativa com o jQuery:
O código acima usa o jQuery para criar uma tag de formulário, anexando campos ocultos como campos de postagem e enviando-o finalmente. A página será encaminhada para a página de destino do formulário com os dados do POST anexados.
ps JavaScript e jQuery são necessários para este caso. Conforme sugerido pelos comentários das outras respostas, você pode usar a
<noscript>
tag para criar um formulário HTML padrão, caso JS esteja desativado.fonte
Existe um hack simples, use
$_SESSION
e crie umarray
dos valores postados e, uma vez acessado,File_C.php
você poderá usá-lo e processá-lo depois de destruí-lo.fonte
Estou ciente de que a pergunta é
php
orientada, mas a melhor maneira de redirecionar umaPOST
solicitação provavelmente está usando.htaccess
, ou seja:Explicação:
Por padrão, se você deseja redirecionar a solicitação com dados POST, o navegador a redireciona via GET with
302 redirect
. Isso também descarta todos os dados do POST associados à solicitação . O navegador faz isso como uma precaução para impedir o reenvio não intencional da transação POST.Mas e se você quiser redirecionar de qualquer maneira a solicitação POST com seus dados? No HTTP 1.1, há um código de status para isso. O código de status
307
indica que a solicitação deve ser repetida com o mesmo método HTTP e dados. Portanto, sua solicitação POST será repetida junto com os dados, se você usar esse código de status.SRC
fonte
Eu enfrentei problemas semelhantes com a solicitação POST, na qual a solicitação GET estava funcionando bem no meu back-end, que estou passando minhas variáveis etc. O problema reside no fato de que o back-end faz muitos redirecionamentos, que não funcionavam com os métodos fopen ou php header.
Portanto, a única maneira de fazê-lo funcionar era colocar um formulário oculto e enviar os valores com um envio POST quando a página é carregada.
fonte
Você pode usar sessões para salvar
$_POST
dados, recuperá-los e configurá-los$_POST
na solicitação subsequente.Submete usuário solicitar a /dirty-submission-url.php
Do:
Em seguida, o navegador redireciona e solicita
/clean-submission-url
do seu servidor. Você terá algum roteamento interno para descobrir o que fazer com isso.No início da solicitação, você fará:
Agora, através do restante da sua solicitação, você pode acessar
$_POST
como pôde na primeira solicitação.fonte
$_POST
dados em uma string de consulta e passá-los para a página subsequente dessa maneira. Mas então os dados não podem ser terrivelmente grandes. E isso provavelmente não funciona se o upload de arquivos estiver envolvido, mas não tenho certeza.Tente o seguinte:
Envie dados e solicite com cabeçalho http na página B para redirecionar para o Gateway
Cabeçalhos adicionais:
fonte
Aqui há outra abordagem que funciona para mim:
se você precisar redirecionar para outra página da web (
user.php
) e incluir uma variável PHP ($user[0]
):ou
fonte
Exemplo:
fonte