Skip to content

Commit

Permalink
Event signature authentication added
Browse files Browse the repository at this point in the history
  • Loading branch information
Fernando Ruiz Guzmán committed Jan 9, 2017
1 parent 7454800 commit 5e03d3a
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 13 deletions.
32 changes: 19 additions & 13 deletions conektaprestashop.php
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ private function _createPendingCashState()
*/
public function uninstall()
{
return parent::uninstall() && Configuration::deleteByName('CONEKTA_PRESTASHOP_VERSION') && Configuration::deleteByName('CONEKTA_MSI') && Configuration::deleteByName('CONEKTA_CARDS') && Configuration::deleteByName('CONEKTA_CASH') && Configuration::deleteByName('CONEKTA_BANORTE') && Configuration::deleteByName('CONEKTA_SPEI') && Configuration::deleteByName('CONEKTA_PUBLIC_KEY_TEST') && Configuration::deleteByName('CONEKTA_PUBLIC_KEY_LIVE') && Configuration::deleteByName('CONEKTA_MODE') && Configuration::deleteByName('CONEKTA_PRIVATE_KEY_TEST') && Configuration::deleteByName('CONEKTA_PRIVATE_KEY_LIVE') && Configuration::deleteByName('CONEKTA_PAYMENT_ORDER_STATUS') && Configuration::deleteByName('CONEKTA_WEBHOOK') && Configuration::deleteByName('CONEKTA_WEBHOOK_FAILED_ATTEMPTS') && Configuration::deleteByName('CONEKTA_WEBHOOK_ERROR_MESSAGE') && Configuration::deleteByName('CONEKTA_WEBHOOK_FAILED_URL') && Db::getInstance()->Execute('DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'conekta_customer`') && Db::getInstance()->Execute('DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'conekta_transaction`');
return parent::uninstall() && Configuration::deleteByName('CONEKTA_PRESTASHOP_VERSION') && Configuration::deleteByName('CONEKTA_MSI') && Configuration::deleteByName('CONEKTA_CARDS') && Configuration::deleteByName('CONEKTA_CASH') && Configuration::deleteByName('CONEKTA_BANORTE') && Configuration::deleteByName('CONEKTA_SPEI') && Configuration::deleteByName('CONEKTA_PUBLIC_KEY_TEST') && Configuration::deleteByName('CONEKTA_PUBLIC_KEY_LIVE') && Configuration::deleteByName('CONEKTA_MODE') && Configuration::deleteByName('CONEKTA_PRIVATE_KEY_TEST') && Configuration::deleteByName('CONEKTA_PRIVATE_KEY_LIVE') && Configuration::deleteByName('CONEKTA_SIGNATURE_KEY_LIVE') && Configuration::deleteByName('CONEKTA_SIGNATURE_KEY_TEST') && Configuration::deleteByName('CONEKTA_PAYMENT_ORDER_STATUS') && Configuration::deleteByName('CONEKTA_WEBHOOK') && Configuration::deleteByName('CONEKTA_WEBHOOK_FAILED_ATTEMPTS') && Configuration::deleteByName('CONEKTA_WEBHOOK_ERROR_MESSAGE') && Configuration::deleteByName('CONEKTA_WEBHOOK_FAILED_URL') && Db::getInstance()->Execute('DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'conekta_customer`') && Db::getInstance()->Execute('DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'conekta_transaction`');
}

/**
Expand Down Expand Up @@ -602,11 +602,13 @@ public function processPayment($token, $type, $monthly_installments)
array(
'source' => array(
'type' => 'card',
'token_id' => $token,
'monthly_installments' => $monthly_installments > 1 ? $monthly_installments : null
'token_id' => $token
),
'amount' => $amount
);
if($monthly_installments > 1){
array_merge($charge_params->source, array('monthly_installments' => $monthly_installments)) ;
}
$charge_response = $order->createCharge($charge_params);
$order_status = (int)Configuration::get('PS_OS_PAYMENT');
$message = $this->l('Conekta Transaction Details:') . "\n\n" . $this->l('Amount:') . ' ' . ($charge_response->amount * 0.01) . "\n" . $this->l('Status:') . ' ' . ($charge_response->status == 'paid' ? $this->l('Paid') : $this->l('Unpaid')) . "\n" . $this->l('Processed on:') . ' ' . strftime('%Y-%m-%d %H:%M:%S', $charge_response->created_at) . "\n" . $this->l('Currency:') . ' ' . Tools::strtoupper($charge_response->currency) . "\n" . $this->l('Mode:') . ' ' . ($charge_response->livemode == 'true' ? $this->l('Live') : $this->l('Test')) . "\n";
Expand Down Expand Up @@ -770,16 +772,18 @@ public function getContent()

if ($submitConfigEvent) {
$configuration_values = array(
'CONEKTA_MODE' => Tools::getValue('conekta_mode') ,
'CONEKTA_PUBLIC_KEY_TEST' => rtrim(Tools::getValue('conekta_public_key_test')) ,
'CONEKTA_PUBLIC_KEY_LIVE' => rtrim(Tools::getValue('conekta_public_key_live')) ,
'CONEKTA_PRIVATE_KEY_TEST' => rtrim(Tools::getValue('conekta_private_key_test')) ,
'CONEKTA_PRIVATE_KEY_LIVE' => rtrim(Tools::getValue('conekta_private_key_live')) ,
'CONEKTA_CARDS' => rtrim(Tools::getValue('conekta_cards')) ,
'CONEKTA_MSI' => rtrim(Tools::getValue('conekta_msi')) ,
'CONEKTA_CASH' => rtrim(Tools::getValue('conekta_cash')) ,
'CONEKTA_BANORTE' => rtrim(Tools::getValue('conekta_banorte')) ,
'CONEKTA_SPEI' => rtrim(Tools::getValue('conekta_spei'))
'CONEKTA_MODE' => Tools::getValue('conekta_mode') ,
'CONEKTA_PUBLIC_KEY_TEST' => rtrim(Tools::getValue('conekta_public_key_test')) ,
'CONEKTA_PUBLIC_KEY_LIVE' => rtrim(Tools::getValue('conekta_public_key_live')) ,
'CONEKTA_PRIVATE_KEY_TEST' => rtrim(Tools::getValue('conekta_private_key_test')) ,
'CONEKTA_PRIVATE_KEY_LIVE' => rtrim(Tools::getValue('conekta_private_key_live')) ,
'CONEKTA_CARDS' => rtrim(Tools::getValue('conekta_cards')) ,
'CONEKTA_MSI' => rtrim(Tools::getValue('conekta_msi')) ,
'CONEKTA_CASH' => rtrim(Tools::getValue('conekta_cash')) ,
'CONEKTA_BANORTE' => rtrim(Tools::getValue('conekta_banorte')) ,
'CONEKTA_SPEI' => rtrim(Tools::getValue('conekta_spei')),
'CONEKTA_SIGNATURE_KEY_TEST' => rtrim(Tools::getValue('conekta_signature_key_test')),
'CONEKTA_SIGNATURE_KEY_LIVE' => rtrim(Tools::getValue('conekta_signature_key_live'))
);

foreach ($configuration_values as $configuration_key => $configuration_value) {
Expand Down Expand Up @@ -829,6 +833,8 @@ public function getContent()
$this->smarty->assign("conekta_private_key_test", Configuration::get('CONEKTA_PRIVATE_KEY_TEST'));
$this->smarty->assign("conekta_public_key_live", Configuration::get('CONEKTA_PUBLIC_KEY_LIVE'));
$this->smarty->assign("conekta_private_key_live", Configuration::get('CONEKTA_PRIVATE_KEY_LIVE'));
$this->smarty->assign("conekta_signature_key_test", Configuration::get('CONEKTA_SIGNATURE_KEY_TEST'));
$this->smarty->assign("conekta_signature_key_live", Configuration::get('CONEKTA_SIGNATURE_KEY_LIVE'));


$this->smarty->assign("url", $url);
Expand Down
28 changes: 28 additions & 0 deletions notification.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
// To configure, add webhook in account storename.com/modules/conektaefectivo/notification.php

$body = Tools::file_get_contents('php://input');
authenticateEvent($body, $_SERVER['HTTP_DIGEST']);
$event_json = Tools::jsonDecode($body);

if ($event_json->type == 'charge.paid') {
Expand All @@ -46,5 +47,32 @@
}
}

function authenticateEvent($body, $digest) {
if (Configuration::get('CONEKTA_MODE')) {
$private_key_string = Configuration::get('CONEKTA_SIGNATURE_KEY_LIVE');
} else {
$private_key_string = Configuration::get('CONEKTA_SIGNATURE_KEY_TEST');
}
if (!empty($private_key_string) && !empty($body)) {
if (!empty($digest)) {
$private_key = openssl_pkey_get_private($private_key_string);
$encrypted_message = base64_decode($digest);
$sha256_message = "";
openssl_private_decrypt($encrypted_message, $sha256_message, $private_key);
if (hash("sha256", $body) != $sha256_message) {
authenticateLogger("unauthenticated event");
}
} else {
authenticateLogger("Empty digest");
}
}
}

function authenticateLogger($log_message){
if (version_compare(_PS_VERSION_, '1.4.0.3', '>') && class_exists('Logger')) {
Logger::addLog($log_message, 1, null,'notification', '');
}
}

header('HTTP/1.1 200 OK');
exit;
18 changes: 18 additions & 0 deletions views/templates/hook/content.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,24 @@
<input name="conekta_public_key_live" value="{$conekta_public_key_live|escape:'htmlall':'UTF-8'}" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-lg-3">
{l s='Signature Test Key' mod='conektaprestashop'}
</label>
<div class="col-lg-3">
<textarea name="conekta_signature_key_test" class="form-control" rows="5" value="" type="text">{$conekta_signature_key_test|escape:'htmlall':'UTF-8'}</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-lg-3">
{l s='Signature Live Key' mod='conektaprestashop'}
</label>
<div class="col-lg-3">
<textarea name="conekta_signature_key_live" class="form-control" rows="5" value="" type="text">
{$conekta_signature_key_live|escape:'htmlall':'UTF-8'}
</textarea>
</div>
</div>
</div>

<div class="panel-footer">
Expand Down

0 comments on commit 5e03d3a

Please sign in to comment.