131 votes

Configurer l'URL de retour de PayPal et la faire revenir automatiquement ?

C'est une question de suivi de : PHP : Un moyen simple de lancer le paiement par PayPal ?

Donc, mon problème est que je spécifie l'url de retour. Cependant, après avoir payé avec PayPal, j'arrive à un écran qui dit :

Vous venez de compléter votre paiement. XXXX, vous venez d'effectuer votre paiement. Votre ID de transaction pour ce paiement est : XXXXXXXXXXX.

Nous enverrons un courriel de confirmation à XX@XXXX.com. Cette transaction apparaîtra sur votre relevé sous le nom de PAYPAL.

Go to PayPal account overview

J'ai besoin de ne pas afficher cet écran et d'aller directement à l'URL de retour. J'ai :

  • Définir la variable "retour".
  • Réglez la variable "rm" à : 2 (qui selon le guide = " le navigateur de l'acheteur est redirigé vers l'URL de retour en utilisant la méthode POST, et toutes les variables de paiement sont incluses. ")

En fait, voici mon formulaire complet :

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

Avez-vous une idée de la façon dont je peux faire en sorte que le paiement soit automatiquement renvoyé ? Ou bien, comment faire pour que le résultat du paiement revienne sur mon site web afin que je puisse mettre à jour la base de données ? Qu'est-ce que l'IPN ?

0 votes

Veuillez noter que l'hôte des entrées dans votre paramètre de retour personnalisé doit être le même que celui configuré dans votre compte Paypal.

203voto

Kevin Stricker Points 11294

Vous devez activer le retour automatique dans votre compte PayPal, sinon le système ignorera la demande de remboursement. return champ.

Extrait de la documentation (mise à jour pour refléter la nouvelle mise en page Jan 2019) :

Le retour automatique est désactivé par défaut. Pour activer le retour automatique :

  1. Connectez-vous à votre compte PayPal à l'adresse https://www.paypal.com ou https://www.sandbox.paypal.com La page Vue d'ensemble de mon compte s'affiche.
  2. Cliquez sur l'icône d'engrenage en haut à droite. La page Résumé du profil s'affiche.
  3. Cliquez sur le lien Mes préférences de vente dans la colonne de gauche.
  4. Dans la section Vente en ligne, cliquez sur le lien Mettre à jour dans la ligne des préférences du site Web. La page Préférences de paiement du site Web s'affiche
  5. Sous Retour automatique pour les paiements sur site Web, cliquez sur le bouton radio Activé pour activer le retour automatique. retour automatique.
  6. Dans le champ URL de retour, saisissez l'URL vers laquelle vous souhaitez que vos payeurs soient redirigés après après avoir effectué leurs paiements. REMARQUE : PayPal vérifie l'URL de retour que vous saisissez. Si l'URL n'est pas correctement formatée ou ne peut être validée, PayPal n'activera pas le retour automatique.
  7. Faites défiler jusqu'au bas de la page et cliquez sur le bouton Enregistrer.

IPN est pour la notification instantanée de paiement. Il vous donnera des informations plus fiables/utiles que celles que vous obtiendrez avec le retour automatique.

La documentation pour IPN est ici : https://www.x.com/sites/default/files/ipnguide.pdf

Documentation en ligne pour l'IPN : https://developer.paypal.com/docs/classic/ipn/gs_IPN/

La procédure générale est la suivante : vous passez un notify_url avec la requête, et configurez une page qui gère et valide les notifications IPN. PayPal enverra des requêtes à cette page pour vous informer lorsque les paiements/remboursements/etc. seront effectués. Cette page de gestion des IPN serait alors le bon endroit pour mettre à jour la base de données afin de marquer les commandes comme ayant été payées.

0 votes

Pourquoi le lien "Préférences de paiement du site Web" n'apparaît-il pas ? Je n'utilise que le compte de tets Sandbox.....

2 votes

Jetez un coup d'œil ici paypal.com/cgi-bin/webscr?cmd=p/mer/

5 votes

Avec la nouvelle présentation du site web de Paypal, ce n'est plus tout à fait exact. Étape 3) Cliquez My Selling Tools Étape 4) Cliquez sur Website Preferences sous Selling Online

45voto

Modèle de formulaire utilisant PHP pour les paiements directs.

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

veuillez passer par les champs notify_url, return, cancel_return

exemple de code pour gérer l'ipn (my_ipn.php) qui est demandé par paypal après que le paiement a été effectué.

Pour plus d'informations sur la création d'un IPN, veuillez vous référer à ce lien.

<?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 transactions 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'image ci-dessous vous aidera à comprendre le processus Paypal. Paypal process flow

