2
20

PayPal

Éditez le fichier paypal.inc dans le dossier includes.

paypal.inc
  1. global $paypal_context, $paypal_url, $paypal_api_url, $paypal_api_version;
  2.  
  3. $paypal_context = 'sandbox';    // 'sandbox' or 'live'
  4.  
  5. if ($paypal_context == 'sandbox') {
  6.     $paypal_api_url = 'https://api-3t.sandbox.paypal.com/nvp';
  7.     $paypal_url = 'https://www.sandbox.paypal.com';
  8. }
  9. else {
  10.     $paypal_api_url = 'https://api-3t.paypal.com/nvp';
  11.     $paypal_url = 'https://www.paypal.com';
  12. }
  13.  
  14. $paypal_api_version='124';
  15.  
  16. global $paypal_username, $paypal_password, $paypal_signature;
  17.  
  18. if ($paypal_context == 'sandbox') {
  19.     $paypal_username = false;
  20.     $paypal_password = false;
  21.     $paypal_signature = false;
  22. }
  23. else {
  24.     $paypal_username = false;
  25.     $paypal_password = false;
  26.     $paypal_signature = false;
  27. }
  28.  
  29. global $paypal_log;
  30.  
  31. $paypal_log=true;

Initialisez $paypal_username, $paypal_password et $paypal_signature dans le cas où $paypal_context vaut 'sandbox' avec les valeurs définies dans la configuration de votre compte de développeur.

IMPORTANT : Assurez-vous que $paypal_context vaut 'sandbox'.

Test

Validez un paiement complet par le site à l'aide du formulaire de don. Allez à la page d'accueil du site. Si la page d'accueil n'affiche pas le bouton Faire un don dans la bannière, assurez-vous que l'action home construit le bloc banner en passant le paramètre donate à true. Vous pouvez aussi directement entrer l'URL /fr/donation dans la barre d'adresse du navigateur. En cas d'erreur, vérifiez que l'action donation est bien associée à une URL dans le fichier aliases.inc du dossier config.

Entrez un montant de 25 EUR et appuyez sur Faire un don. Le navigateur est redirigé sur la page de paiement de Paypal.

Commencez par annuler le paiement. Le site affiche la page qui confirme l'annulation d'un paiement.

Paiement annulé

Votre paiement de 25,00 EUR a été annulé. Si vous pensez qu'il s'agit d'une erreur, merci de nous contacter.

Recommencez l'opération cette fois en validant le paiement en utilisant votre compte test d'acheteur. Le site affiche la page qui confirme un paiement.

Paiement accepté

Votre paiement de 25,00 EUR a été accepté. Merci de votre confiance et de votre soutien.

Si un paiement est rejeté, le site affiche encore une autre page.

Paiement rejeté

Votre paiement de 25,00 EUR a été rejeté. Si vous pensez qu'il s'agit d'une erreur, merci de nous contacter.

Si vous avez mis le paramètre $paypal_log à true, affichez le contenu du journal des opérations dans le fichier du jour dans le dossier log/paypal.log.

2017-09-26 11:23:43 127.0.0.1	METHOD=SetExpressCheckout;ACK=SUCCESS;TOKEN=PP-8LW79843V0049193J

Pour basculer le site en mode production avec des paiements réels, initialisez $paypal_username, $paypal_password et $paypal_signature dans le cas où $paypal_context ne vaut pas 'sandbox' avec les valeurs définies dans la configuration de votre compte de marchand. Mettez le paramètre $paypal_context à 'live'.

Code
paypalcheckout.php
  1. require_once 'paypal.php';
  2. require_once 'userisidentified.php';
  3. require_once 'userprofile.php';
  4. require_once 'validatecurrency.php';

