2
175

Payline

Installez les modules PHP php-curl, php-http et php-soap :

$ sudo apt install php-curl php-http php-soap

IMPORTANT : PHP 7 doit être compilé avec openssl. Pour PHP 5 :

$ sudo apt install php-openssl

Installez composer si nécessaire :

$ sudo apt install composer

Installez le SDK Payline à la racine du site :

$ composer require monext/payline-sdk

IMPORTANT : Créez le répertoire vendor/monext/payline-sdk/logs avec le droit d'écriture pour l'utilisateur ou le groupe www-data d'Apache.

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

payline.inc
  1. global $payline_context;
  2.  
  3. $payline_context='homo';    // 'homo' or 'prod'
  4.  
  5. global $payline_merchant_id, $payline_access_key, $payline_contract_number;
  6.  
  7. if ($payline_context == 'homo') {
  8.     $payline_merchant_id = false;
  9.     $payline_access_key = false;
  10.     $payline_contract_number = '1234567';
  11. }
  12. else {
  13.     $payline_merchant_id = false;
  14.     $payline_access_key = false;
  15.     $payline_contract_number = false;
  16. }
  17.  
  18. global $payline_proxy_host, $payline_proxy_port, $payline_proxy_login, $payline_proxy_password;
  19.  
  20. $payline_proxy_host=false;
  21. $payline_proxy_port=false;
  22. $payline_proxy_login=false;
  23. $payline_proxy_password=false;
  24.  
  25. global $payline_log;
  26.  
  27. $payline_log=true;

Initialisez $payline_merchant_id, $payline_access_key et $payline_contract_number dans le cas où $payline_context vaut 'homo' avec les valeurs définies dans la configuration de votre compte d'homologation.

IMPORTANT : Assurez-vous que $payline_context vaut 'homo'.

Créez un lien vers le fichier tests/testpayline.php dans le dossier racine du site :

$ ln tests/testpayline.php testpayline.php

Exécutez le test :

$ php -f testpayline.php
Array
(
    [result] => Array
        (
            [code] => 00000
            [shortMessage] => ACCEPTED
            [longMessage] => Transaction approved
        )

    [token] => 2p2wuRtuJicb6YZTj6071491346010891
    [redirectURL] => https://homologation-webpayment.payline.com/webpayment/step2.do?reqCode=prepareStep2&token=2p2wuRtuJicb6YZTj6071491346010891
)

Le programme affiche le résultat d'une requête WebPayment. En cas d'erreur ou si la requête renvoie un code différent de 00000 ACCEPTED, vérifiez la configuration de votre compte d'homologation et les paramètres du fichier payline.inc.

Si $payline_log vaut true, une ligne a été ajoutée à la fin du fichier log/payline.log :

2017-04-05 00:46:44 127.0.0.1	METHOD=WebPaymentRequest;CODE=00000;TOKEN=2p2wuRtuJicb6YZTj6071491346010891;MESSAGE=ACCEPTED:Transaction approved
Git

Supprimez le lien sur le fichier tests/testpayline.php dans la dossier racine du site :

$ rm testpayline.php

Éditez le fichier .gitignore à la racine du site et ajoutez la ligne suivante :

vendor

Le dossier vendor n'est pas inclus dans le dépôt.

Commettez cette version :

$ git add .gitignore composer.json composer.lock
$ git commit -m'Adds Payline SDK'
Test

Pour valider un paiement complet par le site, activez le formulaire de don en éditant les fichiers donate.php et donateme.php dans le dossier blocks :

