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
- global $payline_context;
- $payline_context='homo'; // 'homo' or 'prod'
- global $payline_merchant_id, $payline_access_key, $payline_contract_number;
- if ($payline_context == 'homo') {
- $payline_merchant_id = false;
- $payline_access_key = false;
- $payline_contract_number = '1234567';
- }
- else {
- $payline_merchant_id = false;
- $payline_access_key = false;
- $payline_contract_number = false;
- }
- global $payline_proxy_host, $payline_proxy_port, $payline_proxy_login, $payline_proxy_password;
- $payline_proxy_host=false;
- $payline_proxy_port=false;
- $payline_proxy_login=false;
- $payline_proxy_password=false;
- global $payline_log;
- $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
- require_once 'payline.inc';
- function donate($lang) {
- global $payline_merchant_id, $payline_access_key, $payline_contract_number;
- if (empty($payline_merchant_id) or empty($payline_access_key) or empty($payline_contract_number)) {
- return false;
- }
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
- require_once 'actions/paylinecheckout.php';
- paylinecheckout($lang, $amount, $currency);
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.
NOTE : Changer l'aspect du bouton de paiement n'est pas un problème.
Entrez un montant de 25 EUR et appuyez sur . 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
- require_once 'payline.php';
- require_once 'userisidentified.php';
- 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
.
- 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.
- 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.
- 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=payline_amt($amount);
Vérifie le paramètre $amount
et le formate pour l'interface Payline.
- if (!validate_currency($currency)) {
- return run('error/badrequest', $lang);
- }
- $currencycode=payline_currency($currency);
Vérifie le paramètre $currency
et le formate pour l'interface Payline.
- if (!(is_numeric($tax) and $tax >= 0)) {
- return run('error/badrequest', $lang);
- }
- $taxamt=payline_amt($tax);
Vérifie le paramètre $tax
et le formate pour l'interface Payline.
- $itemamt=payline_amt($amount-$tax);
Calcule et formate le prix total hors taxe.
- $params = array();
- $params['payment']['contractNumber'] = $payline_contract_number;
- $params['payment']['amount'] = $amt;
- $params['payment']['currency'] = $currencycode;
- $params['payment']['action'] = 101;
- $params['payment']['mode'] = 'CPT';
- $params['order']['ref'] = 'P' . time();
- $params['order']['amount'] = $itemamt;
- $params['order']['taxes'] = $taxamt;
- $params['order']['currency'] = $currencycode;
- $params['order']['date'] = date('d/m/Y H:i');
- $params['returnURL'] = $base_url . url('paylinereturn', $lang);
- $params['cancelURL'] = $base_url . url('paylinecancel', $lang);
- $params['languageCode'] = $lang;
Prépare les paramètres nécessaires à l'interface Payline pour une requête de paiement immédiat.
- $r = payline_dowebpayment($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
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é.
- $token = $r['token'];
- $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.
- $_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.
- reload($url);
- }
Charge la page de paiement du site de Payline dans le navigateur.
paylinereturn.php
- require_once 'payline.php';
Charge le code de la fonction payline_getwebpaymentdetails
et le fichier de configuration payline.inc.
- function paylinereturn($lang, $arglist=false) {
paylinereturn
est une action associée à une URL dans aliases.inc.
- if (!isset($_SESSION['payline'])) {
- return run('error/badrequest', $lang);
- }
- extract($_SESSION['payline']); // token, amount, tax, currency, context
- 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.
- if (!isset($arglist['token']) or $arglist['token'] != $token) {
- return run('error/badrequest', $lang);
- }
Vérifie si le jeton passé en paramètre de la requête par Payline est identique à celui enregistré dans la session.
- $params = array();
- $params['token'] = $token;
- $r = payline_getwebpaymentdetails($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
- $return_code=$r['result']['code'];
- $transaction_id=$r['transaction']['id'];
- $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.
- require_once 'actions/paymentaccepted.php';
- $output = paymentaccepted($lang, $amount, $currency, $context);
- return $output;
- }
Appelle le code qui génère la page d'un paiement accepté et la retourne.
paylinecancel.php
- require_once 'payline.php';
- function paylinecancel($lang, $arglist=false) {
- if (!isset($_SESSION['payline'])) {
- return run('error/badrequest', $lang);
- }
- extract($_SESSION['payline']); // token, amount, tax, currency, context
- unset($_SESSION['payline']);
- if (!isset($arglist['token']) or $arglist['token'] != $token) {
- return run('error/badrequest', $lang);
- }
- $params = array();
- $params['token'] = $token;
- $r = payline_getwebpaymentdetails($params);
- if (!$r) {
- return run('error/internalerror', $lang);
- }
- $return_code=$r['result']['code'];
Le code des actions paylinereturn
et paylinecancel
est pratiquement identique.
- $cancelled=($return_code == '02319');
- if ($cancelled) {
- require_once 'actions/paymentcancelled.php';
- $output = paymentcancelled($lang, $amount, $currency, $context);
- }
- else {
- require_once 'actions/paymentrejected.php';
- $output = paymentrejected($lang, $amount, $currency, $context);
- }
- return $output;
- }
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