diff --git a/application/configs/application.ini b/application/configs/application.ini index 0a89cad..7ce6924 100644 --- a/application/configs/application.ini +++ b/application/configs/application.ini @@ -35,6 +35,9 @@ profil.db.sdv1.params.password=bj10sx profil.db.sdv1.params.dbname=partner profil.db.sdv1.params.driver_options.MYSQLI_INIT_COMMAND = "SET NAMES utf8" +profil.report.username=partner144 +profil.report.password=yY2Uhp0mf5 + [staging : production] resources.frontController.params.displayExceptions = 1 diff --git a/application/controllers/ReportController.php b/application/controllers/ReportController.php index 2ba85e9..0357f30 100644 --- a/application/controllers/ReportController.php +++ b/application/controllers/ReportController.php @@ -33,7 +33,10 @@ class ReportController extends Zend_Controller_Action if (intval($siren)>100) { //Vérifier que le SIREN existe en base require_once 'Scores/WsScores.php'; - $ws = new WsScores('mricois', 'ju2loh6o'); + $c = Zend_Registry::get('config'); + $login = $c->profil->report->username; + $password = $c->profil->report->password; + $ws = new WsScores($login, $password); $response = $ws->getIdentiteLight($siren); if ($response !== false) { @@ -127,21 +130,17 @@ class ReportController extends Zend_Controller_Action //Passage à la page suivante $url = $this->view->url(array( - 'controller'=>'report', - 'action'=>'paiement', //deliver + 'controller' => 'report', + 'action' => 'deliver', //paiement 'id' => $form->getValue('cmdId'), ), null, true); $this->redirect($url); - - //=> Aller à la page de paiement - - } catch (Zend_Db_Adapter_Exception $e) { $this->view->msg = "Impossible de passer la commande."; } } - } /*else { + } else { //Write the state to the session $cmdState = 1; @@ -184,7 +183,7 @@ class ReportController extends Zend_Controller_Action } - }*/ + } //Test $session = new Zend_Session_Namespace('Cmd'); @@ -212,10 +211,10 @@ class ReportController extends Zend_Controller_Action $cmdId = $request->getParam('id'); //Write the state to the session - $cmdState = 4; + $cmdState = 3; $session = new Zend_Session_Namespace('Cmd'); - /*if ( $session->state > $cmdState || $session->CmdID != $cmdId ) { + if ( $session->state > $cmdState || $session->CmdID != $cmdId ) { $url = $this->view->url(array( 'controller' => 'report', 'action' => 'index', @@ -224,12 +223,12 @@ class ReportController extends Zend_Controller_Action $this->redirect($url); } else { $session->state = $cmdState; - }*/ + } $this->view->CmdID = $session->CmdID; + //$cmdId = '525ffc4501a4d'; + //$this->view->CmdID = $cmdId; - $cmdId = '525ffc4501a4d'; - $this->view->CmdID = $cmdId; $this->view->Siren = $session->CmdSiren; $this->view->RaisonSociale = $session->CmdRaisonSociale; $this->view->AdresseL1 = $session->CmdAdresseL1; @@ -249,15 +248,13 @@ class ReportController extends Zend_Controller_Action $paybox->setUrlParameters(); $paybox->calculateHMAC(); - //Set PBX_EFFECTUE, PBX_REFUSE, PBX_ANNULE, PBX_ATTENTE, PBX_REPONDRE_A + //@todo : Set PBX_EFFECTUE, PBX_REFUSE, PBX_ANNULE, PBX_ATTENTE, PBX_REPONDRE_A $this->view->PayboxUrl = $paybox->getFormUrl(); $this->view->PayboxValues = $paybox->getFormParameters(); } - - } /** @@ -268,75 +265,67 @@ class ReportController extends Zend_Controller_Action $this->_helper->layout()->disableLayout(); $request = $this->getRequest(); + $params = $request->getParams(); - //PBX_RETOUR /* + * PBX_RETOUR + * mt:M => Montant de la transaction * eta:E - * ref:R => Référence commande (précisée dans PBX_CMD) + * id:R => Référence commande (précisée dans PBX_CMD) * auto:A => numéro d'Autorisation (numéro remis par le centre d’autorisation) * type:P => Type de Paiement retenu (cf. PBX_TYPEPAIEMENT) - * transaction:S => Numéro de TranSaction Paybox - * pays:Y => Code paYs de la banque émettrice de la carte. Format : ISO 3166 (alphabétique) - * sign:K => Signature sur les variables de l’URL. Format : url-encodé + * idtrans:S => Numéro de TranSaction Paybox + * sign:K => Signature sur les variables de l'URL. Format : url-encodé (toujours en dernier) */ - /* Code retour eta:E -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 + $verify = new Paybox_Response(); + $verify->setData($params); + if ( $verify->checkData() === false ) { -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. - */ + $error = $verify->getError(); + $this->view->PaiementError = $error->label; + } else { - //Get cmd id - $eta = $request->getParam('eta'); + $cmdState = 4; + $session = new Zend_Session_Namespace('Cmd'); + if ( $session->state > $cmdState || $session->CmdID != $cmdId ) { + $url = $this->view->url(array( + 'controller' => 'report', + 'action' => 'index', + 'siren' => $session->CmdSiren, + ), null, true); + $this->redirect($url); + } else { + $session->state = $cmdState; + } + $cmdId = $request->getParam('id'); - //Request PAYBOX to validate the payment - //Valider les bons de commande - + //Vérification que la commande existe + $commandM = new Application_Model_Command(); + $row = $commandM->fetchRow('cmdId="'.$cmdId.'"'); + if ($row !== null) { + //Enregistrement des valeurs de paiement + $data = array( + 'eta' => $params['eta'], + 'auto' => $params['auto'], + 'type' => $params['type'], + 'idtrans' => $params['idtrans'], + ); + $commandM->update($data, 'id='.$row->id); + //Génération de l'url de livraison + $deliveryUrl = $this->view->url(array( + 'controller'=>'report', + 'action'=>'deliver', + 'id' => $row->cmdId + )); + $this->view->deliveryUrl = $deliveryUrl; + } + } } @@ -347,18 +336,13 @@ Opération en attente de validation par l’émetteur du moyen de paiement. $request = $this->getRequest(); - //Get the response from PAYBOX - - - $c = Zend_Registry::get('config'); $pathCmd = $c->profil->path->data; //Commande ID $cmdId = $request->getParam('id'); - //Write the state to the session - $cmdState = 3; + $cmdState = 5; $session = new Zend_Session_Namespace('Cmd'); if ( $session->state > $cmdState || $session->CmdID != $cmdId ) { diff --git a/application/views/scripts/report/retour.phtml b/application/views/scripts/report/retour.phtml index b3d9bbc..a2c064c 100644 --- a/application/views/scripts/report/retour.phtml +++ b/application/views/scripts/report/retour.phtml @@ -1 +1,40 @@ - + + + + + +Kompass - Achat Bilan Financier + + + + + + +
+ + + + PaiementError ) {?> + +
Erreur ! PaiementError?>
+ + + +
Paiment autorisé. + Consulter vos fichiers en cliquant ici
+ + + + + + +
+ + inlineScript(); ?> + + \ No newline at end of file diff --git a/library/Paybox/Response.php b/library/Paybox/Response.php index 9ddeea1..9120fa0 100644 --- a/library/Paybox/Response.php +++ b/library/Paybox/Response.php @@ -1,7 +1,176 @@ setSign($values['sign']); + unset($values['sign']); + + //Concat datas with & + $this->data = ''; + $i = 0; + $max = count($values); + foreach( $values as $key => $val ) { + $this->data.= $key."=".urlencode($val); + $i++; + if ( $i<$max ) { + $this->data.= '&'; + } + } + } + + /** + * Défini la signature + * @param string $value + */ + protected function setSign($value) + { + $this->sign = base64_decode(urldecode($value)); + } + + /** + * + */ + protected function isDataSign() + { + $fp = fopen(__DIR__ . '/pubkey.pem', 'r'); + $cert = fread($fp, 8192); + fclose($fp); + + $pubkeyid = openssl_get_publickey($cert); + + // state whether signature is okay or not + $ok = openssl_verify($this->data, $this->sign, $pubkeyid); + + // 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 + * @param string $code + * @return boolean + */ + protected function checkEta($code) + { + 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 = 'Echec'; + } + 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)}() === false ) { + return false; + } + } + } + + //eta:E;id:R;type:P;pays:Y;mt:M;auto:A;idtrans:S;sign:K + + } + + /** + * Get error message + * @return stdClass + */ + public function getError() + { + $return = new stdClass(); + $return->code = $this->errCode; + $return->label = $this->errLabel; + return $return; + } } \ No newline at end of file diff --git a/library/Paybox/System.php b/library/Paybox/System.php index 771540a..7da5b81 100644 --- a/library/Paybox/System.php +++ b/library/Paybox/System.php @@ -99,9 +99,19 @@ class Paybox_System extends Paybox_Config /** * Configuration de la réponse * Chaine : concaténé par ; + * mt:M => Montant de la transaction + * eta:E + * Liste des erreurs possible + * + * id:R => Référence commande (précisée dans PBX_CMD) + * auto:A => numéro d'Autorisation (numéro remis par le centre d’autorisation) + * type:P => Type de Paiement retenu (cf. PBX_TYPEPAIEMENT) + * idtrans:S => Numéro de TranSaction Paybox + * pays:Y => Code paYs de la banque émettrice de la carte. Format : ISO 3166 (alphabétique) + * sign:K => Signature sur les variables de l'URL. Format : url-encodé (toujours en dernier) * @var string */ - protected $PBX_RETOUR; + protected $PBX_RETOUR = 'eta:E;id:R;type:P;mt:M;auto:A;idtrans:S;sign:K'; /** * Langue de la page de paiement diff --git a/library/Paybox/pubkey.pem b/library/Paybox/pubkey.pem new file mode 100644 index 0000000..310d1eb --- /dev/null +++ b/library/Paybox/pubkey.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew +HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc +VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC +Ka1g88CjFwRw/PB9kwIDAQAB +-----END PUBLIC KEY----- diff --git a/scripts/build/_sql/command.sql b/scripts/build/_sql/command.sql new file mode 100644 index 0000000..864bf23 --- /dev/null +++ b/scripts/build/_sql/command.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `command` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cmdId` varchar(15) NOT NULL COMMENT 'Identifiant unique de commande', + `siren` varchar(9) NOT NULL COMMENT 'Siren de l''entreprise', + `email` varchar(50) DEFAULT NULL COMMENT 'Email de la personne', + `rs` varchar(200) DEFAULT NULL COMMENT 'Raison sociale de la personne', + `nom` varchar(100) DEFAULT NULL COMMENT 'Nom de la personne', + `prenom` varchar(100) DEFAULT NULL COMMENT 'Prenom de la personne', + `adresse` varchar(100) DEFAULT NULL COMMENT 'Adresse de la personne', + `cp` varchar(5) DEFAULT NULL COMMENT 'CP de la personne', + `ville` varchar(100) DEFAULT NULL COMMENT 'Ville de la personne', + `tel` varchar(50) DEFAULT NULL COMMENT 'Téléphone de la personne', + `mobile` varchar(50) DEFAULT NULL COMMENT 'Téléphone portable de la personne', + `eta` int(5) DEFAULT NULL COMMENT 'Code réponse de la transaction', + `auto` varchar(100) NOT NULL COMMENT 'Numéro d''autorisation remis par le centre d’autorisation', + `type` varchar(100) NOT NULL COMMENT 'Type de paiement retenu', + `idtrans` varchar(100) NOT NULL COMMENT 'Numéro de transaction Paybox', + `dateInsert` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date d''insertion de la commande', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Listing des commandes' AUTO_INCREMENT=4 ; \ No newline at end of file diff --git a/scripts/build/local/application.ini b/scripts/build/local/application.ini new file mode 100644 index 0000000..7ce6924 --- /dev/null +++ b/scripts/build/local/application.ini @@ -0,0 +1,51 @@ +[production] +phpSettings.date.timezone = "Europe/Paris" +phpSettings.display_startup_errors = 0 +phpSettings.display_errors = 0 +bootstrap.path = APPLICATION_PATH "/Bootstrap.php" +bootstrap.class = "Bootstrap" +appnamespace = "Application" +resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" +resources.frontController.params.displayExceptions = 0 +resources.layout.layout = "layout" +resources.layout.layoutPath = APPLICATION_PATH "/views" +resources.view.basePath = APPLICATION_PATH "/views" +autoloaderNamespaces[] = "Application_" +autoloaderNamespaces[] = "Scores_" +autoloaderNamespaces[] = "Paybox_" + +; Scores configuration +profil.server.name = local +profil.webservice.location = sdsrvdev01 +profil.mail.method = smtp +profil.mail.smtp_host = smtp.free.fr +profil.mail.email.support = supportdev@scores-decisions.com +profil.mail.email.supportdev = supportdev@scores-decisions.com +profil.mail.email.contact = supportdev@scores-decisions.com +profil.mail.email.production = supportdev@scores-decisions.com +profil.path.cache = APPLICATION_PATH "/../data/cache" +profil.path.files = APPLICATION_PATH "/../data/files" +profil.path.pages = APPLICATION_PATH "/../data/pages" +profil.path.data = "c:\Users\mricois\www\data\partner" +profil.wkhtmltopdf.path = "c:\Users\mricois\www\data\wkhtml\windows\wkhtmltopdf.exe" +profil.db.sdv1.adapter=mysqli +profil.db.sdv1.params.host=127.0.0.1 +profil.db.sdv1.params.username=root +profil.db.sdv1.params.password=bj10sx +profil.db.sdv1.params.dbname=partner +profil.db.sdv1.params.driver_options.MYSQLI_INIT_COMMAND = "SET NAMES utf8" + +profil.report.username=partner144 +profil.report.password=yY2Uhp0mf5 + +[staging : production] +resources.frontController.params.displayExceptions = 1 + +[development : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 +resources.frontController.params.displayExceptions = 1 + +[testing : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 \ No newline at end of file diff --git a/scripts/build/sd-46528/application.ini b/scripts/build/sd-46528/application.ini new file mode 100644 index 0000000..b43792e --- /dev/null +++ b/scripts/build/sd-46528/application.ini @@ -0,0 +1,51 @@ +[production] +phpSettings.date.timezone = "Europe/Paris" +phpSettings.display_startup_errors = 0 +phpSettings.display_errors = 0 +bootstrap.path = APPLICATION_PATH "/Bootstrap.php" +bootstrap.class = "Bootstrap" +appnamespace = "Application" +resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" +resources.frontController.params.displayExceptions = 0 +resources.layout.layout = "layout" +resources.layout.layoutPath = APPLICATION_PATH "/views" +resources.view.basePath = APPLICATION_PATH "/views" +autoloaderNamespaces[] = "Application_" +autoloaderNamespaces[] = "Scores_" +autoloaderNamespaces[] = "Paybox_" + +; Scores configuration +profil.server.name = local +profil.webservice.location = sdsrvdev01 +profil.mail.method = smtp +profil.mail.smtp_host = smtp.free.fr +profil.mail.email.support = supportdev@scores-decisions.com +profil.mail.email.supportdev = supportdev@scores-decisions.com +profil.mail.email.contact = supportdev@scores-decisions.com +profil.mail.email.production = supportdev@scores-decisions.com +profil.path.cache = APPLICATION_PATH "/../data/cache" +profil.path.files = APPLICATION_PATH "/../data/files" +profil.path.pages = APPLICATION_PATH "/../data/pages" +profil.path.data = "c:\Users\mricois\www\data\partner" +profil.wkhtmltopdf.path = "c:\Users\mricois\www\data\wkhtml\windows\wkhtmltopdf.exe" +profil.db.sdv1.adapter=mysqli +profil.db.sdv1.params.host=localhost +profil.db.sdv1.params.username=extranet +profil.db.sdv1.params.password=bGPZ9qYZQFHMYCnJ +profil.db.sdv1.params.dbname=partner +profil.db.sdv1.params.driver_options.MYSQLI_INIT_COMMAND = "SET NAMES utf8" + +profil.report.username=partner144 +profil.report.password=yY2Uhp0mf5 + +[staging : production] +resources.frontController.params.displayExceptions = 1 + +[development : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 +resources.frontController.params.displayExceptions = 1 + +[testing : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 \ No newline at end of file