donate.php
  1. require_once 'payline.inc';
  2.  
  3. function donate($lang) {
  4.     global $payline_merchant_id, $payline_access_key, $payline_contract_number;
  5.  
  6.     if (empty($payline_merchant_id) or empty($payline_access_key) or empty($payline_contract_number)) {
  7.         return false;
  8.     }

Le code standard est prêt pour Paypal. Modifiez juste le test sur la liste des paramètres de configuration pour Payline dans le bloc donate et remplacez l'appel à la fonction paypal_checkout par un appel à la fonction payline_checkout dans le bloc donateme.

donateme.php
  1.             require_once 'actions/paylinecheckout.php';
  2.  
  3.             paylinecheckout($lang, $amount, $currency);

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. NOTE : Changer l'aspect du bouton de paiement Payer n'est pas un problème.

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

IMPORTANT : Vérifiez que Payline indique bien que vous êtes dans un environnement de test.

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 avec le numéro d'une carte et un cryptogramme de test fournis par Payline, e.g. 9250004780000046024 et 071. Payline affiche le ticket de paiement. Terminez l'opération. 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.

Affichez le contenu du journal des opérations dans le fichier du jour dans le dossier vendor/monext/payline-sdk/logs.

Pour basculer le site en mode production avec des paiements réels, initialisez $payline_merchant_id, $payline_access_key et $payline_contract_number dans le cas où $payline_context ne vaut pas 'homo' avec les valeurs définies dans la configuration de votre compte de production. Mettez le paramètre $payline_context à 'prod'.

Échanges

Un paiement est initialisé en appelant l'action paylinecheckout. Cette action prépare les paramètres pour une requête WebPayment du SDK Payline, l'exécute et charge la page de paiement du site web de Payline. Elle appelle la fonction payline_dowebpayment qui retourne un jeton et une URL, enregistre le jeton et les données sur le paiement dans la session et termine en rechargeant l'URL.

L'utilisateur est sur le site web de Payline.

Si le paiement est annulé ou rejeté, Payline appelle l'action paylinecancel. Si le paiement est accepté, l'action paylinereturn est appelée. Les deux actions comparent le jeton passé par Payline avec le jeton enregistré dans la session et appellent la fonction payline_getwebpaymentdetails pour obtenir le statut de l'opération. paylinecancel exécute l'action paymentcancelled si le code retourné par Payline indique que l'utilisateur a annulé l'opération ou l'action paymentrejected dans tous les autres cas. paylinereturn exécute toujours l'action paymentaccepted.

Code
paylinecheckout.php
  1. require_once 'payline.php';
  2. require_once 'userisidentified.php';
  3. require_once 'validatecurrency.php';

Charge le code des fonctions payline_dowebpayment, payline_amt et payline_currency qui interfacent Payline ainsi que le fichier de configuration payline.inc. Charge le code des fonctions user_is_identified et validate_currency.

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

La fonction paylinecheckout 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, $payline_contract_number;

Accède à la variable globale $base_url qui contient l'URL du point d'entrée du site et au paramètre de configuration $payline_contract_number nécessaire à l'interface de Payline.

  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=payline_amt($amount);

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

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

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

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

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

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

Calcule et formate le prix total hors taxe.

  1.     $params = array();
  2.  
  3.     $params['payment']['contractNumber'] = $payline_contract_number;
  4.  
  5.     $params['payment']['amount'] = $amt;
  6.     $params['payment']['currency'] = $currencycode;
  7.     $params['payment']['action'] = 101;
  8.     $params['payment']['mode'] = 'CPT';
  9.  
  10.     $params['order']['ref'] = 'P' . time();
  11.     $params['order']['amount'] = $itemamt;
  12.     $params['order']['taxes'] = $taxamt;
  13.     $params['order']['currency'] = $currencycode;
  14.     $params['order']['date'] = date('d/m/Y H:i');
  15.  
  16.     $params['returnURL'] = $base_url . url('paylinereturn', $lang);
  17.     $params['cancelURL'] = $base_url . url('paylinecancel', $lang);
  18.  
  19.     $params['languageCode'] = $lang;

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

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

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

  1.     $token = $r['token'];
  2.     $url = $r['redirectURL'];

Extrait la valeur du jeton donné à l'opération par Payline et l'adresse de la page du paiement sur le site de Payline.

  1.     $_SESSION['payline'] = compact('token', 'amount', 'currency', 'tax', 'context');

Enregistre dans la session le jeton pour vérification au retour de Payline ainsi que les paramètres du paiement.

  1.     reload($url);
  2. }

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

