partner/library/Paybox/Response.php
2013-11-18 13:15:39 +00:00

198 lines
4.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 dautorisation 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 dautorisation [voir §12.1 Codes réponses du centre dautorisation].
En cas dautorisation de la transaction par le centre dautorisation 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 dun 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 dattente > 15 mn par linternaute/acheteur au niveau de la page de paiements.
00031
Réservé
00032
Réservé
00033
Code pays de ladresse IP du navigateur de lacheteur 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;
}
}