Pour de plus amples informations, veuillez consulter les liens suivants ;

J'espère que cela vous aidera :)

1 votes

Quelqu'un sait-il si cela est encore valable avec les API de Paypal d'aujourd'hui ? Je vois que la question date de 2 ans.

1 votes

Les URL "return" et "cancel_return" sont utilisées pour fournir un retour d'information immédiat sur la transaction à l'acheteur, et peuvent utiliser des variables PDT pour cela. Cependant, PP n'essaie qu'une seule fois avec ces URL, et on ne peut donc pas compter sur elles pour l'exécution d'une commande critique (si l'acheteur ferme son navigateur après le paiement, mais est toujours chez PP). Pour ce faire, vous pouvez également vous appuyer sur le processus IPN fiable, via 'notify_url', en traitant au minimum le statut 'Completed' (tout autre statut est un échec, nécessitant peut-être une négociation manuelle). Votre PDT et le traitement du serveur IPN devront garantir que la commande n'est remplie qu'une seule fois.

0 votes

Je crois que les choses ont changé et que Paypal success.php ne fonctionne maintenant qu'avec des variables GET. Voir ici : stackoverflow.com/questions/45671366/

23voto

solution fix Points 450

Un moyen que j'ai trouvé :

essayez d'insérer ce champ dans le code de votre formulaire généré :

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

rm signifie méthode de retour ;

2 signifie (post)

Puis, après que l'utilisateur ait acheté et soit revenu à l'url de votre site, cette url reçoit également les paramètres POST.

p.s. si vous utilisez php, essayez d'insérer var_dump($_POST); dans votre url de retour (script),puis faites un test d'achat et quand vous reviendrez sur votre site vous verrez quelles variables sont obtenues sur votre url.

0 votes

L'avez-vous vraiment utilisé ?

0 votes

C'était génial. Tant que le transfert des données de paiement est désactivé dans Paypal, tous les paramètres du message sont envoyés à l'url de retour.

4voto

Sol Points 207

Je partage cette information car j'ai récemment rencontré des problèmes similaire à ce fil

Pendant longtemps, mon script a bien fonctionné (formulaire de paiement de base) et renvoyé les variables POST à ma page success.php et les données IPN comme variables POST également. Cependant, dernièrement, j'ai remarqué que la page de retour (success.php) ne recevait plus de variables POST. J'ai testé en Sandbox et en live et je suis presque sûr que PayPal a changé quelque chose !

Le notify_url reçoit toujours les données IPN correctes, ce qui me permet de mettre à jour la base de données, mais je n'ai pas réussi à afficher un message de réussite sur ma page de retour d'URL (success.php).

Bien que j'aie essayé de nombreuses combinaisons pour activer et désactiver des options dans les préférences de paiement du site PayPal et dans l'IPN, j'ai dû apporter quelques modifications à mon script pour m'assurer que je peux toujours traiter un message. Pour ce faire, j'ai activé les options PDT et Auto Return, après avoir suivi cet excellent guide .

Maintenant, tout fonctionne bien, mais le seul problème est que l'URL de retour contient toutes les variables PDT, ce qui est laid !

Vous pouvez également trouver ce qui est utile

3voto

Tim Makins Points 169

Je pense que l'idée de définir les valeurs de retour automatique comme décrit ci-dessus par Kevin est un peu étrange !

Supposons, par exemple, que vous ayez plusieurs sites Web qui utilisent le même compte PayPal pour gérer vos paiements, ou que vous ayez plusieurs sections d'un même site Web qui effectuent différentes tâches d'achat et nécessitent différentes adresses de retour une fois le paiement effectué. Si je place un bouton sur ma page comme décrit ci-dessus dans la section "Exemple de formulaire utilisant PHP pour les paiements directs", vous pouvez voir qu'il y a une ligne :

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

où vous définissez la valeur de retour individuelle. Pourquoi doit-elle être définie de manière générale, dans la section du profil également ?!?!

De plus, comme vous ne pouvez définir qu'une seule valeur dans la section Profil, cela signifie (AFAIK) que vous ne pouvez pas utiliser le retour automatique sur un site comportant plusieurs actions.

Commentaires s'il vous plaît ?

3 votes

Le paramètre de retour peut être passé pour chaque formulaire en remplaçant l'url de retour automatique configurée dans la configuration de Paypal.

1 votes

Oui, ce que DropHit a dit, c'est juste la valeur de retour automatique par défaut, au cas où vous oubliez de le passer en paramètre. si vous le passez en paramètre, il utilisera votre url de retour pour chacun de vos sites web.

0 votes

Est-ce que ça aide ? codeseekah.com/2012/02/11/…

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X