paylinereturn.php
  1. require_once 'payline.php';

Charge le code de la fonction payline_getwebpaymentdetails et le fichier de configuration payline.inc.

  1. function paylinereturn($lang, $arglist=false) {

paylinereturn est une action associée à une URL dans aliases.inc.

  1.     if (!isset($_SESSION['payline'])) {
  2.         return run('error/badrequest', $lang);
  3.     }
  4.  
  5.     extract($_SESSION['payline']);  // token, amount, tax, currency, context
  6.  
  7.     unset($_SESSION['payline']);

Vérifie si une demande de paiement est enregistrée dans la session. Extrait les paramètres du paiement. Nettoie la session.

  1.     if (!isset($arglist['token']) or $arglist['token'] != $token) {
  2.         return run('error/badrequest', $lang);
  3.     }

Vérifie si le jeton passé en paramètre de la requête par Payline est identique à celui enregistré dans la session.

  1.     $params = array();
  2.  
  3.     $params['token'] = $token;
  4.  
  5.     $r = payline_getwebpaymentdetails($params);
  6.  
  7.     if (!$r) {
  8.         return run('error/internalerror', $lang);
  9.     }
  10.  
  11.     $return_code=$r['result']['code'];
  12.  
  13.     $transaction_id=$r['transaction']['id'];
  14.     $authorization_number=$r['authorization']['number'];

Prépare l'appel à la fonction payline_getwebpaymentdetails qui retourne le statut du paiement par Payline. Récupère certains paramètres utiles donnés par payline_getwebpaymentdetails. NOTE : Ces informations et les données dans $context peuvent servir à enregistrer les détails d'un paiement dans la BD.

  1.     require_once 'actions/paymentaccepted.php';
  2.  
  3.     $output = paymentaccepted($lang, $amount, $currency, $context);
  4.  
  5.     return $output;
  6. }

Appelle le code qui génère la page d'un paiement accepté et la retourne.

paylinecancel.php
  1. require_once 'payline.php';
  2.  
  3. function paylinecancel($lang, $arglist=false) {
  4.     if (!isset($_SESSION['payline'])) {
  5.         return run('error/badrequest', $lang);
  6.     }
  7.  
  8.     extract($_SESSION['payline']);  // token, amount, tax, currency, context
  9.  
  10.     unset($_SESSION['payline']);
  11.  
  12.     if (!isset($arglist['token']) or $arglist['token'] != $token) {
  13.         return run('error/badrequest', $lang);
  14.     }
  15.  
  16.     $params = array();
  17.  
  18.     $params['token'] = $token;
  19.  
  20.     $r = payline_getwebpaymentdetails($params);
  21.  
  22.     if (!$r) {
  23.         return run('error/internalerror', $lang);
  24.     }
  25.  
  26.     $return_code=$r['result']['code'];

Le code des actions paylinereturn et paylinecancel est pratiquement identique.

  1.     $cancelled=($return_code == '02319');
  2.  
  3.     if ($cancelled) {
  4.         require_once 'actions/paymentcancelled.php';
  5.  
  6.         $output = paymentcancelled($lang, $amount, $currency, $context);
  7.     }
  8.     else {
  9.         require_once 'actions/paymentrejected.php';
  10.  
  11.         $output = paymentrejected($lang, $amount, $currency, $context);
  12.     }
  13.  
  14.     return $output;
  15. }

Analyse le code de retour de Payline. La valeur 02319 signale l'annulation de l'opération par l'utilisateur. Un autre code indique que l'opération a été rejetée et pourquoi. Retourne la page pour un paiement annulé ou un paiement rejeté selon le cas.

Voir la documentation sur les fonctions qui interfacent le SDK Payline définies dans payline 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].