2013-11-07 18:15:58 +01:00
|
|
|
|
<?php
|
|
|
|
|
class Paybox_Response
|
|
|
|
|
{
|
2013-11-08 15:32:04 +01:00
|
|
|
|
protected $data;
|
2013-11-07 18:15:58 +01:00
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
protected $sign;
|
2013-11-07 18:15:58 +01:00
|
|
|
|
|
2013-11-14 09:01:11 +01:00
|
|
|
|
protected $errCode = 0;
|
2013-11-07 18:15:58 +01:00
|
|
|
|
|
2013-11-15 09:24:12 +01:00
|
|
|
|
protected $errLabel = 'Impossible de valider le paiement.';
|
2013-11-08 15:32:04 +01:00
|
|
|
|
|
2013-11-18 11:19:16 +01:00
|
|
|
|
protected $values = array();
|
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
public function __construct(){}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param array $values
|
|
|
|
|
*/
|
|
|
|
|
public function setData($values)
|
|
|
|
|
{
|
2013-11-14 09:01:11 +01:00
|
|
|
|
if ( !array_key_exists('sign', $values) )
|
|
|
|
|
return;
|
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
//Set and remove the sign
|
|
|
|
|
$this->setSign($values['sign']);
|
|
|
|
|
unset($values['sign']);
|
|
|
|
|
|
2013-11-18 11:19:16 +01:00
|
|
|
|
$this->values = $values;
|
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
//Concat datas with &
|
|
|
|
|
$this->data = '';
|
|
|
|
|
$i = 0;
|
|
|
|
|
$max = count($values);
|
|
|
|
|
foreach( $values as $key => $val ) {
|
2013-11-15 09:24:12 +01:00
|
|
|
|
|
|
|
|
|
if ( !in_array($key, array('eta', 'id', 'type', 'mt', 'auto', 'idtrans')))
|
|
|
|
|
continue;
|
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
$this->data.= $key."=".urlencode($val);
|
|
|
|
|
$i++;
|
2013-11-15 09:24:12 +01:00
|
|
|
|
|
2013-11-08 15:32:04 +01:00
|
|
|
|
if ( $i<$max ) {
|
|
|
|
|
$this->data.= '&';
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-11-15 09:24:12 +01:00
|
|
|
|
|
|
|
|
|
// If the last char is &, remove it
|
|
|
|
|
if ( substr($this->data, -1) == '&' ) {
|
|
|
|
|
$this->data = substr($this->data, 0, strlen($this->data)-1);
|
|
|
|
|
}
|
2013-11-08 15:32:04 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Défini la signature
|
|
|
|
|
* @param string $value
|
|
|
|
|
*/
|
|
|
|
|
protected function setSign($value)
|
|
|
|
|
{
|
2013-11-15 09:24:12 +01:00
|
|
|
|
$this->sign = base64_decode($value);
|
2013-11-08 15:32:04 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function isDataSign()
|
|
|
|
|
{
|
2013-11-15 09:24:12 +01:00
|
|
|
|
if (empty($this->data))
|
2013-11-14 09:01:11 +01:00
|
|
|
|
return false;
|
|
|
|
|
|
2013-11-15 09:24:12 +01:00
|
|
|
|
if (empty($this->sign))
|
2013-11-14 09:01:11 +01:00
|
|
|
|
return false;
|
|
|
|
|
|
2013-11-15 14:31:37 +01:00
|
|
|
|
$cert = file_get_contents(__DIR__.'/Key/pubkey.pem');
|
2013-11-08 15:32:04 +01:00
|
|
|
|
|
2013-11-15 09:24:12 +01:00
|
|
|
|
$pubkeyid = openssl_pkey_get_public($cert);
|
2013-11-08 15:32:04 +01:00
|
|
|
|
|
|
|
|
|
// state whether signature is okay or not
|
2013-11-15 09:24:12 +01:00
|
|
|
|
$ok = openssl_verify($this->data, $this->sign, $pubkeyid, OPENSSL_ALGO_SHA1);
|
2013-11-08 15:32:04 +01:00
|
|
|
|
|
|
|
|
|
// free the key from memory
|
|
|
|
|
openssl_free_key($pubkeyid);
|
|
|
|
|
|
|
|
|
|
if ($ok == 1) {
|
|
|
|
|
return true;
|
|
|
|
|
} elseif ($ok == 0) {
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Vérifie le code retour
|
|
|
|
|
* @return boolean
|
|
|
|
|
*/
|
2013-11-18 11:19:16 +01:00
|
|
|
|
protected function checkEta()
|
2013-11-08 15:32:04 +01:00
|
|
|
|
{
|
2013-11-18 11:19:16 +01:00
|
|
|
|
$code = $this->values['eta'];
|
|
|
|
|
|
2013-11-14 09:01:11 +01:00
|
|
|
|
if ( intval($code) === 0 ) {
|
2013-11-08 15:32:04 +01:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch($code) {
|
|
|
|
|
/*
|
|
|
|
|
00000
|
|
|
|
|
Opération réussie.
|
|
|
|
|
00001
|
|
|
|
|
La connexion au centre d’autorisation a échoué ou une erreur interne est survenue. Dans ce cas, il est souhaitable de faire une tentative sur le site secondaire : tpeweb1.paybox.com.
|
|
|
|
|
001xx
|
|
|
|
|
Paiement refusé par le centre d’autorisation [voir §12.1 Codes réponses du centre d’autorisation].
|
|
|
|
|
En cas d’autorisation de la transaction par le centre d’autorisation de la banque ou de l’établissement financier privatif, le code erreur “00100” sera en fait remplacé directement par “00000”.
|
|
|
|
|
=> Liste des codes erreurs
|
|
|
|
|
|
|
|
|
|
00003
|
|
|
|
|
Erreur Paybox. Dans ce cas, il est souhaitable de faire une tentative sur le site secondaire FQDN tpeweb1.paybox.com.
|
|
|
|
|
00004
|
|
|
|
|
Numéro de porteur ou cryptogramme visuel invalide.
|
|
|
|
|
00006
|
|
|
|
|
Accès refusé ou site/rang/identifiant incorrect.
|
|
|
|
|
00008
|
|
|
|
|
Date de fin de validité incorrecte.
|
|
|
|
|
00009
|
|
|
|
|
Erreur de création d’un abonnement.
|
|
|
|
|
00010
|
|
|
|
|
Devise inconnue.
|
|
|
|
|
00011
|
|
|
|
|
Montant incorrect.
|
|
|
|
|
00015
|
|
|
|
|
Paiement déjà effectué.
|
|
|
|
|
00016
|
|
|
|
|
Abonné déjà existant (inscription nouvel abonné). Valeur ‘U’ de la variable PBX_RETOUR.
|
|
|
|
|
00021
|
|
|
|
|
Carte non autorisée.
|
|
|
|
|
00029
|
|
|
|
|
Carte non conforme. Code erreur renvoyé lors de la documentation de la variable « PBX_EMPREINTE ».
|
|
|
|
|
00030
|
|
|
|
|
Temps d’attente > 15 mn par l’internaute/acheteur au niveau de la page de paiements.
|
|
|
|
|
00031
|
|
|
|
|
Réservé
|
|
|
|
|
00032
|
|
|
|
|
Réservé
|
|
|
|
|
00033
|
|
|
|
|
Code pays de l’adresse IP du navigateur de l’acheteur non autorisé.
|
|
|
|
|
00040
|
|
|
|
|
Opération sans authentification 3-DSecure, bloquée par le filtre.
|
|
|
|
|
99999
|
|
|
|
|
Opération en attente de validation par l’émetteur du moyen de paiement.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
$this->errCode = 0;
|
2013-11-18 11:19:16 +01:00
|
|
|
|
$this->errLabel = 'Validation du paiement incorrect';
|
2013-11-08 15:32:04 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @return boolean
|
|
|
|
|
*/
|
|
|
|
|
public function checkData()
|
|
|
|
|
{
|
|
|
|
|
//Vérification de la signature
|
|
|
|
|
if ( $this->isDataSign() === false ) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Vérifier le retour des données
|
|
|
|
|
$vars = array('eta');
|
|
|
|
|
foreach ( $vars as $var ) {
|
|
|
|
|
if ( method_exists($this, 'check'.ucfirst($var)) ) {
|
2013-11-18 14:15:39 +01:00
|
|
|
|
if ( $this->{'check'.ucfirst($var)}() === true ) {
|
|
|
|
|
return true;
|
2013-11-08 15:32:04 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//eta:E;id:R;type:P;pays:Y;mt:M;auto:A;idtrans:S;sign:K
|
|
|
|
|
|
2013-11-18 11:19:16 +01:00
|
|
|
|
return false;
|
2013-11-08 15:32:04 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get error message
|
|
|
|
|
* @return stdClass
|
|
|
|
|
*/
|
|
|
|
|
public function getError()
|
|
|
|
|
{
|
|
|
|
|
$return = new stdClass();
|
|
|
|
|
$return->code = $this->errCode;
|
|
|
|
|
$return->label = $this->errLabel;
|
|
|
|
|
return $return;
|
|
|
|
|
}
|
2013-11-07 18:15:58 +01:00
|
|
|
|
}
|