toutpratique/modules/payzen/validation.php
2017-02-17 06:18:46 -08:00

229 lines
12 KiB
PHP

<?php
/**
* PayZen V2-Payment Module version 1.8.0 for PrestaShop 1.5-1.7. Support contact : support@payzen.eu.
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
*
* @category payment
* @package payzen
* @author Lyra Network (http://www.lyra-network.com/)
* @copyright 2014-2016 Lyra Network and contributors
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
*/
/**
* Instant payment notification file. Wait for PayZen payment confirmation, then validate order.
*/
require_once dirname(dirname(dirname(__FILE__))).'/config/config.inc.php';
if (($cart_id = (int)Tools::getValue('vads_order_id')) && Tools::getValue('vads_hash')) {
/* module main class */
require_once(dirname(__FILE__).'/payzen.php');
$payzen = new Payzen();
PayzenTools::getLogger()->logInfo("Server call process starts for cart #$cart_id.");
$cart = new Cart($cart_id);
/* cart errors */
$trans_id = htmlspecialchars(Tools::getValue('vads_trans_id'), ENT_COMPAT, 'UTF-8');
if (!Validate::isLoadedObject($cart)) {
PayzenTools::getLogger()->logError("Cart #$cart_id not found in database.");
die('<span style="display:none">KO-'.$trans_id."=Impossible de retrouver la commande\n</span>");
} elseif ($cart->nbProducts() <= 0) {
PayzenTools::getLogger()->logError("Cart #$cart_id was emptied before redirection.");
die('<span style="display:none">KO-'.$trans_id."=Le panier a été vidé avant la redirection\n</span>");
}
/* reload context */
if (isset($cart->id_shop)) {
$_GET['id_shop'] = $cart->id_shop;
Context::getContext()->shop = Shop::initialize();
}
Context::getContext()->customer = new Customer((int)$cart->id_customer);
Context::getContext()->cart = $cart = new Cart((int)$cart_id); // reload cart to take into account customer group
$address = new Address((int)$cart->id_address_invoice);
Context::getContext()->country = new Country((int)$address->id_country);
Context::getContext()->language = new Language((int)$cart->id_lang);
Context::getContext()->currency = new Currency((int)$cart->id_currency);
require_once _PS_MODULE_DIR_.'payzen/classes/PayzenResponse.php';
/** @var PayzenResponse $payzen_response */
$payzen_response = new PayzenResponse(
$_POST,
Configuration::get('PAYZEN_MODE'),
Configuration::get('PAYZEN_KEY_TEST'),
Configuration::get('PAYZEN_KEY_PROD')
);
/* check the authenticity of the request */
if (!$payzen_response->isAuthentified()) {
PayzenTools::getLogger()->logError("Cart #$cart_id : authentication error !");
die($payzen_response->getOutputForPlatform('auth_fail'));
}
/* search order in db */
$order_id = Order::getOrderByCartId($cart_id);
if ($order_id == false) {
/* order has not been processed yet */
if ($payzen_response->isAcceptedPayment()) {
switch (true) {
case $payzen->isOneyPendingPayment($payzen_response):
$new_state = Configuration::get('PAYZEN_OS_ONEY_PENDING');
break;
case $payzen->isSofort($payzen_response):
case $payzen->isSepa($payzen_response):
$new_state = Configuration::get('PAYZEN_OS_TRANS_PENDING');
break;
case $payzen_response->isPendingPayment():
$new_state = Configuration::get('PAYZEN_OS_AUTH_PENDING');
break;
default:
$new_state = Configuration::get('PS_OS_PAYMENT');
break;
}
PayzenTools::getLogger()->logInfo("Payment accepted for cart #$cart_id. New order status is $new_state.");
$order = $payzen->saveOrder($cart, $new_state, $payzen_response);
if (number_format($order->total_paid, 2) != number_format($order->total_paid_real, 2)) {
/* amount paid not equals initial amount. */
PayzenTools::getLogger()->logWarning("Error: amount paid not equals initial amount. Order is in a failed status, cart #$cart_id.");
die($payzen_response->getOutputForPlatform('ko', 'Le montant payé est différent du montant intial'));
} else {
/* response to server */
die($payzen_response->getOutputForPlatform('payment_ok'));
}
} else {
/* payment KO */
PayzenTools::getLogger()->logInfo("Payment failed for cart #$cart_id.");
if (Configuration::get('PAYZEN_FAILURE_MANAGEMENT') == PayzenTools::ON_FAILURE_SAVE || $payzen->isOney($payzen_response)) {
/* save on failure option is selected or oney payment */
$new_state = $payzen_response->isCancelledPayment() ? Configuration::get('PS_OS_CANCELED') : Configuration::get('PS_OS_ERROR');
$msg = $payzen->isOney($payzen_response) ? 'FacilyPay Oney payment' : 'Save on failure option is selected';
PayzenTools::getLogger()->logInfo("$msg : save failed order for cart #$cart_id. New order status is $new_state.");
$order = $payzen->saveOrder($cart, $new_state, $payzen_response);
}
die($payzen_response->getOutputForPlatform('payment_ko'));
}
} else {
/* order already registered */
PayzenTools::getLogger()->logInfo("Order already registered for cart #$cart_id.");
$order = new Order((int)$order_id);
$old_state = $order->getCurrentState();
$outofstock = false;
if ((!Configuration::get('PS_OS_OUTOFSTOCK_UNPAID') && ($old_state == Configuration::get('PS_OS_OUTOFSTOCK'))) ||
(Configuration::get('PS_OS_OUTOFSTOCK_UNPAID') && ($old_state == Configuration::get('PS_OS_OUTOFSTOCK_UNPAID')))) {
/* if out of stock, retrieve the actual order state set by our module */
$outofstock = true;
$old_state = Db::getInstance()->getValue(
'SELECT `id_order_state` FROM `'._DB_PREFIX_.'order_history`
WHERE `id_order` = '.(int)$order_id.' AND `id_order_state` <> '.(int)$old_state.'
ORDER BY `date_add` DESC'
);
}
PayzenTools::getLogger()->logInfo("The current state for order #$order_id is $old_state.");
switch (true) {
case ($old_state == Configuration::get('PS_OS_ERROR')):
case ($old_state == Configuration::get('PS_OS_CANCELED')):
$msg = $payzen->isOney($payzen_response) ? 'FacilyPay Oney payment. ' : '';
PayzenTools::getLogger()->logInfo($msg."Order for cart #$cart_id is in a failed status.");
if ($payzen_response->isAcceptedPayment()) {
/* order saved with failed status while payment is successful */
if (number_format($order->total_paid, 2) != number_format($order->total_paid_real, 2)) {
/* amount paid not equals initial amount. */
PayzenTools::getLogger()->logWarning("Error: amount paid not equals initial amount. Order is in a failed status, cart #$cart_id.");
die($payzen_response->getOutputForPlatform('ko', 'Le montant payé est différent du montant intial'));
} else {
PayzenTools::getLogger()->logWarning("Error: payment success received from platform while order is in a failed status, cart #$cart_id.");
}
$msg = 'payment_ko_on_order_ok';
} else {
/* just display a failure confirmation message */
PayzenTools::getLogger()->logInfo("Payment failure confirmed for cart #$cart_id.");
$msg = 'payment_ko_already_done';
}
die($payzen_response->getOutputForPlatform($msg));
case (Configuration::get('PAYZEN_OS_ONEY_PENDING') && ($old_state == Configuration::get('PAYZEN_OS_ONEY_PENDING'))):
case (Configuration::get('PAYZEN_OS_TRANS_PENDING') && ($old_state == Configuration::get('PAYZEN_OS_TRANS_PENDING'))):
case (Configuration::get('PAYZEN_OS_AUTH_PENDING') && ($old_state == Configuration::get('PAYZEN_OS_AUTH_PENDING'))):
PayzenTools::getLogger()->logInfo("Order for cart #$cart_id is saved in pending state. Update order status according to payment result.");
if ($payzen_response->isPendingPayment() || ($payzen_response->isAcceptedPayment() && ($payzen->isSofort($payzen_response) || $payzen->isSepa($payzen_response)))) {
PayzenTools::getLogger()->logInfo("No changes for cart #$cart_id status, payment remains pending confirmation.");
$msg = 'payment_ok_already_done';
} elseif ($payzen_response->isAcceptedPayment()) {
/* order is pending, payment success : update order status */
if ($outofstock) {
if (Configuration::get('PS_OS_OUTOFSTOCK_PAID')) {
$new_state = Configuration::get('PS_OS_OUTOFSTOCK_PAID');
} else {
$new_state = Configuration::get('PAYZEN_OS_PAYMENT_OUTOFSTOCK');
}
} else {
$new_state = Configuration::get('PS_OS_PAYMENT');
}
PayzenTools::getLogger()->logInfo("Cart #$cart_id, payment is now accepted. New order status is $new_state.");
$payzen->setOrderState($order, $new_state, $payzen_response);
$msg = 'payment_ok';
} else {
/* order is pending, payment failed : update order status */
$new_state = $payzen_response->isCancelledPayment() ? Configuration::get('PS_OS_CANCELED') : Configuration::get('PS_OS_ERROR');
PayzenTools::getLogger()->logInfo("Cart #$cart_id, payment is now failed. New order status is $new_state.");
$payzen->setOrderState($order, $new_state, $payzen_response);
$msg = 'payment_ko';
}
die($payzen_response->getOutputForPlatform($msg));
case ($old_state == Configuration::get('PS_OS_PAYMENT')):
case (Configuration::get('PS_OS_OUTOFSTOCK_PAID') && ($old_state == Configuration::get('PS_OS_OUTOFSTOCK_PAID'))):
case (Configuration::get('PAYZEN_OS_PAYMENT_OUTOFSTOCK') && ($old_state == Configuration::get('PAYZEN_OS_PAYMENT_OUTOFSTOCK'))):
if ($payzen_response->isAcceptedPayment()) {
/* just display a confirmation message */
PayzenTools::getLogger()->logInfo("Payment success confirmed for cart #$cart_id.");
$msg = 'payment_ok_already_done';
} else {
/* order saved with success status while payment failed */
PayzenTools::getLogger()->logWarning("Error: payment failure received from platform while order is in a success status, cart #$cart_id.");
$msg = 'payment_ko_on_order_ok';
}
die($payzen_response->getOutputForPlatform($msg));
default:
PayzenTools::getLogger()->logWarning("Unknown order status for cart #$cart_id. Managed by merchant.");
die($payzen_response->getOutputForPlatform('ok', 'Statut de commande inconnu'));
}
}
}