Entreprise EPI , création de sites internet

Une réponse adaptée pour artisans, commerçants ou associations.

Vous devez avoir suivi l’étape 2 Création du bouton HTML « Acheter maintenant » avant de passer à celle-ci.

Passons maintenant à la page de récupération des données
.php qui devra être placé à l’adresse indiqué dans la variable notify_url de votre bouton dans cet exemple : http://www.monsite.com//notify.php

tout d’abord nous devons créer dans notre base de donnée une table qui contiendra l’historique des transactions paypal.

j’utilise ici l’exemple donné par PaypalTech.com qui va nous permettre d’arriver à nos fins

Voici les tables à créer dans votre base de donnée :

  1. # Table structure for table `paypal_cart_info` #CREATE TABLE `paypal_cart_info` ( `txnid` varchar(30) NOT NULL default  », `itemname` varchar(255) NOT NULL default  », `itemnumber` varchar(50) default NULL, `os0` varchar(20) default NULL, `on0` varchar(50) default NULL, `os1` varchar(20) default NULL, `on1` varchar(50) default NULL, `quantity` char(3) NOT NULL default  », `invoice` varchar(255) NOT NULL default  », `custom` varchar(255) NOT NULL default  » ) TYPE=MyISAM;
  2.  
  3. # Table structure for table `paypal_subscription_info` #
  4.  
  5. CREATE TABLE `paypal_subscription_info` ( `subscr_id` varchar(255) NOT NULL DEFAULT  », `sub_event` varchar(50) NOT NULL DEFAULT  », `subscr_date` varchar(255) NOT NULL DEFAULT  », `subscr_effective` varchar(255) NOT NULL DEFAULT  », `period1` varchar(255) NOT NULL DEFAULT  », `period2` varchar(255) NOT NULL DEFAULT  », `period3` varchar(255) NOT NULL DEFAULT  », `amount1` varchar(255) NOT NULL DEFAULT  », `amount2` varchar(255) NOT NULL DEFAULT  », `amount3` varchar(255) NOT NULL DEFAULT  », `mc_amount1` varchar(255) NOT NULL DEFAULT  », `mc_amount2` varchar(255) NOT NULL DEFAULT  », `mc_amount3` varchar(255) NOT NULL DEFAULT  », `recurring` varchar(255) NOT NULL DEFAULT  », `reattempt` varchar(255) NOT NULL DEFAULT  », `retry_at` varchar(255) NOT NULL DEFAULT  », `recur_times` varchar(255) NOT NULL DEFAULT  », `username` varchar(255) NOT NULL DEFAULT  », `password` varchar(255) DEFAULT NULL, `payment_txn_id` varchar(50) NOT NULL DEFAULT  », `subscriber_emailaddress` varchar(255) NOT NULL DEFAULT  », `datecreation` date NOT NULL DEFAULT ‘0000-00-00′ ) TYPE=MyISAM;
  6.  
  7. # Table structure for table `paypal_payment_info` #
  8.  
  9. CREATE TABLE `paypal_payment_info` ( `firstname` varchar(100) NOT NULL DEFAULT  », `lastname` varchar(100) NOT NULL DEFAULT  », `buyer_email` varchar(100) NOT NULL DEFAULT  », `street` varchar(100) NOT NULL DEFAULT  », `city` varchar(50) NOT NULL DEFAULT  », `state` char(3) NOT NULL DEFAULT  », `zipcode` varchar(11) NOT NULL DEFAULT  », `memo` varchar(255) DEFAULT NULL, `itemname` varchar(255) DEFAULT NULL, `itemnumber` varchar(50) DEFAULT NULL, `os0` varchar(20) DEFAULT NULL, `on0` varchar(50) DEFAULT NULL, `os1` varchar(20) DEFAULT NULL, `on1` varchar(50) DEFAULT NULL, `quantity` char(3) DEFAULT NULL, `paymentdate` varchar(50) NOT NULL DEFAULT  », `paymenttype` varchar(10) NOT NULL DEFAULT  », `txnid` varchar(30) NOT NULL DEFAULT  », `mc_gross` varchar(6) NOT NULL DEFAULT  », `mc_fee` varchar(5) NOT NULL DEFAULT  », `paymentstatus` varchar(15) NOT NULL DEFAULT  », `pendingreason` varchar(10) DEFAULT NULL, `txntype` varchar(10) NOT NULL DEFAULT  », `tax` varchar(10) DEFAULT NULL, `mc_currency` varchar(5) NOT NULL DEFAULT  », `reasoncode` varchar(20) NOT NULL DEFAULT  », `custom` varchar(255) NOT NULL DEFAULT  », `country` varchar(20) NOT NULL DEFAULT  », `datecreation` date NOT NULL DEFAULT ‘0000-00-00′ ) TYPE=MyISAM;

