Configurando o URL de retorno do PayPal e fazendo com que ele retorne automaticamente?

127

Esta é uma pergunta de acompanhamento para: PHP: maneira fácil de iniciar a finalização da compra no PayPal?

Portanto, meu problema é que estou especificando o URL de retorno. No entanto, depois de pagar com o PayPal, acabo em uma tela que diz:

Você acabou de concluir seu pagamento. XXXX, você acabou de concluir seu pagamento. O seu ID de transação para este pagamento é: XXXXXXXXXXXXX.

Enviaremos um email de confirmação para [email protected]. Esta transação aparecerá no seu extrato como PAYPAL.

Go to PayPal account overview

Eu preciso que ele não mostre essa tela e vá diretamente para o URL de retorno. Eu tenho:

  • Defina a variável "return"
  • Defina a variável "rm" como: 2 (que de acordo com o guide = " o navegador do comprador é redirecionado para o URL de retorno usando o método POST, e todas as variáveis ​​de pagamento estão incluídas ")

De fato, aqui está toda a minha forma:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="[email protected]" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

Alguma idéia de como posso fazê-lo voltar automaticamente? Como alternativa, como recupero o resultado do pagamento no meu site para que eu possa atualizar o banco de dados? O que é IPN?

coderama
fonte
Observe que o host digitado no seu parâmetro de retorno personalizado deve ser o mesmo que o configurado na sua conta paypal.
Andreas

Respostas:

199

Você deve ativar o retorno automático em sua conta do PayPal, caso contrário, o returncampo será ignorado .

A partir da documentação (atualizada para refletir o novo layout, janeiro de 2019):

O retorno automático está desativado por padrão. Para ativar o retorno automático:

  1. Faça login na sua conta do PayPal em https://www.paypal.com ou https://www.sandbox.paypal.com. A página Visão geral da Minha conta é exibida.
  2. Clique no ícone de roda dentada no canto superior direito. A página Resumo do perfil é exibida.
  3. Clique no link Minhas preferências de venda na coluna esquerda.
  4. Na seção Venda on-line, clique no link Atualizar na linha de Preferências do site. A página Preferências de pagamento do site é exibida
  5. Em Devolução automática para pagamentos por site, clique no botão de opção Ativar para ativar a devolução automática.
  6. No campo URL de retorno, insira a URL para a qual você deseja que seus pagadores sejam redirecionados após a conclusão dos pagamentos. NOTA: O PayPal verifica o URL de retorno digitado. Se o URL não estiver formatado corretamente ou não puder ser validado, o PayPal não ativará o Retorno automático.
  7. Role até a parte inferior da página e clique no botão Salvar.

IPN é para notificação de pagamento instantâneo. Ele fornecerá informações mais confiáveis ​​/ úteis do que as obtidas no retorno automático.

A documentação para IPN está aqui: https://www.x.com/sites/default/files/ipnguide.pdf

Documentação on-line para IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

O procedimento geral é que você transmita um notify_urlparâmetro com a solicitação e configure uma página que manipule e valide notificações de IPN, e o PayPal enviará solicitações para essa página para notificá-lo quando pagamentos / reembolsos / etc. ir através. Essa página do manipulador de IPN seria o local correto para atualizar o banco de dados para marcar pedidos como pagos.

Kevin Stricker
fonte
2
Dê uma olhada aqui paypal.com/cgi-bin/webscr?cmd=p/mer/…
Desenvolvedor
5
Com o novo layout do site do Paypal, isso não é mais exatamente exato. Etapa 3) Clique na My Selling Tools Etapa 4) Clique Website PreferencesemSelling Online
Webnet
2
O IPN deve ser usado para verificar se o pedido foi tratado corretamente pelo PayPal. No entanto, você ainda precisa do URL de retorno para mostrar ao usuário o seu conhecimento do sucesso. Muitas vezes os usuários não recebem o e-mail que você envia, por isso é bom que eles possam ter acesso ao produto (download, etc.) imediatamente.
pcunite
1
@ Kevin Stricker Como podemos configurar o URL de retorno para 2 sites diferentes? como se eu usasse uma conta paypal para 2 sites, mas posso adicionar apenas um URL como URL de retorno usando suas etapas. como posso usar isso para 2 sites?
Gaurav
4
Não é muito preciso que "Você precise ativar o retorno automático em sua conta do PayPal, caso contrário, ele ignorará o returncampo". Qualquer returnparâmetro de URL que você passar para a finalização da compra será respeitado e substituirá qualquer URL de devolução automática (ou a falta dela) configurado no perfil da conta do PayPal do vendedor, mas se eles não tiverem a devolução automática ativada, o comprador precisará clicar manualmente final do checkout para ser redirecionado para esse URL, em vez de ser redirecionado automaticamente.
SubGothius 11/08
42

Exemplo de formulário usando PHP para pagamentos diretos.

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="[email protected]">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

gentilmente percorra os campos notify_url, return, cancel_return

código de exemplo para manipular o ipn (my_ipn.php), que é solicitado pelo paypal após o pagamento.

Para mais informações sobre a criação de um IPN, consulte este link.

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from PayPal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to PayPal's server using curl, and validate everything with PayPal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$url = "https://www.paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("[email protected]", "IPN interaction not verified", "$req", "From: [email protected]");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "[email protected]") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("[email protected]", "NORMAL IPN RESULT YAY MONEY!", $req, "From: [email protected]");
?>