Charge le code des fonctions paypal_setexpresscheckout, paypal_amt et paypal_localecode qui interfacent Paypayl ainsi que le fichier de configuration paypal.inc. Charge le code des fonctions user_is_identified, user_profile et validate_currency.

  1. function paypalcheckout($lang, $amount, $currency, $tax=0, $context=false) {

La fonction paypalreturn a 5 paramètres : la langue, le montant total du paiement taxes comprises, la devise du paiement, le montant total des taxes et un tableau optionnel qui permet de conserver pendant tout le processus des détails sur le paiement tel qu'un numéro de produit, des informations pour la facturation, etc.

  1.     global $base_url, $paypal_url, $sitename, $supported_languages;

Accède à la variable globale $base_url qui contient l'URL du point d'entrée du site, à $paypal_url qui définiti l'URL qui sera utilisée pour appeler Paypal, $sitename qui sera passé en paramètre à Paypal et $supported_languages qui est utilisé pour choisir une langue par défaut pour la page de paiement de Paypal.

  1.     if (!user_is_identified()) {
  2.         return run('error/unauthorized', $lang);
  3.     }

Vérifie que l'utilisateur est identifié.

  1.     if (!(is_numeric($amount) and $amount > 0)) {
  2.         return run('error/badrequest', $lang);
  3.     }
  4.     $amt=paypal_amt($amount);

Vérifie le paramètre $amount et le formate pour l'interface Paypal.

  1.     if (!validate_currency($currency)) {
  2.         return run('error/badrequest', $lang);
  3.     }
  4.     $currencycode=$currency;

Vérifie le paramètre $currency et le formate pour l'interface Paypal.

  1.     if (!(is_numeric($tax) and $tax >= 0)) {
  2.         return run('error/badrequest', $lang);
  3.     }
  4.     $taxamt=paypal_amt($tax);

Vérifie le paramètre $tax et le formate pour l'interface Paypal.

  1.     $itemamt=paypal_amt($amount-$tax);

Calcule et formate le prix total hors taxe.

  1.     $name=translate('donate:name', $lang);
  2.  
  3.     $locale = $lang;
  4.     if (!$locale) {
  5.         $locale=user_profile('locale');
  6.     }
  7.     if (!$locale) {
  8.         $locale=$supported_languages[0];
  9.     }
  10.     $localecode=paypal_localecode($locale);
  11.  
  12.     $email=user_profile('mail');
  13.     $brandname=$sitename;
  14.     $hdrimg=$base_url . '/logos/sitelogo.png';
  15.  
  16.     $returnurl=$base_url . url('paypalreturn', $lang);
  17.     $cancelurl=$base_url . url('paypalcancel', $lang);
  18.  
  19.     $params = array(
  20.         'LOCALECODE'                        => $localecode,
  21.         'PAYMENTREQUEST_0_PAYMENTACTION'    => 'Sale',
  22.         'PAYMENTREQUEST_0_CURRENCYCODE'     => $currencycode,
  23.         'PAYMENTREQUEST_0_AMT'              => $amt,
  24.         'PAYMENTREQUEST_0_ITEMAMT'          => $itemamt,
  25.         'PAYMENTREQUEST_0_TAXAMT'           => $taxamt,
  26.         'L_PAYMENTREQUEST_0_NAME0'          => $name,
  27.         'L_PAYMENTREQUEST_0_AMT0'           => $itemamt,
  28.         'L_PAYMENTREQUEST_0_TAXAMT0'        => $taxamt,
  29.         'L_PAYMENTREQUEST_0_QTY0'           => '1',
  30.         'NOSHIPPING'                        => '1',
  31.         'EMAIL'                             => $email,
  32.         'BRANDNAME'                         => $sitename,
  33.         'HDRIMG'                            => $hdrimg,
  34.         'RETURNURL'                         => $returnurl,
  35.         'CANCELURL'                         => $cancelurl,
  36.         );

Prépare les paramètres nécessaires à l'interface Paypal pour une requête de paiement immédiat.

  1.     $r = paypal_setexpresscheckout($params);
  2.  
  3.     if (!$r) {
  4.         return run('error/internalerror', $lang);
  5.     }

Appelle la fonction paypal_setexpresscheckout qui envoie une requête sur le site de Paypal. Affiche la page signalant une erreur interne si l'opération a échoué.

  1.     $token = $r['TOKEN'];

Extrait la valeur du jeton donné à l'opération par Paypal.

  1.     $_SESSION['paypal'] = compact('token', 'amt', 'itemamt', 'taxamt', 'currencycode', 'context');

Enregistre dans la session le jeton fourni par Paypal ainsi que les paramètres du paiement.

  1.     reload($paypal_url . '/webscr&cmd=_express-checkout&token=' . $token);
  2. }

Charge la page de paiement du site de Paypal dans le navigateur.

