Initial commit

This commit is contained in:
2020-01-27 08:56:08 +01:00
commit b7525048d6
27129 changed files with 3409855 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
<?php
/*************************************************************************************/
/* */
/* Thelia 2 Paybox payment module */
/* */
/* Copyright (c) CQFDev */
/* email : thelia@cqfdev.fr */
/* web : http://www.cqfdev.fr */
/* */
/*************************************************************************************/
namespace Paybox\Controller;
use Paybox\Form\ConfigurationForm;
use Paybox\Paybox;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Tools\URL;
/**
* Paybox payment module
*
* @author Franck Allimant <franck@cqfdev.fr>
*/
class ConfigurationController extends BaseAdminController
{
public function displayConfigurationPage()
{
$logFilePath = sprintf(THELIA_ROOT."log".DS."%s.log", Paybox::MODULE_CODE);
$traces = @file_get_contents($logFilePath);
if (false === $traces) {
$traces = $this->getTranslator()->trans("Le fichier de log n'a pas été trouvé.", [], Paybox::MODULE_DOMAIN);
} elseif (empty($traces)) {
$traces = $this->getTranslator()->trans("Le fichier de log est vide.", [], Paybox::MODULE_DOMAIN);
}
return $this->render(
'module-configure',
[
'module_code' => 'Paybox',
'trace_content' => nl2br($traces)
]
);
}
public function configure()
{
if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'Paybox', AccessManager::UPDATE)) {
return $response;
}
// Create the Form from the request
$configurationForm = new ConfigurationForm($this->getRequest());
try {
// Check the form against constraints violations
$form = $this->validateForm($configurationForm, "POST");
// Get the form field values
$data = $form->getData();
foreach ($data as $name => $value) {
if (is_array($value)) {
$value = implode(';', $value);
}
Paybox::setConfigValue($name, $value);
}
// Log configuration modification
$this->adminLogAppend(
"paybox.configuration.message",
AccessManager::UPDATE,
sprintf("Paybox configuration updated")
);
// Redirect to the success URL,
if ($this->getRequest()->get('save_mode') == 'stay') {
// If we have to stay on the same page, redisplay the configuration page/
$route = '/admin/module/Paybox';
} else {
// If we have to close the page, go back to the module back-office page.
$route = '/admin/modules';
}
return new RedirectResponse(URL::getInstance()->absoluteUrl($route));
} catch (FormValidationException $ex) {
// Form cannot be validated. Create the error message using
// the BaseAdminController helper method.
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
}
catch (\Exception $ex) {
// Any other error
$error_msg = $ex->getMessage();
}
// At this point, the form has errors, and should be redisplayed. We don not redirect,
// just redisplay the same template.
// Setup the Form error context, to make error information available in the template.
$this->setupFormErrorContext(
$this->getTranslator()->trans("Paybox configuration", [], Paybox::MODULE_DOMAIN),
$error_msg,
$configurationForm,
$ex
);
// Do not redirect at this point, or the error context will be lost.
// Just redisplay the current template.
return $this->displayConfigurationPage();
}
}

View File