et voici maintenant la structure de notre fichier

  1. $DB_Server = "localhost"; // Votre serveur de Base de donnée
  2.  
  3. $DB_Username = "toto"; //nom de l’utilisateur
  4.  
  5. $DB_Password = "pass"; // password
  6.  
  7. $DB_DBName = "nom_base"; // nom de la base
  8.  
  9. //create connection
  10.  
  11. $Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)
  12.  
  13. or die("Couldn’t connect to MySQL:
  14. " . mysql_error() . "
  15. " . mysql_errno());
  16.  
  17. //select database
  18.  
  19. $Db = @mysql_select_db($DB_DBName, $Connect)
  20.  
  21. or die("Couldn’t select database:
  22. " . mysql_error(). "
  23. " . mysql_errno());
  24.  
  25. $notify_email =  "votremailréel@mail.com";         // Email ou vous allez recevoir le résultat du
  26.  
  27. /////////////////////////////////////////////////
  28.  
  29. /////////////Begin Script below./////////////////
  30.  
  31. /////////////////////////////////////////////////
  32.  
  33. $paypal[‘serveur’] = ‘www..paypal.com’;      //mode test
  34.  
  35. //$paypal['serveur'] = ‘www.paypal.com';             A activer quand on passera en mode réel
  36.  
  37. // read the post from PayPal system and add ‘cmd’
  38.  
  39. $req = ‘cmd=_notify-validate’;
  40.  
  41. foreach ($_POST as $key => $value) {
  42.  
  43. $value = urlencode(stripslashes($value));
  44.  
  45. $req .= "&$key=$value";
  46.  
  47. }
  48.  
  49. // post back to PayPal system to validate
  50.  
  51. $header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
  52.  
  53. $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  54.  
  55. $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
  56.  
  57. $fp = fsockopen ($paypal[‘serveur’], 80, $errno, $errstr, 30);
  58.  
  59. // assign posted variables to local variables
  60.  
  61. $item_name = $_POST[‘item_name’];
  62.  
  63. $business = $_POST[‘business’];
  64.  
  65. $item_number = $_POST[‘item_number’];
  66.  
  67. $payment_status = $_POST[‘payment_status’];
  68.  
  69. $mc_gross = $_POST[‘mc_gross’];
  70.  
  71. $payment_currency = $_POST[‘mc_currency’];
  72.  
  73. $txn_id = $_POST[‘txn_id’];
  74.  
  75. $receiver_email = $_POST[‘receiver_email’];
  76.  
  77. $receiver_id = $_POST[‘receiver_id’];
  78.  
  79. $quantity = $_POST[‘quantity’];
  80.  
  81. $num_cart_items = $_POST[‘num_cart_items’];
  82.  
  83. $payment_date = $_POST[‘payment_date’];
  84.  
  85. $first_name = $_POST[‘first_name’];
  86.  
  87. $last_name = $_POST[‘last_name’];
  88.  
  89. $payment_type = $_POST[‘payment_type’];
  90.  
  91. $payment_status = $_POST[‘payment_status’];
  92.  
  93. $payment_gross = $_POST[‘payment_gross’];
  94.  
  95. $payment_fee = $_POST[‘payment_fee’];
  96.  
  97. $ = $_POST[‘settle_amount’];
  98.  
  99. $memo = $_POST[‘memo’];
  100.  
  101. $payer_email = $_POST[‘payer_email’];
  102.  
  103. $txn_type = $_POST[‘txn_type’];
  104.  
  105. $payer_status = $_POST[‘payer_status’];
  106.  
  107. $address_street = $_POST[‘address_street’];
  108.  
  109. $address_city = $_POST[‘address_city’];
  110.  
  111. $address_state = $_POST[‘address_state’];
  112.  
  113. $address_zip = $_POST[‘address_zip’];
  114.  
  115. $address_country = $_POST[‘address_country’];
  116.  
  117. $address_status = $_POST[‘address_status’];
  118.  
  119. $item_number = $_POST[‘item_number’];
  120.  
  121. $tax = $_POST[‘tax’];
  122.  
  123. $option_name1 = $_POST[‘option_name1′];
  124.  
  125. $option_selection1 = $_POST[‘option_selection1′];
  126.  
  127. $option_name2 = $_POST[‘option_name2′];
  128.  
  129. $option_selection2 = $_POST[‘option_selection2′];
  130.  
  131. $for_auction = $_POST[‘for_auction’];
  132.  
  133. $invoice = $_POST[‘invoice’];
  134.  
  135. $custom = $_POST[‘custom’];
  136.  
  137. $notify_version = $_POST[‘notify_version’];
  138.  
  139. $verify_sign = $_POST[‘verify_sign’];
  140.  
  141. $payer_business_name = $_POST[‘payer_business_name’];
  142.  
  143. $payer_id =$_POST[‘payer_id’];
  144.  
  145. $mc_currency = $_POST[‘mc_currency’];
  146.  
  147. $mc_fee = $_POST[‘mc_fee’];
  148.  
  149. $exchange_rate = $_POST[‘exchange_rate’];
  150.  
  151. $settle_currency  = $_POST[‘settle_currency’];
  152.  
  153. $parent_txn_id  = $_POST[‘parent_txn_id’];
  154.  
  155. $pending_reason = $_POST[‘pending_reason’];
  156.  
  157. $reason_code = $_POST[‘reason_code’];
  158.  
  159. // subscription specific vars
  160.  
  161. $subscr_id = $_POST[‘subscr_id’];
  162.  
  163. $subscr_date = $_POST[‘subscr_date’];
  164.  
  165. $subscr_effective  = $_POST[‘subscr_effective’];
  166.  
  167. $period1 = $_POST[‘period1′];
  168.  
  169. $period2 = $_POST[‘period2′];
  170.  
  171. $period3 = $_POST[‘period3′];
  172.  
  173. $amount1 = $_POST[‘amount1′];
  174.  
  175. $amount2 = $_POST[‘amount2′];
  176.  
  177. $amount3 = $_POST[‘amount3′];
  178.  
  179. $mc_amount1 = $_POST[‘mc_amount1′];
  180.  
  181. $mc_amount2 = $_POST[‘mc_amount2′];
  182.  
  183. $mc_amount3 = $_POST[‘mcamount3′];
  184.  
  185. $recurring = $_POST[‘recurring’];
  186.  
  187. $reattempt = $_POST[‘reattempt’];
  188.  
  189. $retry_at = $_POST[‘retry_at’];
  190.  
  191. $recur_times = $_POST[‘recur_times’];
  192.  
  193. $username = $_POST[‘username’];
  194.  
  195. $password = $_POST[‘password’];
  196.  
  197. //auction specific vars
  198.  
  199. $for_auction = $_POST[‘for_auction’];
  200.  
  201. $auction_closing_date  = $_POST[‘auction_closing_date’];
  202.  
  203. $auction_multi_item  = $_POST[‘auction_multi_item’];
  204.  
  205. $auction_buyer_id  = $_POST[‘auction_buyer_id’];
  206.  
  207. if (!$fp) {
  208.  
  209. // HTTP ERROR
  210.  
  211. } else {
  212.  
  213. fputs ($fp, $header . $req);
  214.  
  215. while (!feof($fp)) {
  216.  
  217. $res = fgets ($fp, 1024);
  218.  
  219. if (strcmp ($res, "VERIFIED") == 0) {
  220.  
  221. $fecha = date("m")."/".date("d")."/".date("Y");
  222.  
  223. $fecha = date("Y").date("m").date("d");
  224.  
  225. //check if transaction ID has been processed before
  226.  
  227. $checkquery = "select txnid from paypal_payment_info where txnid=’".$txn_id."’";
  228.  
  229. $sihay = mysql_query($checkquery) or die("Duplicate txn id check query failed:
  230. " . mysql_error() . "
  231. " . mysql_errno());
  232.  
  233. $nm = mysql_num_rows($sihay);
  234.  
  235. if ($nm == 0){
  236.  
  237. //execute query
  238.  
  239. if ($txn_type == "cart"){ //cas du panier (non évoqué dans ce tuto
  240.  
  241.     $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (‘".$payment_status."’,’".$payer_email."’,’".$first_name."’,’".$last_name."’,’".$address_street."’,’".$address_city."’,’".$address_state."’,’".$address_zip."’,’".$address_country."’,’".$mc_gross."’,’".$mc_fee."’,’".$memo."’,’".$payment_type."’,’".$payment_date."’,’".$txn_id."’,’".$pending_reason."’,’".$reason_code."’,’".$tax."’,’".$fecha."’,’".$custom."’)";
  242.  
  243. $result = mysql_query($strQuery) or die("Cart – paypal_payment_info, Query failed:
  244. " . mysql_error() . "
  245. " . mysql_errno());
  246.  
  247.      for ($i = 1; $i <= $num_cart_items; $i++) {
  248.  
  249.          $itemname = "item_name".$i;
  250.  
  251.          $itemnumber = "item_number".$i;
  252.  
  253.          $on0 = "option_name1_".$i;
  254.  
  255.          $os0 = "option_selection1_".$i;
  256.  
  257.          $on1 = "option_name2_".$i;
  258.  
  259.          $os1 = "option_selection2_".$i;
  260.  
  261.          $quantity = "quantity".$i;
  262.  
  263. $struery = "insert into paypal_cart_info(txnid,itemnumber,itemname,os0,on0,os1,on1,quantity,invoice,custom) values (‘".$txn_id."’,’".$_POST[$itemnumber]."’,’".$_POST[$itemname]."’,’".$_POST[$on0]."’,’".$_POST[$os0]."’,’".$_POST[$on1]."’,’".$_POST[$os1]."’,’".$_POST[$quantity]."’,’".$invoice."’,’".$custom."’)";
  264.  
  265.          $result = mysql_query($struery) or die("Cart – paypal_cart_info, Query failed:
  266. " . mysql_error() . "
  267. " . mysql_errno());
  268.  
  269. }
  270.  
  271.     }
  272.  
  273. else{  // notre cas celui du bouton à achat immédiat
  274.  
  275.      $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (‘".$payment_status."’,’".$payer_email."’,’".$first_name."’,’".$last_name."’,’".$address_street."’,’".$address_city."’,’".$address_state."’,’".$address_zip."’,’".$address_country."’,’".$mc_gross."’,’".$mc_fee."’,’".$item_number."’,’".$item_name."’,’".$option_name1."’,’".$option_selection1."’,’".$option_name2."’,’".$option_selection2."’,’".$quantity."’,’".$memo."’,’".$payment_type."’,’".$payment_date."’,’".$txn_id."’,’".$pending_reason."’,’".$reason_code."’,’".$tax."’,’".$fecha."’,’".$custom."’)";
  276.  
  277.      $result = mysql_query($strQuery) or die("Default – paypal_payment_info, Query failed:
  278. " . mysql_error() . "
  279. " . mysql_errno());
  280.  
  281.   // ajoute dans la table créer le récapitulatif du paiement paypal
  282.  
  283. // ensuite on réalise notre propre traitement  par exemple ajout de crédit à un utilisateur etc etc
  284.  
  285. //traitement propre à votre
  286. $tableau = explode("/",$custom);
  287.          $Member_ID=$tableau[0];
  288.          $Object_ID=$tableau[1];
  289.  
  290. requete sql etc
  291.   ….
  292.  
  293.   …
  294.  
  295.   …
  296.  
  297.   ….
  298.  
  299. }
  300.  
  301. // envoie un email de resultat
  302.  
  303.  echo "Verified";
  304.  
  305.      mail($notify_email, "VERIFIED ", "$res\n $req\n $strQuery\n $struery\n  $strQuery2","From: vente@votresite.com");
  306.  
  307. }
  308.  
  309. else {
  310.  
  311. // send an email
  312.  
  313. mail($notify_email, "", "$res\n $req \n $strQuery\n $struery\n  $strQuery2");
  314.  
  315. }
  316.  
  317. //subscription handling branch
  318.  
  319.     if ( $txn_type == "subscr_signup"  ||  $txn_type == "subscr_payment"  ) {
  320.  
  321. // insert subscriber payment info into paypal_payment_info table
  322.  
  323.       $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (‘".$payment_status."’,’".$payer_email."’,’".$first_name."’,’".$last_name."’,’".$address_street."’,’".$address_city."’,’".$address_state."’,’".$address_zip."’,’".$address_country."’,’".$mc_gross."’,’".$mc_fee."’,’".$memo."’,’".$payment_type."’,’".$payment_date."’,’".$txn_id."’,’".$pending_reason."’,’".$reason_code."’,’".$tax."’,’".$fecha."’,’".$custom."’)";
  324.  
  325.       $result = mysql_query($strQuery) or die("Subscription – paypal_payment_info, Query failed:
  326. " . mysql_error() . "
  327. " . mysql_errno());
  328.  
  329. // insert subscriber info into paypal_subscription_info table
  330.  
  331.         $strQuery2 = "insert into paypal_subscription_info(subscr_id , sub_event, subscr_date ,subscr_effective,period1,period2, period3, amount1 ,amount2 ,amount3,  mc_amount1,  mc_amount2,  mc_amount3, recurring, reattempt,retry_at, recur_times, username ,password, payment_txn_id, subscriber_emailaddress, datecreation) values (‘".$subscr_id."’, ‘".$txn_type."’,’".$subscr_date."’,’".$subscr_effective."’,’".$period1."’,’".$period2."’,’".$period3."’,’".$amount1."’,’".$amount2."’,’".$amount3."’,’".$mc_amount1."’,’".$mc_amount2."’,’".$mc_amount3."’,’".$recurring."’,’".$reattempt."’,’".$retry_at."’,’".$recur_times."’,’".$username."’,’".$password."’, ‘".$txn_id."’,’".$payer_email."’,’".$fecha."’)";
  332.  
  333.         $result = mysql_query($strQuery2) or die("Subscription – paypal_subscription_info, Query failed:
  334. " . mysql_error() . "
  335. " . mysql_errno());
  336.  
  337. mail($notify_email, "VERIFIED IPN", "$res\n $req\n $strQuery\n $struery\n  $strQuery2");
  338.  
  339. }
  340.  
  341. }
  342.  
  343. // si le paiement n’est pas valide
  344.  
  345. else if (strcmp ($res, "INVALID") == 0) {
  346.  
  347. // log for manual investigation
  348.  
  349. mail($notify_email, "INVALID IPN", "$res\n $req","From: vente@votresite.com");
  350.  
  351. }
  352.  
  353. }
  354.  
  355. fclose ($fp);
  356.  
  357. }
  358.  
  359. ?>

Une fois les test effectués en version virtuelle il ne vous restera plus qu’a modifier l’url www.sandbox.paypal.com présente dans les scripts par www.paypal.com et à donner votre vrai email paypal de vendeur

Dans une deuxième partie nous verrons comment crypter le bouton pour que les variables n’apparaissent pas dans le code source et pour éviter les fraudes

Si vous avez trouvez ce tutorial utile n’hésitez pas à laisser un commentaire ou à

40 réponses à “Tutorial Paypal : La récupération des données par IPN”

  1. joss dit :

    Hello

    Merci beaucoup pour le tuto.
    Qui clarifie encore plus ce que qu’avait déjà bien clarifié celui-ci :
    http://www.wikistuce.info/doku.php/articles/mise_en_place_d_un_paiement_paypal_sur_site_marchand?#%5B1%5D

    Ce qui m’interresse beaucoup, c’est justement le cryptage.
    Je reprend mon post sur le site évoqué plus haut (auquel Emile m’a répondu) :

    ——————
    « Je travaille sur la Sandbox. Comme tu le conseilles, j’obtiens certif et clé par le biais du site : http://www.stellarwebsolutions.com/certificates/stellar_cert_builder.php Et je télécharge le certif paypal sans oublier de copier le cert_id obtenu.

    bien.

    J’ai bien tout checké, dans mon certif perso, j’ai bien la même adresse email que celle du compte vendeur confirmé sur la Sandbox. Mais je tombe en permanence sur cette erreur lors du test :

    Nous ne sommes pas en mesure de traiter cette transaction en raison d’un problème concernant l’adresse email PayPal fournie par le vendeur. Veuillez contacter le vendeur afin de résoudre ce problème. Si ce paiement (…)

    Aurais-tu des indices de résolution concernant ce message d’erreur ?? J’ai tout bien respecté, et je dois passer en prod réelle le plus rapidement possible, je craque… (Note : j’avais installé openssl sur mon apache pour créer les clé et certif au nom de mon client, et je les garde sous le coude pour réaliser l’opération en réel dés que tout sera ok) »
    ——————

    Merci d’avance pour l’entraide
    joss

  2. zilog dit :

    Intéressant, vos explication vont me faire gagner du temps.

  3. zilog dit :

    Pouvez vous fournir le fichier contenant la structure de la table sql ?

    (Le copier/coller provoque une erreur au moment de la creation)

  4. hubi dit :

    pourriez vous m expliquer pourquoi nous avons besoin de nous connecter au serveur de paypal via fsockopen.
    on se connecte sur le serveur pour ouvrir un fichier ???
    on lit dans le fichier le resultat ?
    et en fonction du resultat ou mets a jour la base ?
    c ca ?
    je ne comprends pas trop la methode..
    merci pour vos explications.

  5. hubi dit :

    j ai fait quelques recherche .. je crois qu il faur renvoyer a paypal via fsockopen les post recu pour qu il verifie l exactitute
    des infos.
    c ca ?

  6. hubi dit :

    j ai créé un les comptes business et acheteur.

    j ai créé mon fichier NIP.PHP

    quand je simule un achat mon fichier php est bien appelé ….

    j ouvre la connection →$fp = fsockopen (‘www.sandbox.paypal.com’, 80, $errno, $errstr, 30);

    j envoie la requette : fputs ($fp, $header . $req);

    mai la reponse de paypal n est jamais validate…. j ai alors decide d enregister la reponse de paypal pour comprendre

    j ai enregsitre dans une base la reponse: $res —> $res = fgets ($fp, 1024);

    voila ce que j ai :

    HTTP/1.1 307 Temporary Redirect
    Server: NS8.0.45.4
    Location: https://www.sandbox.paypal.com/cgi-bin/webscr
    Content Type: text/html
    Cache Control: private
    Connection: close
    This object may be found here

    pourriez m expliquer pour quoi j ai cette reponse et pas un VALIDATE
    merci merci a celui qui pourra m aider

  7. stefkiller dit :

    Voici une citation d’un mec de PayPal qui date d’hier:

    Bonjour,

    Nous avons un probleme avec les IPNs Sandbox pour le moment.

    En fait, nos techniciens font des mises a jour pour que IPN passe par le port 80(sécurisé maintenant et cela n’est pas encore au point (pas de problemes a noter en production par contre pour le moment).

    Ce qu’il faut que vous fassiez est remplacer le port 80 par le port 443 ($fp = fsockopen (‘www.sandbox.paypal.com’, 443, $errno, $errstr, 30); et cela devrait fonctionner.

    Merci

    Cordialement,

    Florian

  8. didi dit :

    bonjour, j’ai le même problème qu’hubi.

    J’ai testé la soluce de stefkiller malheureusement ça ne fonctionne pas.

    Voici le résultat avec le port 443 :

    400 Bad Request

    Bad Request
    Your browser sent a request that this server co…
    Instead use the HTTPS scheme to access this URL, p…

    Hint: <a href= »https://www.sandbox.pay…

  9. didi dit :

    solution : mettre le protocole ssl avec l’adresse de sandbox
    $fp = fsockopen (’ssl://www.sandbox.paypal.com’, 443, $errno, $errstr, 30);

  10. Dagnan dit :

    Attention le & ligne 45 ne passe pas, il faut le remplacer par &

  11. Constantine dit :

    Bonjour,

    J’ai recopier le Script PHP pour mon IPN, creer la base de données. A un renvoi des informations par Sandbox de Paypal.
    Le payement se réalise bien, mais je reçois toujours :

    INVALID
    cmd=_notify-validate

    Quelqu’un aurait une idée du pourquoi ?

  12. fox7725 dit :

    J’ai le même problème que constantine, à l’aide svp

  13. Siren667 dit :

    Bonjour,
    Super tuto, merci :-)

    Pour Constantine et fox7725, j’ai rencontré le même problème que vous et après de multiples tests, j’ai testé la solution proposée plus tôt : remplacer le & ligne 45 et ça fonctionne.

    Attention aussi pendant vos tests si vous gardez toujours les même valeurs dans vos champs de formulaire, si votre compte marchand n’accepte pas la facturation multiple, la transaction ne sera valide qu’après validation du marchand dans son compte. Pour éviter celà, il faut modifier les préférences.

    Bonne journée

  14. ayanai dit :

    slt, ce tutorial est fè pr testé des compte paypal ou directemnt pr des paiement par carte bancaire ?

    de plus ma base de donné ne se rempli pa, meme kan j’arrive a simulé un paiement mè seulement par compte paypal, pourriez maidez svp, merci.

  15. jacksparo dit :

    kelk1 peu m’expliker prk il faut remplacer a ligne 45 le & par un & ki est le meme symbole? en faite par kel symbole doit on remplacer le & ligne 45? merci de m’aider svp

  16. Titeuf dit :

    Alors, j ‘ai moi aussi eu quelques difficultés à comprendre pourquoi en utilisant mes comptes de sandbox ma table ne se remplissait pas.
    Après recherche, il s’avère que la valeur présente dans « $res » est vide pour un paiement par CB. Donc pour inscrire dans la DB le résultat d’un paiement, il faut lever (virer) le test « if (strcmp ($res, « VERIFIED ») == 0)) { // » (vers la ligne 100 chez moi)

    Voilà pour ceux qui ça pourrait intéresser…

  17. Kyja dit :

    Bon je vous explique, je suis super nul pour tout ca mais je fais l’effort d’essayer comprendre.
    j’ai bien compris les 2 premieres parties mais pas la deniere.
    Je suis auteur/compositeur/interprete, je cherche désespérement a vendre ma musique via paypal sans passer par les sites spécialisés.
    Mon idéal serait un bouton paypal sur myspace, qui permette l’achat et le telechargement d’une chanson.J’ecume les forums et je ne trouve rien sur la partie telechargement du fichier mp3 a moins que je regarde mal. vous pouvez m’orienter ?

  18. Chuck dit :

    pour ceux qui savent pas quoi remplacer a la ligne 45 c’est « & amp ; » qui affiche le symbole &

  19. Chuck dit :

    bon j’ai tout implanter correctement, il me semble, mais je ne réussi pas a recevoir les résultats apres que le paiement aie passé dans paypal.. faut-il que mon fichier php qui recoit les données soit dans une forme quelqu’onque???

  20. donia dit :

    bonjour
    ça fait 3j que jje suis en train de créer un formulaire d’adhésion en ligne pour le site d’une asso et je galère comme une malade pour brancher le paiement paypal.
    n’ayant jamais réussi à faire marcher la sandbox (je crois que les développeurs qui passent par free ont en majorité ce pb), je testais en live, avec ma cb sur le compte paypal de mon mari.. seulement volià, par mesure de « sécurité », paypal bloque au bout de 10 tests.. bilan, je ne peux plus tester, j’ai le message « pour effectuer cette transaction vous devez créer un compte paypal ou utiliser une autre carte »… super pratique… je fais donc faire les transactions par un ami jusqu’à ce que lui aussi soit bloqué.. bref.
    en attendant : il réussi bien à payer par cb, et reçoit bien la confimation paypal pour son paiement (qu’on annule ensuite évidemment). coté ipn, on a bien mentionné un retour ipn sur le compte de mon mari et en plus, je lui passe la variable « notify_url » .
    j’ai voulu faire un module ipn tout simple:
    – si l’adhérent a bien réglé on lui envoie un mail confirmant son adhésion et on envoie à l’asso un mail avec les coordonnées de l’adhérent.
    et c’est là, qu’il ne se passe rien…
    je copicolle en dessous mon retour_ipn qui est peut-être trop simpliste? en même temps c’est pas un site marchand avec possibilité d’arnaque et tout ça..
    est-ce que vous voyez quelque chose qui cloche dans ce que j’ai fait?
    merci de votre aide
    donia qui galère….

    <?php
    session_start();

    $payment_status = $_POST['payment_status'];
    $date = $_POST['payment_date'];

    if($payment_status== »Completed ») {

    // paiement ok

    $mail=$_SESSION['mail'];

    /////////////////////////////////
    // envoi d’un mail à l’adhérent
    ////////////////////////////////

    $objet = « Votre adhésion à l\’AFPAEC »;
    $nomexp = « AFPAEC »;
    $adrexp = « afpaec@yahoo.fr »;
    $message=’
    Bonjour,
    Votre adhésion a l\’AFPAEC a bien été prise en compte. Nous vous remercions de votre confiance et votre soutien.
    Vous recevrez d\’ici quelques jours votre carte de membre qui sera valable un an à partir d\’aujourd\’hui.
    Cordialement.
    L\’équipe de l\’Association Française des Parents Adoptifs d\’Enfants de Chine (AFPAEC)
    http://afpaec.org

    ‘;
    $message = stripslashes($message); // traitement de la variable message pour virer les antislash
    $messageHTML = $message;
    $headers = »From: $nomexp ». » ». »\n »;
    $headers .= »Reply-To: $adrexp ». »\n »;
    $headers .=’Content-Type: text/html; charset= »iso-8859-1″‘. »\n »;
    $headers .=’Content-Transfer-Encoding: 8bit';
    mail($mail, $objet, $messageHTML, $headers)

    ////////////////////////////////
    // envoi d’un mail chez nous
    ////////////////////////////////
    $objet = « Adhésion AFPAEC »;
    $nomexp = « AFPAEC »;
    $adrexp = « afpaec@yahoo.fr »;
    $message=’
    nouvelle adhésion reçue:
    date paiement : ‘.$_POST['payment_date'].';
    nom : ‘.$_SESSION['nom'].’
    prenom : ‘.$_SESSION['prenom'].’
    adresse1 : ‘.$_SESSION['adresse1'].’
    adresse2 : ‘.$_SESSION['adresse2'].’
    ville : ‘.$_SESSION['ville'].’
    code postal : ‘.$_SESSION['codepostal'].’
    tel1 : ‘.$_SESSION['tel1'].’
    tel2 : ‘.$_SESSION['tel2'].’
    mail : ‘.$_SESSION['mail'].’
    typemembre : ‘.$_SESSION['typemembre'].’
    montantversement : ‘.$_SESSION['montantversement'].’
    Enfant de Chine : ‘.$_SESSION['enfantchine'].’
    NbChine : ‘.$_SESSION['nbenfant'].’
    adoption en cours : ‘.$_SESSION['encoursadoption'].’
    organisme : ‘.$_SESSION['organisme'].’
    date LID : ‘.$_SESSION['datedossier'].’
    donner coordonnees : ‘.$_SESSION['donnercoordonnees'].’
    donner fixe : ‘.$_SESSION['donnerfixe'].’
    donner portable : ‘.$_SESSION['donnerportable'].’
    donnermail : ‘.$_SESSION['donnermail'].’
    commentaire : ‘.$_SESSION['commentaire'].’

    ‘;
    $message = stripslashes($message); // traitement de la variable message pour virer les antislash
    $messageHTML = $message;
    $headers = »From: $nomexp ». » ». »\n »;
    $headers .= »Reply-To: $adrexp ». »\n »;
    $headers .=’Content-Type: text/html; charset= »iso-8859-1″‘. »\n »;
    $headers .=’Content-Transfer-Encoding: 8bit';
    mail($mail, $objet, $messageHTML, $headers)

    }

    else

    {

    // Paiement PAYPAL a échoué

    ////////////////////////////////
    // envoi d’un mail chez nous
    ////////////////////////////////
    $objet = « Adhésion AFPAEC ECHOUEE »;
    $nomexp = « AFPAEC »;
    $adrexp = « afpaec@yahoo.fr »;
    $message=’
    ————Adhésion échouée————–:
    date paiement : ‘.$_POST['payment_date'].';
    nom : ‘.$_SESSION['nom'].’
    prenom : ‘.$_SESSION['prenom'].’
    adresse1 : ‘.$_SESSION['adresse1'].’
    adresse2 : ‘.$_SESSION['adresse2'].’
    ville : ‘.$_SESSION['ville'].’
    code postal : ‘.$_SESSION['codepostal'].’
    tel1 : ‘.$_SESSION['tel1'].’
    tel2 : ‘.$_SESSION['tel2'].’
    mail : ‘.$_SESSION['mail'].’
    typemembre : ‘.$_SESSION['typemembre'].’
    montantversement : ‘.$_SESSION['montantversement'].’
    Enfant de Chine : ‘.$_SESSION['enfantchine'].’
    NbChine : ‘.$_SESSION['nbenfant'].’
    adoption en cours : ‘.$_SESSION['encoursadoption'].’
    organisme : ‘.$_SESSION['organisme'].’
    date LID : ‘.$_SESSION['datedossier'].’
    donner coordonnees : ‘.$_SESSION['donnercoordonnees'].’
    donner fixe : ‘.$_SESSION['donnerfixe'].’
    donner portable : ‘.$_SESSION['donnerportable'].’
    donnermail : ‘.$_SESSION['donnermail'].’
    commentaire : ‘.$_SESSION['commentaire'].’

    ‘;
    $message = stripslashes($message); // traitement de la variable message pour virer les antislash
    $messageHTML = $message;
    $headers = »From: $nomexp ». » ». »\n »;
    $headers .= »Reply-To: $adrexp ». »\n »;
    $headers .=’Content-Type: text/html; charset= »iso-8859-1″‘. »\n »;
    $headers .=’Content-Transfer-Encoding: 8bit';
    mail($mail, $objet, $messageHTML, $headers)

    }
    ?>

  21. jacksparo dit :

    kelk1 pourrai me laissé un exmple concrè pr utiliser la variable $custom, sinon si kelk1 a réussi a faire fonctionné le tuto, pourè t il me laissé son adresse mail. merci

  22. Chuck dit :

    @jacksparo :

    dans la variable custom tu mets ce que tu veux, exemple : l’ID de l’item vendu.

    Ce sera utile lorsque PayPal va te réenvoyer les infos de paiements, tu pourras déterminer ce qui a été acheté.

  23. pat dit :

    Merci pour le tuto, il éclaire déjà les choses.

    1) A ce jour (aout 2009) on peut déclarer les 3 url (de retour ok, de retour annulation et d’ipn) non pas en champ hidden mais depuis son vrai compte paypal. Qu’en est il pour les tests : sandbox prend les url déclarées en vrai ou bien il est obligatoire de les passer en champ hidden ?

    2) Si retour en ok ou annulation, A t’on préservation des variables de session ou bien faut il demander à l’internaute de se reconnecter pour savoir à qui on a affaire ?

    3) L’Ipn a t’il forcément été reçu avant cet éventuel retour de l’internaute ou bien est ce complètement désynchronisé ? Dans ce cas il faut lui dire de ré-essayer de se connecter dans 5 minutes le temps de savoir … (je vend un abonnement et mes clients sont pressés d’accéder à ce qu’ils ont payé, mais je veut pas me faire filouter).

    4) Dernier truc qui reste obscur pour moi : tu dis qu’avant de tester il faut se connecter à sandbox, mais avec quels identifiants, le compte de test, le compte de vendeur fictif, le compte d’acheteur fictif ?

    La doc de paypal est vraiment bordélique et le support totalement absent.

  24. titi dit :

    Bonjour

    Merci pour le tuto.
    Quelqu’un pourrait-il m’expliquer:
    1) PayPal indique de procéder à plusieurs vérifications avant d’honorer la commande :
    * Confirmez que la variable payment_status a pour valeur Terminé dans la mesure où les Notifications instantanées de paiement sont également envoyées pour d’autres résultats tels que En attente ou Echec.
    * Vérifiez que la variable txn_id n’est pas un doublon pour empêcher un fraudeur de réutiliser une ancienne transaction terminée.
    * Validez la variable « receiver_email » comme étant l’adresse email inscrite sur votre compte PayPal, pour éviter l’envoi du paiement sur le compte d’un fraudeur.
    * Vérifiez d’autres détails de la transaction comme le numéro et le prix de l’objet pour confirmer que le prix n’a pas changé.

    Une fois que vous avez procédé aux vérifications ci-dessus, vous pouvez mettre à jour votre base de données avec les données IPN et traiter l’achat.

    A quel niveau du script doit-on faire ces tests? Quelqu’un les a t’il écrit?

    2) A quoi sert dans le script les instructions suivantes? C’est pour gérer quoi?

    #
    //subscription handling branch
    #

    #
    if ( $txn_type == « subscr_signup » || $txn_type == « subscr_payment » ) {
    #

    #
    // insert subscriber payment info into paypal_payment_info table
    #

    #
    $strQuery = « insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (’ ».$payment_status. »’,' ».$payer_email. »’,' ».$first_name. »’,' ».$last_name. »’,' ».$address_street. »’,' ».$address_city. »’,' ».$address_state. »’,' ».$address_zip. »’,' ».$address_country. »’,' ».$mc_gross. »’,' ».$mc_fee. »’,' ».$memo. »’,' ».$payment_type. »’,' ».$payment_date. »’,' ».$txn_id. »’,' ».$pending_reason. »’,' ».$reason_code. »’,' ».$tax. »’,' ».$fecha. »’,' ».$custom. »’) »;
    #

    #
    $result = mysql_query($strQuery) or die(« Subscription – paypal_payment_info, Query failed:
    #
     » . mysql_error() .  »
    #
     » . mysql_errno());
    #

    #
    // insert subscriber info into paypal_subscription_info table
    #

    #
    $strQuery2 = « insert into paypal_subscription_info(subscr_id , sub_event, subscr_date ,subscr_effective,period1,period2, period3, amount1 ,amount2 ,amount3, mc_amount1, mc_amount2, mc_amount3, recurring, reattempt,retry_at, recur_times, username ,password, payment_txn_id, subscriber_emailaddress, datecreation) values (’ ».$subscr_id. »’, ‘ ».$txn_type. »’,' ».$subscr_date. »’,' ».$subscr_effective. »’,' ».$period1. »’,' ».$period2. »’,' ».$period3. »’,' ».$amount1. »’,' ».$amount2. »’,' ».$amount3. »’,' ».$mc_amount1. »’,' ».$mc_amount2. »’,' ».$mc_amount3. »’,' ».$recurring. »’,' ».$reattempt. »’,' ».$retry_at. »’,' ».$recur_times. »’,' ».$username. »’,' ».$password. »’, ‘ ».$txn_id. »’,' ».$payer_email. »’,' ».$fecha. »’) »;
    #

    #
    $result = mysql_query($strQuery2) or die(« Subscription – paypal_subscription_info, Query failed:
    #
     » . mysql_error() .  »
    #
     » . mysql_errno());
    #

    #
    mail($notify_email, « VERIFIED IPN », « $res\n $req\n $strQuery\n $struery\n $strQuery2″);

    Merci.
    Titi

  25. anonymous dit :

    vive les injections sql…

    le script est pas du tout sécurisé ! c’est une horreur !

  26. anonymous2 dit :

    que proposes-tu pour le sécuriser

  27. alain732 dit :

    Bonjour à toi,

    J’ai bien mis ton code, fait les fichiers, mais, lors de la transaction, cela me prends bien en compte dans paypal, mais rien de se met dans SQL…

    Merci pour votre aide…

  28. Andry dit :

    Bjr à tous.

    J’aimerais afficher dans la première page du paiement par paypal les détails du panier et non le total seulement.

    Je ne sais pas comment procéder.

    Merci pour votre aide.

  29. Kurosaki dit :

    Bonjour, j’ai bien aimé ton Tuto, d’ailleur c’est trés rare d’en trouver un aussi claire !! Bravo

    Voici t’es deux fichiers simplifié via PHP

    item.php

    > DEMMARRAGE D’UNE SESSION
    session_start();

    ####################################################################
    ## A MODIFIER ##
    ####################################################################

    $situation_de_test = « OUI »; // OUI ou NON
    $montant = « 29.99 »; // Pas de virgule juste un point !!
    $cycle = « 1 »; // quantité
    $unite_cycle = « M »; // D (jours), W (semaines), M (mois), Y (ans)
    $nom_produit = « VOTRE_SITE_INTERNET pendant 1 Mois »;
    $code_produit = « 1M »;
    $taxe = « 0.00 »; // 0 -> Pas de taxe ( par exemple la TVA )

    ####################################################################
    ## PARAMETRES GENERALES ##
    ####################################################################

    $monaie = « EUR »;
    $frais_de_port = « 0.00 »; // 0 -> Pas de frais de port
    $avis = « 0 »; // 0 ou 1 -> Demander l’avis des clients
    $id_acheteur = $_SESSION['espace_membre']; // Identifiant du client ( identifiant paypal ou VOTRE_SITE_INTERNET ? …je sais pas…)
    $bouton = « _xclick-subscriptions »; // Type de bouton ( dans ce cas c’est un abonnement)
    $langue = « FR »;

    $page_paiement_accepte = « http://www.VOTRE_SITE_INTERNET.com/paypal-3/finpaiement.php »; // Si le paiement est accepté
    $page_paiement_annule = « http://www.VOTRE_SITE_INTERNET.com/paypal-3/annuler.php »; // Si le paiement n’est pas accepté

    ####################################################################
    ## TEST / REEL ##
    ####################################################################

    $page_ipn_test = « http://www.VOTRE_SITE_INTERNET.com/paypal-3/notify.php »; // Page appelé par l’IPN test de sécurité
    $page_ipn_reel = « http://www.VOTRE_SITE_INTERNET.com/paypal-3/notify_reel.php »; // Page appelé par l’IPN test de sécurité

    $compteacrediter_test = « b_1264940525_biz@VOTRE_SITE_INTERNET.com »; // Adresse e-mail du compte à créditer en cas de test
    $compteacrediter_reel = « service.client@VOTRE_SITE_INTERNET.com »; // Adresse e-mail du compte à créditer en cas réel

    ####################################################################
    ## A PARTIR D’ICI, NE PAS MODIFIER ##
    ####################################################################

    if($situation_de_test == « OUI »)
    {
    echo »;
    $compteacrediter = $compteacrediter_test;
    $page_ipn = $page_ipn_test;
    }
    else
    {
    echo »;
    $compteacrediter = $compteacrediter_reel;
    $page_ipn = $page_ipn_reel;
    }

    //–>> ABONNEMENT

    echo »;
    echo »;
    echo »;

    //–>> MONTANT – MONAIE – FRAIS DE PORT – TAXE

    echo »;
    echo »;
    echo »;

    //–>> PAGES DE RETOUR

    echo »;
    echo »;
    echo »;

    //–>> TYPE DE BOUTON

    echo »;

    //–>> ADRESSE E-MAIL DU COMPTE A CREDITER

    echo »;

    //–>> NOM DU PROFUIT

    echo »;

    //–>> AVIS DES CLIENTS

    echo »;

    //–>> LANGUE
    echo »;

    //–>> IDNETIFIANT DU MEMBRE
    echo »;

    //–>> LE BOUTON

    echo »;

    //–>> FIN DU FORMULAIRE

    echo »;

    ?>

    notify.php

    > DEMMARRAGE D’UNE SESSION
    session_start();

    //–>> INCLUDE
    include(‘../mysql.php’);

    ####################################################################
    ## A MODIFIER ##
    ####################################################################

    $situation_de_test = « OUI »; // OUI ou NON

    ####################################################################
    ## TEST / REEL ##
    ####################################################################

    $compteacrediter_test = « b_1264940525_biz@VOTRE_SITE_INTERNET.com »; // Adresse e-mail du compte à créditer en cas de test
    $compteacrediter_reel = « service.client@VOTRE_SITE_INTERNET.com »; // Adresse e-mail du compte à créditer en cas réel

    ####################################################################
    ## NE PAS MODIFIER CETTE PARTIE ##
    ####################################################################

    if($situation_de_test == « OUI »)
    {
    $notify_email = $compteacrediter_test;
    $paypal['serveur'] = ‘www.sandbox.paypal.com';
    }
    else
    {
    $notify_email = $compteacrediter_reel;
    $paypal['serveur'] = ‘www.paypal.com';
    }

    ####################################################################
    ## RECEPTION ##
    ####################################################################

    $recep_item_name = $_POST['item_name']; // Nom du produit
    $recep_custom = $_POST['custom']; // ID Acheteur
    $recep_a3 = $_POST['a3']; // Montant de la transaction
    $recep_p3 = $_POST['p3']; // Quantitié de la durée de l’abonnement
    $recep_t3 = $_POST['t3']; // Unité de la durée de l’abonnemen
    $recep_currency_code = $_POST['currency_code']; // Type de Monaie
    $recep_shipping = $_POST['shipping']; // Frais de port
    $recep_tax = $_POST['tax']; // Taxes
    $recep_cmd = $_POST['cmd']; // Type de transaction
    $recep_business = $_POST['business']; // Compte à créditer
    $recep_no_note = $_POST['no_note']; // Avis des clients
    $recep_lc = $_POST['lc']; // Langue

    ####################################################################
    ## VALEURS CORRECTES ##
    ####################################################################

    $verif_item_name = « VOTRE_SITE_INTERNET pendant 1 Mois »; // Nom du produit
    $verif_custom = $_SESSION['espace_membre']; // ID Acheteur
    $verif_a3 = « 29.99 »; // Montant de la transaction
    $verif_p3 = « 1 »; // Quantitié de la durée de l’abonnement
    $verif_t3 = « M »; // Unité de la durée de l’abonnemen
    $verif_currency_code = « EUR »; // Type de Monaie
    $verif_shipping = « 0.00 »; // Frais de port
    $verif_tax = « 0.00 »; // Taxes
    $verif_cmd = « _xclick-subscriptions »; // Type de transaction
    $verif_business = $notify_email; // Compte à créditer
    $verif_no_note = « 0 »; // Avis des clients
    $verif_lc = « FR »; // Langue

    ####################################################################
    ## A PARTIR D’ICI, NE PAS MODIFIER ##
    ####################################################################

    $req = ‘cmd=_notify-validate';

    foreach ($_POST as $key => $value)
    {
    $value = urlencode(stripslashes($value));
    $req .= « &$key=$value »;
    }

    $header = « POST /cgi-bin/webscr HTTP/1.0\r\n »;
    $header .= « Content-Type: application/x-www-form-urlencoded\r\n »;
    $header .= « Content-Length:  » . strlen($req) . « \r\n\r\n »;
    $fp = fsockopen ($paypal['serveur'], 80, $errno, $errstr, 30);

    //–>> TRAITEMENT DES DONNEES

    if (!$fp)
    {
    // Erreur HTTP
    }
    else
    {
    fputs ($fp, $header . $req);

    while (!feof($fp))
    {
    $res = fgets ($fp, 1024);

    if (strcmp ($res, « VERIFIED ») == 0)
    {
    $fecha = date(« m »). »/ ».date(« d »). »/ ».date(« Y »);
    $fecha = date(« Y »).date(« m »).date(« d »);

    // Vérifier si l’ID de transaction a été traitée avant

    $checkquery = « select txnid from paypal_payment_info where txnid=' ».$txn_id. »‘ »;

    $sihay = mysql_query($checkquery) or die(« Duplicate txn id check query failed:
     » . mysql_error() .  »
     » . mysql_errno());

    $nm = mysql_num_rows($sihay);

    if ($nm == 0)
    {
    // Exécution de la requête

    if ($txn_type == « cart »)
    {
    // Cas du panier ( pas notre cas )
    }
    else
    {
    // Notre cas celui du bouton à achat immédiat ou abonnement

    $strQuery = « insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (‘ ».$payment_status. »‘,' ».$payer_email. »‘,' ».$first_name. »‘,' ».$last_name. »‘,' ».$address_street. »‘,' ».$address_city. »‘,' ».$address_state. »‘,' ».$address_zip. »‘,' ».$address_country. »‘,' ».$mc_gross. »‘,' ».$mc_fee. »‘,' ».$item_number. »‘,' ».$item_name. »‘,' ».$option_name1. »‘,' ».$option_selection1. »‘,' ».$option_name2. »‘,' ».$option_selection2. »‘,' ».$quantity. »‘,' ».$memo. »‘,' ».$payment_type. »‘,' ».$payment_date. »‘,' ».$txn_id. »‘,' ».$pending_reason. »‘,' ».$reason_code. »‘,' ».$tax. »‘,' ».$fecha. »‘,' ».$custom. »‘) »;

    $result = mysql_query($strQuery) or die(« Default – paypal_payment_info, Query failed:
     » . mysql_error() .  »
     » . mysql_errno());

    // Ajoute dans la table créer le récapitulatif du paiement paypal

    // Ensuite on réalise notre propre traitement par exemple ajout de crédit à un utilisateur etc etc

    // Traitement propre à votre site

    $tableau = explode(« / »,$custom);
    $Member_ID=$tableau[0];
    $Object_ID=$tableau[1];

    // Requete sql etc …
    }

    // Envoie un email de resultat

    echo « Verified »;

    mail($notify_email, « VERIFIED IPN », « $res\n $req\n $strQuery\n $struery\n $strQuery2″, »From: vente@votresite.com« );

    }
    else
    {
    mail($notify_email, « VERIFIED DUPLICATED TRANSACTION », « $res\n $req \n $strQuery\n $struery\n $strQuery2″); // send an email
    }
    if($txn_type == « subscr_signup » || $txn_type == « subscr_payment ») //subscription handling branch
    {
    // Insert subscriber payment info into paypal_payment_info table

    $strQuery = « insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation,custom) values (‘ ».$payment_status. »‘,' ».$payer_email. »‘,' ».$first_name. »‘,' ».$last_name. »‘,' ».$address_street. »‘,' ».$address_city. »‘,' ».$address_state. »‘,' ».$address_zip. »‘,' ».$address_country. »‘,' ».$mc_gross. »‘,' ».$mc_fee. »‘,' ».$memo. »‘,' ».$payment_type. »‘,' ».$payment_date. »‘,' ».$txn_id. »‘,' ».$pending_reason. »‘,' ».$reason_code. »‘,' ».$tax. »‘,' ».$fecha. »‘,' ».$custom. »‘) »;

    $result = mysql_query($strQuery) or die(« Subscription – paypal_payment_info, Query failed:
     » . mysql_error() .  »
     » . mysql_errno());

    // Insert subscriber info into paypal_subscription_info table

    $strQuery2 = « insert into paypal_subscription_info(subscr_id , sub_event, subscr_date ,subscr_effective,period1,period2, period3, amount1 ,amount2 ,amount3, mc_amount1, mc_amount2, mc_amount3, recurring, reattempt,retry_at, recur_times, username ,password, payment_txn_id, subscriber_emailaddress, datecreation) values (‘ ».$subscr_id. »‘, ‘ ».$txn_type. »‘,' ».$subscr_date. »‘,' ».$subscr_effective. »‘,' ».$period1. »‘,' ».$period2. »‘,' ».$period3. »‘,' ».$amount1. »‘,' ».$amount2. »‘,' ».$amount3. »‘,' ».$mc_amount1. »‘,' ».$mc_amount2. »‘,' ».$mc_amount3. »‘,' ».$recurring. »‘,' ».$reattempt. »‘,' ».$retry_at. »‘,' ».$recur_times. »‘,' ».$username. »‘,' ».$password. »‘, ‘ ».$txn_id. »‘,' ».$payer_email. »‘,' ».$fecha. »‘) »;

    $result = mysql_query($strQuery2) or die(« Subscription – paypal_subscription_info, Query failed:
     » . mysql_error() .  »
     » . mysql_errno());

    mail($notify_email, « VERIFIED IPN », « $res\n $req\n $strQuery\n $struery\n $strQuery2″);
    }
    }
    else if (strcmp ($res, « INVALID ») == 0) // Si le paiement n’est pas valide
    {
    mail($notify_email, « INVALID IPN », « $res\n $req », »From: vente@votresite.com« ); // Log for manual investigation
    }
    }

    fclose ($fp);
    }

    ?>

    Bien Entendu je l’est personnalisé ^^

    Grâce à PHP on peut passer de condition de TEST à condition REEL simplement en mettant OUI ou NON

  30. Kurosaki dit :

    HA, tout n’est pas passé, bon pas grave je vais le mettre prochainement sur : http://www.france.webmaster.free.fr, Encore une fois Bravo à toi !!

  31. hedon dit :

    Je me suis bien pris la tête avec la doc paypal avant de tomber sur ce tuto qui a le mérite d’être clair.
    Je teste mon formulaire avec sandbox
    je reçois bien le POST avec toutes les infos mais pas de fichier $fp
    c’est-à-dire que je nourri base mysql avant le test if($fp), sinon, je n’ai rien.
    Est-ce particulier à sandbox (depuis Free) ???

  32. cuisto44000 dit :

    bonjour, j’ai fait un copier collé de ce code, en changeant le mail et enlevé le sandbox .
    Le probleme est que rien ne se rentre dans la base de données, et je recois le mail « invalid » alors que la transaction est bien validée sur mon compte paypal ….

    Je crois que décidement je n’y arriverais pas à faire le test de savoir si le paiement est bien effectué ou non …

    Si quelqu’un a une solution, merci de nous le marquer ici car apriori on est très nombreux a avoir ce genre de problemes .

    Je ne comprends pas que paypal ne propose pas quelque chose de précis concernant cela, c’est quand meme essentiel de faire le test si le paiement est validé, alors on traite le contenu, sinon, l’acces est refusé …

    Merci par avance pour l’aide ;)

  33. hervé dit :

    Ce script ne fonctionne pas !

  34. Nico dit :

    Attention! Ce script est truffé de failles de sécurité!
    Primo, il faut utiliser stripslashes() sur les variables POST.
    Deuxio, il faut utiliser mysql_real_escape_string() avant mysql_query.

  35. emile dit :

    ce script date effectivement

    peut être peut tu poster ici ta contribution de manière à en faire profiter tous le monde

    merci

  36. Fred dit :

    Bonjour,
    j’aimerai savoir si il est possible de récupérer automatiqueent via getresponse l’ adresse email de l’acheteur une fois que celui-ci est réglé avec Paypal

  37. Lunacie dit :

    Merci beaucoup.
    Tout est expliqué tellement clairement.
    Maintenant, il me reste juste à modifier ce bouton pour en faire un vrai.
    Tout marche à merveille, je ne sais pas comment vous remercier…
    Enfin si je sais ! Je n’hésiterai pas à faire une donation grace au bouton que vous avez mis en place dés que mon site enregistrera ses premières ventes.
    Vous n’imaginez pas à quel point je vous suis reconnaissante.
    Merci, milles fois merci.

  38. SagittariuS dit :

    Publiez, au moins, un sql de création de table, un temps soit peu, propre, tout de même!
    Erreur sur erreur genre paquet trouvé qu’on pose comme ça!

    — ——————————————————–


    — Structure de la table `paypal_cart_info`

    CREATE TABLE IF NOT EXISTS `paypal_cart_info` (
    `txnid` varchar(30) NOT NULL,
    `itemname` varchar(255) NOT NULL,
    `itemnumber` varchar(50) DEFAULT NULL,
    `os0` varchar(20) DEFAULT NULL,
    `on0` varchar(50) DEFAULT NULL,
    `os1` varchar(20) DEFAULT NULL,
    `on1` varchar(50) DEFAULT NULL,
    `quantity` char(3) NOT NULL,
    `invoice` varchar(255) NOT NULL,
    `custom` varchar(255) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    — ——————————————————–


    — Structure de la table `paypal_payment_info`

    CREATE TABLE IF NOT EXISTS `paypal_payment_info` (
    `firstname` varchar(100) NOT NULL,
    `lastname` varchar(100) NOT NULL,
    `buyer_email` varchar(100) NOT NULL,
    `street` varchar(100) NOT NULL,
    `city` varchar(50) NOT NULL,
    `state` char(3) NOT NULL,
    `zipcode` varchar(11) NOT NULL,
    `memo` varchar(255) DEFAULT NULL,
    `itemname` varchar(255) DEFAULT NULL,
    `itemnumber` varchar(50) DEFAULT NULL,
    `os0` varchar(20) DEFAULT NULL,
    `on0` varchar(50) DEFAULT NULL,
    `os1` varchar(20) DEFAULT NULL,
    `on1` varchar(50) DEFAULT NULL,
    `quantity` char(3) DEFAULT NULL,
    `paymentdate` varchar(50) NOT NULL,
    `paymenttype` varchar(10) NOT NULL,
    `txnid` varchar(30) NOT NULL,
    `mc_gross` varchar(6) NOT NULL,
    `mc_fee` varchar(5) NOT NULL,
    `paymentstatus` varchar(15) NOT NULL,
    `pendingreason` varchar(10) DEFAULT NULL,
    `txntype` varchar(10) NOT NULL,
    `tax` varchar(10) DEFAULT NULL,
    `mc_currency` varchar(5) NOT NULL,
    `reasoncode` varchar(20) NOT NULL,
    `custom` varchar(255) NOT NULL,
    `country` varchar(20) NOT NULL,
    `datecreation` date NOT NULL DEFAULT ‘0000-00-00′
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    — ——————————————————–


    — Structure de la table `paypal_subscription_info`

    CREATE TABLE IF NOT EXISTS `paypal_subscription_info` (
    `subscr_id` varchar(255) NOT NULL,
    `sub_event` varchar(50) NOT NULL,
    `subscr_date` varchar(255) NOT NULL,
    `subscr_effective` varchar(255) NOT NULL,
    `period1` varchar(255) NOT NULL,
    `period2` varchar(255) NOT NULL,
    `period3` varchar(255) NOT NULL,
    `amount1` varchar(255) NOT NULL,
    `amount2` varchar(255) NOT NULL,
    `amount3` varchar(255) NOT NULL,
    `mc_amount1` varchar(255) NOT NULL,
    `mc_amount2` varchar(255) NOT NULL,
    `mc_amount3` varchar(255) NOT NULL,
    `recurring` varchar(255) NOT NULL,
    `reattempt` varchar(255) NOT NULL,
    `retry_at` varchar(255) NOT NULL,
    `recur_times` varchar(255) NOT NULL,
    `username` varchar(255) NOT NULL,
    `password` varchar(255) DEFAULT NULL,
    `payment_txn_id` varchar(50) NOT NULL,
    `subscriber_emailaddress` varchar(255) NOT NULL,
    `datecreation` date NOT NULL DEFAULT ‘0000-00-00′
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

  39. Johne475 dit :

    I have recently started a web site, the info you provide on this site has helped me greatly. Thank you for all of your time &amp work. There can be no real freedom without the freedom to fail. by Erich Fromm. gegeddeddecc

Laisser un commentaire

Mots clés

Vidéo

Mentions légales

Entreprise individuelle depuis janvier 2008, EPI vous propose des solutions Internet adaptées à vos besoins.

Entreprise EPI
Fijaguet
12340 RODELLE
Siret : 50183306500011

Twitter

    Partenaires