paypalreturn.php
  1. require_once 'paypal.php';
  2.  
  3. function paypalreturn($lang, $arglist=false) {
  4.     if (!isset($_SESSION['paypal'])) {
  5.         return run('error/badrequest', $lang);
  6.     }
  7.  
  8.     $token=$_SESSION['paypal']['token'];
  9.  
  10.     $amt=$_SESSION['paypal']['amt'];
  11.     $itemamt=$_SESSION['paypal']['itemamt'];
  12.     $taxamt=$_SESSION['paypal']['taxamt'];
  13.     $currencycode=$_SESSION['paypal']['currencycode'];
  14.     $context=$_SESSION['paypal']['context'];
  15.  
  16.     unset($_SESSION['paypal']);
  17.  
  18.     if (!isset($arglist['token']) or $arglist['token'] != $token) {
  19.         return run('error/badrequest', $lang);
  20.     }
  21.  
  22.     $params = array(
  23.         'TOKEN'                             => $token,
  24.     );
  25.  
  26.     $r = paypal_getexpresscheckoutdetails($params);
  27.  
  28.     if (!$r) {
  29.         return run('error/internalerror', $lang);
  30.     }
  31.  
  32.     if ($r['TOKEN'] != $token or $r['PAYMENTREQUEST_0_AMT'] != $amt or $r['PAYMENTREQUEST_0_ITEMAMT'] != $itemamt or $r['PAYMENTREQUEST_0_TAXAMT'] != $taxamt or $r['PAYMENTREQUEST_0_CURRENCYCODE'] != $currencycode) {
  33.         return run('error/internalerror', $lang);
  34.     }
  35.  
  36.     $payerid = $r['PAYERID'];
  37.     $email = $r['EMAIL'];
  38.  
  39.     $params = array(
  40.         'TOKEN'                             => $token,
  41.         'PAYERID'                           => $payerid,
  42.         'PAYMENTREQUEST_0_PAYMENTACTION'    => 'Sale',
  43.         'PAYMENTREQUEST_0_CURRENCYCODE'     => $currencycode,
  44.         'PAYMENTREQUEST_0_AMT'              => $amt,
  45.         'PAYMENTREQUEST_0_ITEMAMT'          => $itemamt,
  46.         'PAYMENTREQUEST_0_TAXAMT'           => $taxamt,
  47.     );
  48.  
  49.     $r = paypal_doexpresscheckoutpayment($params);
  50.  
  51.     if (!$r) {
  52.         return run('error/internalerror', $lang);
  53.     }
  54.  
  55.     if ($r['TOKEN'] != $token or $r['PAYMENTINFO_0_AMT'] != $amt or $r['PAYMENTINFO_0_TAXAMT'] != $taxamt or $r['PAYMENTINFO_0_CURRENCYCODE'] != $currencycode) {
  56.         return run('error/internalerror', $lang);
  57.     }
  58.  
  59.     $transactionid=$r['PAYMENTINFO_0_TRANSACTIONID'];
  60.     $paymentstatus=strtoupper($r['PAYMENTINFO_0_PAYMENTSTATUS']);
  61.  
  62.     $completed=false;
  63.  
  64.     switch ($paymentstatus) {
  65.         case 'COMPLETED':
  66.             $feeamt=$r['PAYMENTINFO_0_FEEAMT'];
  67.             $completed=true;
  68.             break;
  69.         case 'PENDING':
  70.             $pendingreason=strtoupper($r['PAYMENTINFO_0_PENDINGREASON']);
  71.             break;
  72.         default:
  73.             break;
  74.     }
  75.  
  76.     if (!$completed) {
  77.         require_once 'actions/paymentrejected.php';
  78.  
  79.         $output = paymentrejected($lang, $amt, $currencycode, $context);
  80.     }
  81.     else {
  82.         require_once 'actions/paymentaccepted.php';
  83.  
  84.         $output = paymentaccepted($lang, $amt, $currencycode, $context);
  85.     }
  86.  
  87.     return $output;
  88. }
paypalcancel.php
  1. function paypalcancel($lang, $arglist=false) {
  2.     if (!isset($_SESSION['paypal'])) {
  3.         return run('error/badrequest', $lang);
  4.     }
  5.  
  6.     $token=$_SESSION['paypal']['token'];
  7.  
  8.     $amt=$_SESSION['paypal']['amt'];
  9.     $currencycode=$_SESSION['paypal']['currencycode'];
  10.     $context=$_SESSION['paypal']['context'];
  11.  
  12.     unset($_SESSION['paypal']);
  13.  
  14.     if (!isset($arglist['token']) or $arglist['token'] != $token) {
  15.         return run('error/badrequest', $lang);
  16.     }
  17.  
  18.     require_once 'actions/paymentcancelled.php';
  19.  
  20.     return paymentcancelled($lang, $amt, $currencycode, $context);
  21. }

Voir la documentation sur les fonctions qui interfacent le service Paypal définies dans paypal par la librarie.

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].