Paybox in waiting

This commit is contained in:
Michael RICOIS 2013-11-08 14:32:04 +00:00
parent 69f2d5ec72
commit 3c4cf61e8d
9 changed files with 412 additions and 79 deletions

View File

@ -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

View File

@ -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 dautorisation)
* 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 lURL. 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 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
$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 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.
*/
$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 ) {

View File

@ -1 +1,40 @@
<?php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="viewport" content="width=device-width, initial-scale=1.0" >
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta http-equiv="Content-Language" content="fr-FR" >
<title>Kompass - Achat Bilan Financier</title>
<link href="/libs/bootstrap-v3.0.0/css/bootstrap.min.css" media="all" rel="stylesheet" type="text/css" >
<link href="/themes/default/css/justified-nav.css" media="all" rel="stylesheet" type="text/css" >
<!--[if lt IE 9]> <script type="text/javascript" src="/libs/html5shiv.js"></script><![endif]-->
<!--[if lt IE 9]> <script type="text/javascript" src="/libs/respond.min.js"></script><![endif]-->
</head>
<body>
<div class="container">
<div class="page-header">
<h2>RAPPORT FINANCIER COMPLET <small>Erreur</small></h2>
</div>
<?php if ( $this->PaiementError ) {?>
<div class="alert alert-danger"><strong>Erreur !</strong> <?=$this->PaiementError?></div>
<?php } else {?>
<div class="alert alert-success"><strong>Paiment autorisé.</strong>
<a href="<?=$this->devliveryUrl?>">Consulter vos fichiers en cliquant ici</a></div>
<?php }?>
<!-- Site footer -->
<div class="footer">
<p>&copy; Scores & Décisions <?=date('Y')?></p>
</div>
</div>
<?php echo $this->inlineScript(); ?>
</body>
</html>

View File

@ -1,7 +1,176 @@
<?php
class Paybox_Response
{
protected $data;
protected $sign;
protected $errCode;
protected $errLabel;
public function __construct(){}
/**
*
* @param array $values
*/
public function setData($values)
{
//Set and remove the sign
$this->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 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 = '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;
}
}

View File

@ -99,9 +99,19 @@ class Paybox_System extends Paybox_Config
/**
* Configuration de la réponse
* Chaine <nom de variable>:<lettre> 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 dautorisation)
* 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

View File

@ -0,0 +1,6 @@
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew
HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc
VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC
Ka1g88CjFwRw/PB9kwIDAQAB
-----END PUBLIC KEY-----

View File

@ -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 dautorisation',
`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 ;

View File

@ -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

View File

@ -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