Skip to content

Instantly share code, notes, and snippets.

@GiovanniCavallari
Last active October 26, 2020 21:01
Show Gist options
  • Save GiovanniCavallari/9f0179840590fd3b3f1d982f71513a64 to your computer and use it in GitHub Desktop.
Save GiovanniCavallari/9f0179840590fd3b3f1d982f71513a64 to your computer and use it in GitHub Desktop.
<?php
/**
* 2007-2020 PrestaShop
*
* 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
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <[email protected]>
* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*
* Don't forget to prefix your containers with your own identifier
* to avoid any conflicts with others containers.
*/
require_once MP_ROOT_URL . '/includes/module/notification/AbstractNotification.php';
class WebhookNotification extends AbstractNotification
{
public $payment;
public function __construct($transaction_id, $customer_secure_key)
{
parent::__construct($transaction_id, $customer_secure_key);
$this->payment = $this->mercadopago->getPaymentStandard($transaction_id);
}
/**
* Receive and treat the notification
*
* @param mixed $cart
* @return void
*/
public function receiveNotification($cart)
{
$this->verifyWebhook($cart);
$this->total = $this->getTotal($cart);
$orderId = Order::getOrderByCartId($cart->id);
if ($orderId != 0) {
$this->verifyCustomPayment();
$db_status = $this->verifyStatusOnDatabase($cart);
if ($this->status == $db_status) {
MPLog::generate(
'Payment status is the same (database status: '.$db_status.' - payment status: '.$this->status.')',
'warning'
);
$this->getNotificationResponse(
'Payment status is the same (database status: '.$db_status.' - payment status: '.$this->status.')',
422
);
return;
}
$this->validateOrderState();
$baseOrder = new Order($orderId);
$orders = Order::getByReference($baseOrder->reference);
foreach ($orders as $order) {
$this->order_id = $order->id;
$this->updateOrder($cart);
}
}
}
/**
* Create order for custom payments without notification
*
* @param mixed $cart
* @return void
*/
public function createCustomOrder($cart)
{
$this->total = $this->getTotal($cart);
$this->verifyCustomPayment();
$this->validateOrderState();
if ($this->order_id == 0 && $this->amount >= $this->total && $this->status != 'rejected') {
$this->createOrder($cart, true);
}
}
/**
* Verify custom payments
*
* @return void
*/
public function verifyCustomPayment()
{
$this->status = $this->payment['status'];
$this->payments_data['payments_id'] = $this->payment['id'];
$this->payments_data['payments_type'] = $this->payment['payment_type_id'];
$this->payments_data['payments_method'] = $this->payment['payment_method_id'];
$this->payments_data['payments_amount'] = $this->payment['transaction_amount'];
$this->payments_data['payments_status'] = $this->status;
if ($this->status == 'approved') {
$this->approved += $this->payment['transaction_amount'];
} elseif ($this->status == 'in_process' || $this->status == 'pending' || $this->status == 'authorized') {
$this->pending += $this->payment['transaction_amount'];
}
}
public function verifyStatusOnDatabase($cart)
{
$result = $this->mp_transaction->where('cart_id', '=', (int) $cart->id)->get();
return $result['payment_status'];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment