233 lines
4.6 KiB
PHP
Executable File
233 lines
4.6 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Vn;
|
|
|
|
require_once ('vn/hedera/init.php');
|
|
require_once ('vn/db/db.php');
|
|
require_once ('vn/lib/log.php');
|
|
require_once ('vn/tpv/soap-method.php');
|
|
|
|
use Vn\Lib\Log;
|
|
|
|
class Tpv
|
|
{
|
|
static $conn;
|
|
|
|
/**
|
|
* Initializes the class.
|
|
**/
|
|
static function init ()
|
|
{
|
|
global $conf;
|
|
|
|
self::$conn = new Db\Conn ();
|
|
self::$conn->open (
|
|
$conf['db']['host']
|
|
,$conf['db']['user']
|
|
,base64_decode ($conf['db']['pass'])
|
|
,$conf['db']['schema']
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Deinitializes the class.
|
|
**/
|
|
static function deinit ()
|
|
{
|
|
self::$conn->close ();
|
|
}
|
|
|
|
/**
|
|
* Gets transaction confirmations from the IMAP mailbox.
|
|
**/
|
|
static function getFromMailbox ()
|
|
{
|
|
Log::init (Hedera\_LOG_DIR .'/hedera-web.log');
|
|
self::init ();
|
|
|
|
$imap = NULL;
|
|
|
|
if (self::$conn->isOpen ())
|
|
{
|
|
$imapConf = self::$conn->getRow (
|
|
'SELECT host, user, pass, clean_period, success_folder, error_folder '
|
|
.'FROM tpv_imap_config'
|
|
);
|
|
|
|
if ($imapConf)
|
|
{
|
|
$mailbox = sprintf ('{%s/imap/ssl/novalidate-cert}INBOX',
|
|
$imapConf['host']);
|
|
|
|
$imap = imap_open ($mailbox
|
|
,$imapConf['user']
|
|
,base64_decode ($imapConf['pass'])
|
|
);
|
|
}
|
|
}
|
|
|
|
if ($imap)
|
|
{
|
|
// Fetchs and confirms new transaction mails
|
|
|
|
$inbox = imap_search ($imap, 'ALL');
|
|
|
|
if ($inbox)
|
|
foreach ($inbox as $msg)
|
|
{
|
|
// Decodes the mail body
|
|
|
|
$params = [];
|
|
$body = imap_fetchbody ($imap, $msg, '1');
|
|
$strings = explode (';', $body);
|
|
|
|
foreach ($strings as $string)
|
|
{
|
|
$x = explode (':', $string);
|
|
$params[trim ($x[0])] = trim ($x[1]);
|
|
}
|
|
|
|
// Confirms the transaction
|
|
|
|
$success = self::confirm ($params);
|
|
|
|
// Moves the processed mail to another folder
|
|
|
|
if ($success)
|
|
$folder = $imapConf['success_folder'];
|
|
else
|
|
$folder = $imapConf['error_folder'];
|
|
|
|
$folder = sprintf ('INBOX.%s', $folder);
|
|
|
|
if (!imap_mail_move ($imap, $msg, $folder))
|
|
Log::write ('TPV: IMAP: Can\'t move message to %s: %s'
|
|
,$folder
|
|
,imap_last_error ()
|
|
);
|
|
}
|
|
|
|
if ($inbox && ($count = count ($inbox)) > 0)
|
|
Log::write ('TPV: %d mails processed.', $count);
|
|
|
|
imap_expunge ($imap);
|
|
|
|
// Cleans the old mails
|
|
|
|
if (rand (1, 20) == 1)
|
|
{
|
|
$folders = array (
|
|
$imapConf['success_folder']
|
|
,$imapConf['error_folder']
|
|
);
|
|
|
|
$deleted = 0;
|
|
$date = new \DateTime (NULL);
|
|
$date->sub (new \DateInterval ($imapConf['clean_period']));
|
|
$filter = sprintf ('BEFORE "%s"', $date->format('D, j M Y'));
|
|
|
|
foreach ($folders as $folder)
|
|
if (imap_reopen ($imap, $mailbox.'.'.$folder))
|
|
if ($messages = imap_search ($imap, $filter))
|
|
{
|
|
foreach ($messages as $message)
|
|
imap_delete ($imap, $message);
|
|
|
|
imap_expunge ($imap);
|
|
$deleted += count ($messages);
|
|
}
|
|
|
|
Log::write ('TPV: Cleaner: %d mails deleted.', $deleted);
|
|
}
|
|
|
|
imap_close ($imap);
|
|
}
|
|
else
|
|
Log::write ('TPV: IMAP: %s', imap_last_error ());
|
|
|
|
self::deinit ();
|
|
Log::close ();
|
|
}
|
|
|
|
/**
|
|
* Gets transaction confirmation from HTTP POST.
|
|
**/
|
|
static function getFromPost ()
|
|
{
|
|
self::init ();
|
|
|
|
if (self::$conn->isOpen ())
|
|
self::confirm ($_POST);
|
|
|
|
self::deinit ();
|
|
}
|
|
|
|
/**
|
|
* Gets transaction confirmation from SOAP service.
|
|
**/
|
|
static function getFromSoap ()
|
|
{
|
|
ini_set ('soap.wsdl_cache_enabled', FALSE);
|
|
|
|
$server = new \SoapServer (__DIR__ .'/soap.wsdl');
|
|
$server->addFunction ('procesaNotificacionSIS');
|
|
$server->handle ();
|
|
}
|
|
|
|
/**
|
|
* Tryes to confirm a transaction with the given params.
|
|
**/
|
|
static function confirm ($params)
|
|
{
|
|
if (isset ($params['Ds_Amount'])
|
|
&& isset ($params['Ds_Order'])
|
|
&& isset ($params['Ds_MerchantCode'])
|
|
&& isset ($params['Ds_Currency'])
|
|
&& isset ($params['Ds_Response'])
|
|
&& isset ($params['Ds_Signature']))
|
|
{
|
|
if (isset ($params['Ds_ErrorCode']))
|
|
$error = $params['Ds_ErrorCode'];
|
|
else
|
|
$error = NULL;
|
|
|
|
try {
|
|
return self::$conn->query (
|
|
'CALL transaction_confirm_with_check (#, #, #, #, #, #, #)',
|
|
[
|
|
$params['Ds_Amount']
|
|
,$params['Ds_Order']
|
|
,$params['Ds_MerchantCode']
|
|
,$params['Ds_Currency']
|
|
,$params['Ds_Response']
|
|
,$params['Ds_Signature']
|
|
,$error
|
|
]
|
|
);
|
|
}
|
|
catch (\Exception $e)
|
|
{
|
|
Log::write ("TPV: DB: %s", $e->getMessage ());
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* Tests the confirmation process. The corresponding record
|
|
* must exist in the `tpv_transaction` table.
|
|
**/
|
|
static function test ($order)
|
|
{
|
|
self::init ();
|
|
|
|
if (self::$conn->isOpen () && isset ($order))
|
|
self::$conn->query ('CALL transaction_confirm_by_id (#)', [$order]);
|
|
|
|
self::deinit ();
|
|
}
|
|
}
|
|
|
|
?>
|