198 lines
4.2 KiB
PHP
198 lines
4.2 KiB
PHP
<?php
|
||
class Paybox_Response
|
||
{
|
||
protected $data;
|
||
|
||
protected $sign;
|
||
|
||
protected $errCode = 0;
|
||
|
||
protected $errLabel = 'Impossible de valider le paiement.';
|
||
|
||
protected $values = array();
|
||
|
||
public function __construct(){}
|
||
|
||
/**
|
||
*
|
||
* @param array $values
|
||
*/
|
||
public function setData($values)
|
||
{
|
||
if ( !array_key_exists('sign', $values) )
|
||
return;
|
||
|
||
//Set and remove the sign
|
||
$this->setSign($values['sign']);
|
||
unset($values['sign']);
|
||
|
||
$this->values = $values;
|
||
|
||
//Concat datas with &
|
||
$this->data = '';
|
||
$i = 0;
|
||
$max = count($values);
|
||
foreach( $values as $key => $val ) {
|
||
|
||
if ( !in_array($key, array('eta', 'id', 'type', 'mt', 'auto', 'idtrans')))
|
||
continue;
|
||
|
||
$this->data.= $key."=".urlencode($val);
|
||
$i++;
|
||
|
||
if ( $i<$max ) {
|
||
$this->data.= '&';
|
||
}
|
||
}
|
||
|
||
// If the last char is &, remove it
|
||
if ( substr($this->data, -1) == '&' ) {
|
||
$this->data = substr($this->data, 0, strlen($this->data)-1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Défini la signature
|
||
* @param string $value
|
||
*/
|
||
protected function setSign($value)
|
||
{
|
||
$this->sign = base64_decode($value);
|
||
}
|
||
|
||
/**
|
||
*
|
||
*/
|
||
protected function isDataSign()
|
||
{
|
||
if (empty($this->data))
|
||
return false;
|
||
|
||
if (empty($this->sign))
|
||
return false;
|
||
|
||
$cert = file_get_contents(__DIR__.'/Key/pubkey.pem');
|
||
|
||
$pubkeyid = openssl_pkey_get_public($cert);
|
||
|
||
// state whether signature is okay or not
|
||
$ok = openssl_verify($this->data, $this->sign, $pubkeyid, OPENSSL_ALGO_SHA1);
|
||
|
||
// 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
|
||
*/
|
||
protected function checkEta()
|
||
{
|
||
$code = $this->values['eta'];
|
||
|
||
if ( intval($code) === 0 ) {
|
||
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;
|
||
$this->errLabel = 'Validation du paiement incorrect';
|
||
}
|
||
|
||
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)) ) {
|
||
if ( $this->{'check'.ucfirst($var)}() === true ) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
|
||
//eta:E;id:R;type:P;pays:Y;mt:M;auto:A;idtrans:S;sign:K
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Get error message
|
||
* @return stdClass
|
||
*/
|
||
public function getError()
|
||
{
|
||
$return = new stdClass();
|
||
$return->code = $this->errCode;
|
||
$return->label = $this->errLabel;
|
||
return $return;
|
||
}
|
||
} |