PayPal
Éditez le fichier paypal.inc dans le dossier includes.
paypal.inc
- global $paypal_context, $paypal_url, $paypal_api_url, $paypal_api_version;
- $paypal_context = 'sandbox'; // 'sandbox' or 'live'
- if ($paypal_context == 'sandbox') {
- $paypal_api_url = 'https://api-3t.sandbox.paypal.com/nvp';
- $paypal_url = 'https://www.sandbox.paypal.com';
- }
- else {
- $paypal_api_url = 'https://api-3t.paypal.com/nvp';
- $paypal_url = 'https://www.paypal.com';
- }
- $paypal_api_version='124';
- global $paypal_username, $paypal_password, $paypal_signature;
- if ($paypal_context == 'sandbox') {
- $paypal_username = false;
- $paypal_password = false;
- $paypal_signature = false;
- }
- else {
- $paypal_username = false;
- $paypal_password = false;
- $paypal_signature = false;
- }
- global $paypal_log;
- $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 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 . 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
- require_once 'paypal.php';
- require_once 'userisidentified.php';
- require_once 'userprofile.php';
- 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
.
- 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.
- 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.
- if (!user_is_identified()) {
- return run('error/unauthorized', $lang);
- }
Vérifie que l'utilisateur est identifié.
- if (!(is_numeric($amount) and $amount > 0)) {
- return run('error/badrequest', $lang);
- }
- $amt=paypal_amt($amount);
Vérifie le paramètre $amount
et le formate pour l'interface Paypal.
- if (!validate_currency($currency)) {
- return run('error/badrequest', $lang);
- }
- $currencycode=$currency;
Vérifie le paramètre $currency
et le formate pour l'interface Paypal.
- if (!(is_numeric($tax) and $tax >= 0)) {
- return run('error/badrequest', $lang);
- }
- $taxamt=paypal_amt($tax);
Vérifie le paramètre $tax
et le formate pour l'interface Paypal.
- $itemamt=paypal_amt($amount-$tax);
Calcule et formate le prix total hors taxe.
- $name=translate('donate:name', $lang);
- $locale = $lang;
- if (!$locale) {
- $locale=user_profile('locale');
- }
- if (!$locale) {
- $locale=$supported_languages[0];
- }
- $localecode=paypal_localecode($locale);
- $email=user_profile('mail');
- $brandname=$sitename;
- $hdrimg=$base_url . '/logos/sitelogo.png';
- $returnurl=$base_url . url('paypalreturn', $lang);
- $cancelurl=$base_url . url('paypalcancel', $lang);
- $params = array(
- 'LOCALECODE' => $localecode,
- 'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
- 'PAYMENTREQUEST_0_CURRENCYCODE' => $currencycode,
- 'PAYMENTREQUEST_0_AMT' => $amt,
- 'PAYMENTREQUEST_0_ITEMAMT' => $itemamt,
- 'PAYMENTREQUEST_0_TAXAMT' => $taxamt,
- 'L_PAYMENTREQUEST_0_NAME0' => $name,
- 'L_PAYMENTREQUEST_0_AMT0' => $itemamt,
- 'L_PAYMENTREQUEST_0_TAXAMT0' => $taxamt,
- 'L_PAYMENTREQUEST_0_QTY0' => '1',
- 'NOSHIPPING' => '1',
- 'EMAIL' => $email,
- 'BRANDNAME' => $sitename,
- 'HDRIMG' => $hdrimg,
- 'RETURNURL' => $returnurl,
- 'CANCELURL' => $cancelurl,
- );
Prépare les paramètres nécessaires à l'interface Paypal pour une requête de paiement immédiat.
- $r = paypal_setexpresscheckout($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
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é.
- $token = $r['TOKEN'];
Extrait la valeur du jeton donné à l'opération par Paypal.
- $_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.
- reload($paypal_url . '/webscr&cmd=_express-checkout&token=' . $token);
- }
Charge la page de paiement du site de Paypal dans le navigateur.
paypalreturn.php
- require_once 'paypal.php';
- function paypalreturn($lang, $arglist=false) {
- if (!isset($_SESSION['paypal'])) {
- return run('error/badrequest', $lang);
- }
- $token=$_SESSION['paypal']['token'];
- $amt=$_SESSION['paypal']['amt'];
- $itemamt=$_SESSION['paypal']['itemamt'];
- $taxamt=$_SESSION['paypal']['taxamt'];
- $currencycode=$_SESSION['paypal']['currencycode'];
- $context=$_SESSION['paypal']['context'];
- unset($_SESSION['paypal']);
- if (!isset($arglist['token']) or $arglist['token'] != $token) {
- return run('error/badrequest', $lang);
- }
- $params = array(
- 'TOKEN' => $token,
- );
- $r = paypal_getexpresscheckoutdetails($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
- 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) {
- return run('error/internalerror', $lang);
- }
- $payerid = $r['PAYERID'];
- $email = $r['EMAIL'];
- $params = array(
- 'TOKEN' => $token,
- 'PAYERID' => $payerid,
- 'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
- 'PAYMENTREQUEST_0_CURRENCYCODE' => $currencycode,
- 'PAYMENTREQUEST_0_AMT' => $amt,
- 'PAYMENTREQUEST_0_ITEMAMT' => $itemamt,
- 'PAYMENTREQUEST_0_TAXAMT' => $taxamt,
- );
- $r = paypal_doexpresscheckoutpayment($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
- if ($r['TOKEN'] != $token or $r['PAYMENTINFO_0_AMT'] != $amt or $r['PAYMENTINFO_0_TAXAMT'] != $taxamt or $r['PAYMENTINFO_0_CURRENCYCODE'] != $currencycode) {
- return run('error/internalerror', $lang);
- }
- $transactionid=$r['PAYMENTINFO_0_TRANSACTIONID'];
- $paymentstatus=strtoupper($r['PAYMENTINFO_0_PAYMENTSTATUS']);
- $completed=false;
- switch ($paymentstatus) {
- case 'COMPLETED':
- $feeamt=$r['PAYMENTINFO_0_FEEAMT'];
- $completed=true;
- break;
- case 'PENDING':
- $pendingreason=strtoupper($r['PAYMENTINFO_0_PENDINGREASON']);
- break;
- default:
- break;
- }
- if (!$completed) {
- require_once 'actions/paymentrejected.php';
- $output = paymentrejected($lang, $amt, $currencycode, $context);
- }
- else {
- require_once 'actions/paymentaccepted.php';
- $output = paymentaccepted($lang, $amt, $currencycode, $context);
- }
- return $output;
- }
paypalcancel.php
- function paypalcancel($lang, $arglist=false) {
- if (!isset($_SESSION['paypal'])) {
- return run('error/badrequest', $lang);
- }
- $token=$_SESSION['paypal']['token'];
- $amt=$_SESSION['paypal']['amt'];
- $currencycode=$_SESSION['paypal']['currencycode'];
- $context=$_SESSION['paypal']['context'];
- unset($_SESSION['paypal']);
- if (!isset($arglist['token']) or $arglist['token'] != $token) {
- return run('error/badrequest', $lang);
- }
- require_once 'actions/paymentcancelled.php';
- return paymentcancelled($lang, $amt, $currencycode, $context);
- }
Voir la documentation sur les fonctions qui interfacent le service Paypal définies dans paypal par la librarie.
Commentaires