Impostare l'URL di ritorno PayPal e renderlo ritorno automatico?


127

Questa è una domanda di follow-up a: PHP: un modo semplice per avviare il checkout PayPal?

Quindi, il mio problema è che sto specificando l'URL di ritorno. Tuttavia, dopo aver pagato con PayPal, finisco in una schermata che dice:

Hai appena completato il pagamento. XXXX, hai appena completato il pagamento. L'ID transazione per questo pagamento è: XXXXXXXXXXXXX.

Invieremo un'email di conferma a XX@XXXX.com. Questa transazione apparirà sul tuo estratto conto come PAYPAL.

Go to PayPal account overview

Ho bisogno che non mostri questa schermata e vada direttamente all'URL di ritorno. Io ho:

  • Imposta la variabile "return"
  • Impostare la variabile "rm" su: 2 (che secondo la guida = " il browser dell'acquirente viene reindirizzato all'URL di ritorno utilizzando il metodo POST e tutte le variabili di pagamento sono incluse ")

In effetti, ecco la mia intera forma:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="onlinestore@thegreekmerchant.com" 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>

Hai idea di come posso farlo tornare automaticamente? In alternativa, come posso ottenere il risultato del pagamento sul mio sito Web in modo da poter aggiornare il database? Cos'è l'IPN?


Tieni presente che l'host immesso nel parametro di ritorno personalizzato deve essere uguale a quello configurato nel tuo account paypal.
Andreas,

Risposte:


199

Devi abilitare il ritorno automatico nel tuo conto PayPal, altrimenti ignorerà il returncampo.

Dalla documentazione (aggiornata per riflettere il nuovo layout gennaio 2019):

Il ritorno automatico è disattivato per impostazione predefinita. Per attivare il ritorno automatico:

  1. Accedi al tuo conto PayPal su https://www.paypal.com o https://www.sandbox.paypal.com Viene visualizzata la pagina Panoramica del mio account.
  2. Fai clic sull'icona a forma di ingranaggio in alto a destra. Viene visualizzata la pagina Riepilogo profilo.
  3. Fai clic sul link Preferenze di vendita personali nella colonna di sinistra.
  4. Nella sezione Vendita online, fai clic sul link Aggiorna nella riga delle Preferenze del sito Web. Viene visualizzata la pagina Preferenze pagamento sito Web
  5. In Ritorno automatico per pagamenti su sito Web, fai clic sul pulsante di opzione Attivo per abilitare Ritorno automatico.
  6. Nel campo URL di ritorno, inserisci l'URL a cui desideri che i tuoi pagatori vengano reindirizzati dopo aver completato i pagamenti. NOTA: PayPal controlla l'URL di ritorno inserito. Se l'URL non è formattato correttamente o non può essere convalidato, PayPal non attiverà il ritorno automatico.
  7. Scorri fino alla fine della pagina e fai clic sul pulsante Salva.

IPN è per la notifica immediata del pagamento. Ti fornirà informazioni più affidabili / utili di quelle che otterrai dal ritorno automatico.

La documentazione per IPN è qui: https://www.x.com/sites/default/files/ipnguide.pdf

Documentazione online per IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

La procedura generale è che si passa un notify_urlparametro con la richiesta e si imposta una pagina che gestisce e convalida le notifiche IPN e PayPal invierà richieste a quella pagina per avvisare l'utente quando pagamenti / rimborsi / ecc. Vai oltre. La pagina del gestore IPN sarebbe quindi il posto corretto per aggiornare il database per contrassegnare gli ordini come pagati.



5
Con il nuovo layout del sito Web di Paypal, questo non è più esattamente preciso. Passaggio 3) Fare clic sul My Selling Tools Passaggio 4) Fare clic Website PreferencessuSelling Online
Webnet il

2
IPN deve essere utilizzato per verificare che l'ordine sia stato gestito correttamente da PayPal, tuttavia, è ancora necessario l'URL di ritorno per mostrare all'utente la consapevolezza del successo. Molte volte l'utente non riceve l'e-mail che invii, quindi è bello poter accedere immediatamente al prodotto (download, ecc.).
pcunite,

1
@Kevin Stricker Come possiamo impostare l'URL di ritorno per 2 siti diversi? come se uso un account paypal per 2 siti Web, ma posso aggiungere solo un URL come URL di ritorno usando i tuoi passaggi. come posso usarlo per 2 siti?
Gaurav,

4
Non è del tutto preciso che "Devi abilitare il ritorno automatico nel tuo conto PayPal, altrimenti ignorerà il returncampo". Qualsiasi returnparametro URL che passi al checkout verrà onorato e sovrascriverà qualsiasi URL di ritorno automatico (o la sua mancanza) configurato nel profilo del conto PayPal del venditore, ma se non ha il ritorno automatico abilitato lì, l'acquirente dovrebbe fare clic manualmente oltre il fine del checkout per essere reindirizzati a tale URL, anziché essere reindirizzati automaticamente.
SubGothius l'

42

Modulo di esempio che utilizza PHP per pagamenti diretti.

<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="you@youremail.com">

    <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>

cortesemente attraversa i campi notification_url, return, cancel_return

codice di esempio per la gestione di ipn (my_ipn.php) che viene richiesto da paypal dopo che è stato effettuato il pagamento.

Per ulteriori informazioni sulla creazione di un IPN, fare riferimento a questo collegamento.

