Configurer l'URL de retour PayPal et la rendre automatiquement?

127

Ceci est une question complémentaire à: PHP: Un moyen facile de démarrer le paiement PayPal?

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

Vous venez de terminer votre paiement. XXXX, vous venez de terminer votre paiement. Votre ID de transaction pour ce paiement est: XXXXXXXXXXXXX.

Nous enverrons un e-mail de confirmation à [email protected]. Cette transaction apparaîtra sur votre relevé comme PAYPAL.

Go to PayPal account overview

J'en ai besoin pour ne pas afficher cet écran et accéder directement à l'URL de retour. J'ai:

  • Définissez la variable "return"
  • Définissez la variable "rm" sur: 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 ma fiche complète:

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

Une idée de la façon dont je peux le faire revenir automatiquement? Sinon, comment puis-je récupérer le résultat du paiement sur mon site Web afin de pouvoir mettre à jour la base de données? Qu'est-ce que l'IPN?

coderama
la source
Veuillez noter que l'hôte entre dans votre paramètre de retour personnalisé doit être le même que celui configuré dans votre compte paypal.
Andreas

Réponses:

199

Vous devez activer le retour automatique dans votre compte PayPal, sinon il ignorera le returnchamp.

À partir de la documentation (mise à jour pour refléter la nouvelle mise en page janvier 2019):

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

  1. Connectez-vous à votre compte PayPal sur https://www.paypal.com ou https://www.sandbox.paypal.com La page de présentation de mon compte apparaît.
  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 de site Web. La page Préférences de paiement sur le site Web apparaît
  5. Sous Retour automatique pour les paiements sur site Web, cliquez sur le bouton radio Activé pour activer le retour automatique.
  6. Dans le champ URL de retour, saisissez l'URL vers laquelle vous souhaitez que vos payeurs soient redirigés après avoir effectué leurs paiements. REMARQUE: PayPal vérifie l'URL de retour que vous entrez. Si l'URL n'est pas correctement formatée ou ne peut pas être validée, PayPal n'activera pas le retour automatique.
  7. Faites défiler vers le bas de la page et cliquez sur le bouton Enregistrer.

IPN est pour la notification instantanée de paiement. Cela vous donnera des informations plus fiables / utiles que ce que vous obtiendrez du retour automatique.

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

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

La procédure générale est que vous transmettez un notify_urlparamètre avec la demande et que vous configurez une page qui gère et valide les notifications IPN, et PayPal enverra des demandes à cette page pour vous avertir lorsque les paiements / remboursements / etc. traverser. Cette page de gestionnaire IPN serait alors le bon endroit pour mettre à jour la base de données pour marquer les commandes comme ayant été payées.

Kevin Stricker
la source
2
Jetez un œil ici paypal.com/cgi-bin/webscr?cmd=p/mer/…
Développeur
5
Avec la nouvelle mise en page du site Web de Paypal, ce n'est plus exactement exact. Étape 3) Cliquez sur My Selling Tools Étape 4) Cliquez Website PreferencessousSelling Online
Webnet
2
L'IPN doit être utilisé pour vérifier que la commande a été correctement traitée par PayPal, cependant, vous avez toujours besoin de l'URL de retour pour montrer à l'utilisateur que vous êtes conscient du succès. Tant de fois, les utilisateurs ne reçoivent pas l'e-mail que vous envoyez, donc c'est bien s'ils peuvent accéder au produit (téléchargement, etc.) immédiatement.
pcunite
1
@Kevin Stricker Comment pouvons-nous configurer l'URL de retour pour 2 sites différents? comme si j'utilise un compte paypal pour 2 sites Web, mais je ne peux ajouter qu'une seule URL comme URL de retour en utilisant vos étapes. comment puis-je l'utiliser pour 2 sites?
Gaurav
4
Il n'est pas tout à fait exact que "Vous devez activer le retour automatique dans votre compte PayPal, sinon il ignorera le returnchamp." Tout returnparamètre d'URL que vous passez à la caisse serait honoré et remplacerait toute URL de retour automatique (ou son absence) configurée dans le profil de compte PayPal du vendeur, mais si le retour automatique n'est pas activé, l'acheteur devra cliquer manuellement au-delà du fin de la commande afin d'être redirigé vers cette URL, plutôt que d'être redirigé automatiquement.
SubGothius
42

Exemple 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="[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>

veuillez parcourir les champs notify_url, return, cancel_return

exemple de code pour la gestion d'ipn (my_ipn.php) qui est demandé par paypal après le paiement.

Pour plus d'informations sur la création d'un IPN, veuillez consulter 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("[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]");
?>

L'image ci-dessous vous aidera à comprendre le processus paypal. Flux de processus Paypal

Pour plus d'informations, reportez-vous aux liens suivants;

j'espère que cela vous aidera .. :)