A imagem abaixo ajudará você a entender o processo paypal. Fluxo de processo Paypal

Para leituras adicionais, consulte os seguintes links;

Espero que isso ajude você..:)

Prashanth Pratapagiri
fonte
1
Alguém sabe se isso ainda é válido com as APIs paypal de hoje? Vejo que a pergunta tem 2 anos.
Matt Welander
1
Os URLs 'return' e 'cancel_return' são usados ​​para fornecer feedback imediato da transação ao comprador e podem usar variáveis ​​PDT para isso. No entanto, o PP tenta apenas uma vez com eles, de modo que não se pode confiar no atendimento de pedidos críticos (digamos que o comprador fecha o navegador após o pagamento, mas ainda no PP). Para isso, você também pode fazer backup com o processo IPN confiável, via 'notify_url', processando o status 'Concluído' no mínimo (suponha que qualquer outra coisa seja uma falha, talvez exigindo negociação manual). O processamento do servidor PDT e IPN precisará garantir que o pedido seja preenchido apenas uma vez.
Patanjali
Eu acredito que as coisas mudaram e Paypal success.php agora só funciona com variáveis ​​GET. Veja aqui: stackoverflow.com/questions/45671366/…
Sol
23

uma maneira que eu encontrei:

tente inserir este campo no código do formulário gerado:

<input type='hidden' name='rm' value='2'>

rm significa método de retorno ;

2 meios (poste)

Depois que o usuário compra e retorna ao URL do site, esse URL também obtém os parâmetros POST

ps se estiver usando php, tente inserir var_dump($_POST);seu URL de retorno (script), faça uma compra de teste e, quando retornar ao seu site, verá quais variáveis ​​são obtidas em seu URL.

T.Todua
fonte
Você realmente usou isso?
Simon Gibbs
Isso foi ótimo. Desde que a transferência de dados de pagamento esteja desativada no paypal, todas as configurações de postagem serão enviadas para o URL de retorno.
precisa saber é o seguinte
4

Compartilhando isso como encontrei recentemente problemas semelhantes a este tópico

Por um longo tempo, meu script funcionou bem (forma básica de pagamento) e retornou as variáveis ​​POST para minha página success.php e os dados IPN como variáveis ​​POST também. No entanto, ultimamente, notei que a página de retorno (success.php) não estava mais recebendo vars do POST. Eu testei no Sandbox e ao vivo e tenho certeza que o PayPal mudou alguma coisa!

O notify_url ainda recebe os dados IPN corretos, permitindo que eu atualize o banco de dados, mas não consegui exibir uma mensagem de sucesso na minha página de URL de retorno (success.php).

Apesar de tentar várias combinações para ativar e desativar as opções nas preferências de pagamento do site do PayPal e IPN, tive que fazer algumas alterações no meu script para garantir que ainda possa processar uma mensagem. Consegui isso ativando o PDT e o retorno automático, depois de seguir este excelente guia .

Agora tudo funciona bem, mas o único problema é que o URL de retorno contém todas as variáveis ​​PDT que são feias!

Você também pode achar útil

Sol
fonte
3

Eu acho que a idéia de definir os valores de Retorno automático, como descrito acima por Kevin, é um pouco estranha!

Diga, por exemplo, que você possui vários sites que usam a mesma conta do PayPal para lidar com seus pagamentos ou que possui várias seções em um site que executam tarefas de compra diferentes e exigem endereços de retorno diferentes quando o pagamento está completo. Se eu colocar um botão na minha página, conforme descrito acima, na seção 'Exemplo de formulário usando PHP para pagamentos diretos', você poderá ver que existe uma linha:

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

onde você define o valor de retorno individual. Por que ele precisa ser definido geralmente, também na seção de perfil?!?!

Além disso, como você pode definir apenas um valor na seção Perfil, significa (AFAIK) que você não pode usar o Retorno automático em um site com várias ações.

Comentários please ??

Tim Makins
fonte
3
o parâmetro de retorno pode ser passado para cada forma substituindo a configuração automática do URL de retorno na configuração paypal
DropHit
1
Sim, o que o DropHit disse, esse é apenas o valor padrão de retorno automático, caso você esqueça de passá-lo como parâmetro. se você o passar como parâmetro, ele usará seu URL de retorno para cada um dos seus sites.
Hamish
isso ajuda? codeseekah.com/2012/02/11/...
Hamish
@DropHit O PDT ainda funciona com returnvalores substituídos por botão , então? Para que eu possa ter diferentes páginas de retorno que ainda receberão dados da PDT?
Dai3
Desculpe pelo atraso na resposta - eu não estou certo de que ele vai trabalhar, mas meus integrações atuais ainda estão operando como esperado, embora isso não garante que o seu caso de uso funcionará como o meu não
DropHit
1

na página de checkout, procure o elemento de formulário oculto 'cancel_return':

defina o valor do elemento do formulário cancel_return para o URL ao qual você deseja retornar:

Rahul Shinde
fonte
Na verdade, 'cancelar retorno' é usado apenas quando a transação falha. Você DEVE também fornecer uma URL de 'retorno' para lidar com transações concluídas com êxito, caso contrário, a URL padrão será usada para elas.
Patanjali
Não quando a transação falha, mas quando o comprador clica no link "Cancelar e retornar ao [nome do comerciante]" durante o checkout para abandonar a conclusão do pedido.
SubGothius 11/08