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; } }