<?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("you@youremail.com", "IPN interaction not verified", "$req", "From: you@youremail.com");
    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 != "you@youremail.com") {
//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("you@youremail.com", "NORMAL IPN RESULT YAY MONEY!", $req, "From: you@youremail.com");
?>

L'immagine seguente ti aiuterà a comprendere il processo paypal. Flusso del processo Paypal

Per ulteriori letture fare riferimento ai seguenti collegamenti;

spero che questo ti aiuti .. :)


1
Qualcuno sa se questo è ancora valido con le API paypal di oggi? Vedo che la domanda ha 2 anni.
Matt Welander,

1
Gli URL "return" e "cancel_return" vengono utilizzati per fornire all'acquirente un feedback immediato sulla transazione e possono utilizzare le variabili PDT per questo. Tuttavia, PP prova solo una volta con loro, quindi non possono essere invocati per l'evasione dell'ordine critico (ad esempio, l'acquirente chiude il browser dopo il pagamento, ma sempre in PP). Per questo, potresti voler eseguire anche il backup con l'affidabile processo IPN, tramite 'notification_url', elaborando lo stato 'Completato' al minimo (supponi che qualsiasi altra cosa sia un fallimento, magari richiedendo una negoziazione manuale). L'elaborazione del server PDT e IPN dovrà garantire che l'ordine venga eseguito una sola volta.
Patanjali

Credo che le cose siano cambiate e Pay.php success.php ora funziona solo con le variabili GET. Vedi qui: stackoverflow.com/questions/45671366/…
Sol,

23

un modo che ho trovato:

prova a inserire questo campo nel codice del modulo generato:

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

rm significa metodo di ritorno ;

2 mezzi (posta)

Che dopo che l'utente acquista e ritorna all'URL del tuo sito, anche quell'URL ottiene anche i parametri POST

ps se usi php, prova a inserire var_dump($_POST);l'URL di ritorno (script), quindi effettua un acquisto di prova e quando torni al tuo sito vedrai quali variabili sono presenti nel tuo url.


L'hai usato davvero?
Simon Gibbs,

Questo è stato grandioso. Finché il trasferimento dei dati di pagamento è disattivato in paypal, tutte le impostazioni della posta vengono inviate all'URL di ritorno.
JulianJ,

4

Condividendolo come ho riscontrato di recente problemi simili a questo thread

Per molto tempo, il mio script ha funzionato bene (modulo di pagamento di base) e ha restituito le variabili POST alla mia pagina success.php e anche i dati IPN come variabili POST. Tuttavia, ultimamente, ho notato che la pagina di ritorno (success.php) non riceveva più alcun VOST POST. Ho provato su Sandbox e live e sono abbastanza sicuro che PayPal abbia cambiato qualcosa!

Notify_url riceve ancora i dati IPN corretti che mi consentono di aggiornare il DB, ma non sono stato in grado di visualizzare un messaggio di successo sulla mia pagina URL di ritorno (success.php).

Nonostante abbia provato molte combinazioni per attivare e disattivare le opzioni nelle preferenze di pagamento del sito Web PayPal e IPN, ho dovuto apportare alcune modifiche al mio script per assicurarmi di poter ancora elaborare un messaggio. Ho ottenuto questo risultato attivando PDT e Ritorno automatico, dopo aver seguito questa eccellente guida .

Ora funziona tutto bene, ma l'unico problema è che l'URL di ritorno contiene tutte le variabili PDT che è brutto!

Potresti anche trovare utile questo


3

Penso che l'idea di impostare i valori di Ritorno automatico come descritto sopra da Kevin sia un po 'strana!

Supponiamo, ad esempio, di disporre di un numero di siti Web che utilizzano lo stesso account PayPal per gestire i pagamenti o di disporre di un numero di sezioni in un sito Web che svolgono diverse attività di acquisto e che richiedono indirizzi di restituzione diversi quando il pagamento è completato. Se inserisco un pulsante sulla mia pagina come descritto sopra nella sezione "Modulo di esempio utilizzando PHP per pagamenti diretti", puoi vedere che c'è una linea lì:

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

dove si imposta il valore di ritorno individuale. Perché deve essere impostato in generale, anche nella sezione profilo?!?!

Inoltre, poiché è possibile impostare un solo valore nella sezione Profilo, significa (AFAIK) che non è possibile utilizzare il ritorno automatico su un sito con più azioni.

Commenti per favore ??


3
il parametro return può essere passato per ogni modulo che sovrascrive la configurazione
dell'URL di

1
sì, quello che ha detto DropHit, questo è solo il valore di ritorno automatico predefinito, nel caso in cui ti dimentichi di passarlo come parametro. se lo passi come parametro, utilizzerà l'URL di ritorno per ciascuno dei tuoi siti web.
hamish


@DropHit PDT funziona ancora con i returnvalori di overrriden per pulsante ? Quindi posso avere diverse pagine di ritorno che riceveranno comunque tutti i dati PDT?
Dai

Ci scusiamo per la risposta tardiva - non sono sicuro che funzionerà MA le mie integrazioni attuali funzionano ancora come previsto, anche se ciò non garantisce che il tuo caso d'uso funzionerà come il mio
DropHit

1

nella pagina di checkout, cerca l'elemento del modulo nascosto 'cancel_return':

imposta il valore dell'elemento del modulo cancel_return sull'URL a cui desideri tornare:


In realtà, "Annulla reso" viene utilizzato solo quando la transazione fallisce. DEVI anche fornire un URL di "ritorno" per gestire le transazioni completate correttamente, altrimenti verrà utilizzato l'URL predefinito.
Patanjali

Non quando la transazione fallisce, ma piuttosto quando l'acquirente fa clic sul link "Annulla e ritorna a [nome commerciante]" durante il checkout per abbandonare il completamento dell'ordine.
SubGothius l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.