@@ -0,0 +1,256 @@
<?php
/*************************************************************************************/
/* */
/* Thelia 2 Paybox payment module */
/* */
/* Copyright (c) CQFDev */
/* email : thelia@cqfdev.fr */
/* web : http://www.cqfdev.fr */
/* */
/*************************************************************************************/
namespace Paybox\Controller;
use Paybox\Paybox;
use Thelia\Core\HttpFoundation\Response;
use Thelia\Module\BasePaymentModuleController;
/**
* Paybox payment module
*
* @author Franck Allimant <franck@cqfdev.fr>
*/
class PaymentController extends BasePaymentModuleController
{
protected function getModuleCode()
{
return Paybox::MODULE_CODE;
}
protected function getTextualMessage($code)
{
$messages = [
'00001' => 'La connexion au centre dautorisation a échoué. Vous pouvez dans ce cas là effectuer les redirections des internautes vers le FQDN tpeweb1.paybox.com.',
// Traité spécialement plus bas
// '001xx' => 'Paiement refusé par le centre dautorisation',
'00003' => 'Erreur Paybox',
'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' => 'Code réservé par paybox',
'00032' => 'Code réservé par paybox',
'00033' => 'Code pays de ladresse IP du navigateur de lacheteur non autorisé.',
'00040' => 'Opération sans authentification 3DSecure, bloquée par le filtre.'
];
if (isset($messages[$code])) {
return $messages[$code];
} else {
$codeNum = intval($code);
if ($codeNum >= 100 && $codeNum <= 199) {
return 'Paiement refusé par le centre dautorisation';
} else {
return "Aucune information sur le code $code";
}
}
}
/**
* Send the payment notification email to the shop admin
*
* @param int $orderId
* @param string $orderReference
* @param string $paymentStatus
* @param string $payboxMessage
*/
protected function sendPaymentNotification($orderId, $orderReference, $paymentStatus, $payboxMessage)
{
$this->getMailer()->sendEmailToShopManagers(
Paybox::NOTIFICATION_MESSAGE_NAME,
[
'order_ref' => $orderReference,
'order_id' => $orderId,
'paybox_payment_status' => $paymentStatus,
'paybox_message' => $payboxMessage
]
);
}
/**
* Process a Paybox platform request
*/
public function processPayboxRequest()
{
// The response code to the server
$request = $this->getRequest();
$this->getLog()->addInfo(
$this->getTranslator()->trans(
"Paybox platform request received.",
[],
Paybox::MODULE_DOMAIN
)
);
$orderId = 0;
$orderReference = $this->getTranslator()->trans('UNDEFINED', [], Paybox::MODULE_DOMAIN);
$orderStatus = $this->getTranslator()->trans('UNKNOWN', [], Paybox::MODULE_DOMAIN);
$payboxRequestValues = [];
$variables = explode(';', Paybox::PARAMETRES_RETOUR);
foreach ($variables as $variable) {
list($nom, $dummy) = explode(':', $variable);
$payboxRequestValues[$nom] = $request->get($nom);
}
// Vérification de la signature
$stringParam = '';
foreach ($payboxRequestValues as $key => $value) {
// Ignore sign parameter
if ($key == 'sign') {
continue;
}
$stringParam .= "&".$key.'='.$value;
}
$stringParam = ltrim($stringParam, '&');
$signature = base64_decode($request->get('sign'));
// Charger le fichier qui contient la clef publique de Paybox
$publicKeyFile = __DIR__ . DS . '..' . DS . 'Config' . DS . 'clef-publique-paybox.pem';
if (false !== $publicKeyData = file_get_contents($publicKeyFile)) {
$publicKey = openssl_pkey_get_public($publicKeyData);
if (openssl_verify($stringParam, $signature, $publicKey)) {
// L'ID de transaction passé est l'ID de la commande
$orderId = intval($payboxRequestValues['ref']);
$orderStatus = $this->getTranslator()->trans('NOT PAID', [], Paybox::MODULE_DOMAIN);
if (null !== $order = $this->getOrder($orderId)) {
$orderReference = $order->getRef();
$codeRetour = $payboxRequestValues['erreur'];
// Check payment status
if ($codeRetour == '00000') {
$orderStatus = $this->getTranslator()->trans('PAID', [], Paybox::MODULE_DOMAIN);
if (!$order->isPaid()) {
$this->confirmPayment($orderId);
$message = $this->getTranslator()->trans(
"Order ID %id is confirmed.",
[ '%id' => $orderId ],
Paybox::MODULE_DOMAIN
);
} else {
$message = $this->getTranslator()->trans(
"Order ID %id already paid, message ignored.",
[ '%id' => $orderId ],
Paybox::MODULE_DOMAIN
);
}
} else {
$message = $this->getTranslator()->trans(
"Order cannot be confirmed, Paybox returned error %num: %text",
[
'%num' => $codeRetour,
'%text' => $this->getTextualMessage($codeRetour)
],
Paybox::MODULE_DOMAIN
);
}
} else {
$message = $this->getTranslator()->trans(
"Order ID %id was not found. Transaction reference is '%ref'.",
[ '%id' => $orderId, '%ref' => $payboxRequestValues['ref']],
Paybox::MODULE_DOMAIN
);
}
} else {
$message = $this->getTranslator()->trans(
"Request parameters signature verification failed.",
[],
Paybox::MODULE_DOMAIN
);
}
} else {
$message = $this->getTranslator()->trans(
"Failed to open %file, please check Paybox configuration",
[ '%file' => $publicKeyFile ],
Paybox::MODULE_DOMAIN
);
}
$this->getLog()->addInfo($message);
$this->getLog()->info(
$this->getTranslator()->trans(
"Paybox platform request processing terminated.",
[],
Paybox::MODULE_DOMAIN
)
);
$this->sendPaymentNotification($orderId, $orderReference, $orderStatus, $message);
return Response::create('');
}
public function processPayboxSuccessfulRequest()
{
$url = $this->getRouteFromRouter(
'router.front',
'order.placed',
[ 'order_id' => intval($this->getRequest()->get('ref')) ]
);
return $this->generateRedirect($url);
}
public function processPayboxRejectedRequest()
{
$url = $this->getRouteFromRouter(
'router.front',
'order.failed',
[
'order_id' => intval($this->getRequest()->get('ref')),
'message' => $this->getTranslator()->trans("Your payment was rejected.", [], Paybox::MODULE_DOMAIN)
]
);
return $this->generateRedirect($url);
}
public function processPayboxCanceledRequest()
{
$url = $this->getRouteFromRouter(
'router.front',
'order.failed',
[
'order_id' => intval($this->getRequest()->get('ref')),
'message' => $this->getTranslator()->trans("Your payment was canceled.", [], Paybox::MODULE_DOMAIN)
]
);
return $this->generateRedirect($url);
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<dwsync>
<file name="ConfigurationController.php" server="51.254.220.106//web/" local="131353051200000000" remote="131390168400000000" />
<file name="PaymentController.php" server="51.254.220.106//web/" local="131353051200000000" remote="131390168400000000" />
</dwsync>