Prashanth Pratapagiri
la source
1
Quelqu'un sait-il si cela est toujours valable avec les API paypal d'aujourd'hui? Je vois que la question a 2 ans.
Matt Welander
1
Les URL «return» et «cancel_return» sont utilisées pour fournir un retour immédiat sur la transaction à l'acheteur et peuvent utiliser des variables PDT pour cela. Cependant, PP n'essaie qu'une seule fois avec eux, de sorte qu'ils ne peuvent pas être invoqués pour l'exécution des commandes critiques (par exemple, l'acheteur ferme le navigateur après le paiement, mais toujours chez PP). Pour cela, vous pouvez également le sauvegarder avec le processus IPN fiable, via 'notify_url', en traitant au minimum le statut 'Completed' (supposons que tout le reste est un échec, nécessitant peut-être une négociation manuelle). Le traitement de votre serveur PDT et IPN devra garantir que la commande n'est exécutée qu'une seule fois.
Patanjali
Je crois que les choses ont changé et que Paypal success.php ne fonctionne plus qu'avec les variables GET. Voir ici: stackoverflow.com/questions/45671366/...
Sol
23

une façon dont j'ai trouvé:

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

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

rm signifie méthode de retour ;

2 moyens (post)

Ensuite, après les achats de l'utilisateur et le retour à l'url de votre site, cette URL obtient également les paramètres POST

ps si vous utilisez php, essayez d'insérer var_dump($_POST);dans votre URL de retour (script), puis effectuez un achat test et lorsque vous reviendrez sur votre site, vous verrez quelles variables sont présentes sur votre URL.

T.Todua
la source
L'avez-vous réellement utilisé?
Simon Gibbs
C'était génial. Tant que le transfert des données de paiement est désactivé dans paypal, tous les paramètres de publication sont envoyés à l'URL de retour.
JulianJ
4

Partager ceci car j'ai récemment rencontré des problèmes similaires à ce fil

Pendant longtemps, mon script a bien fonctionné (formulaire de paiement de base) et a renvoyé les variables POST à ​​ma page success.php et les données IPN en tant que 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é dans Sandbox et en direct et je suis presque sûr que PayPal a changé quelque chose!

Le notify_url reçoit toujours les données IPN correctes me permettant de mettre à jour DB, mais je n'ai pas été en mesure d'afficher un message de réussite sur ma page URL de retour (success.php).

Bien que j'aie essayé de nombreuses combinaisons pour activer et désactiver les options dans les préférences de paiement du site PayPal et l'IPN, j'ai dû apporter des modifications à mon script pour m'assurer de pouvoir toujours traiter un message. J'ai accompli cela en activant 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 moche!

Vous pouvez également trouver cela utile

Sol
la source
3

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!

Disons, par exemple, que vous avez un certain nombre de sites Web qui utilisent le même compte PayPal pour gérer vos paiements, ou dites que vous avez un certain nombre de sections dans un site Web qui effectuent différentes tâches d'achat et nécessitent des adresses de retour différentes lors du paiement. est terminé. Si je mets 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 ici:

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

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

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 avec plusieurs actions.

Commentaires s'il vous plaît ??

Tim Makins
la source
3
le paramètre de retour peut être passé pour chaque formulaire remplaçant la configuration de l'URL de retour automatique dans la configuration paypal
DropHit
1
ouais ce que DropHit a dit, c'est juste la valeur de retour automatique par défaut, au cas où vous oublieriez de la passer en paramètre. si vous le transmettez en tant que paramètre, il utilisera votre URL de retour pour chacun de vos sites Web.
hamish
est-ce que cela aide? codeseekah.com/2012/02/11/…
hamish
@DropHit Est-ce que PDT fonctionne toujours avec les returnvaleurs de remplacement par bouton alors? Je peux donc avoir différentes pages de retour qui recevront toujours toutes les données PDT?
Dai
Désolé pour la réponse tardive - je ne suis pas certain que cela fonctionnera MAIS mes intégrations actuelles fonctionnent toujours comme prévu, même si cela ne garantit pas que votre cas d'utilisation fonctionnera comme le mien
DropHit
1

sur la page de paiement, recherchez l'élément de formulaire caché 'cancel_return':

définissez la valeur de l'élément de formulaire cancel_return sur l'URL vers laquelle vous souhaitez revenir:

Rahul Shinde
la source
En fait, «annuler le retour» n'est utilisé que lorsque la transaction échoue. Vous DEVEZ également fournir une URL de «retour» pour gérer les transactions terminées avec succès, sinon l'URL par défaut sera utilisée pour elles.
Patanjali
Pas lorsque la transaction échoue, mais plutôt lorsque l'acheteur clique sur le lien "Annuler et retourner à [nom du marchand]" lors du paiement pour abandonner la finalisation de sa commande.
SubGothius