281 lines
9.6 KiB
PHP
281 lines
9.6 KiB
PHP
<?php
|
|
|
|
class PaybynetCore
|
|
{
|
|
|
|
const PBN_BANK_PAYMENT_LINK = 'https://pbn.paybynet.com.pl/PayByNet/trans.do';
|
|
const PBN_TEST_BANK_PAYMENT_LINK = 'https://pbn.paybynet.com.pl/PayByNetT/trans.do';
|
|
|
|
const PBN_BANK_LINK = 'https://pbn.paybynet.com.pl/PayByNet/update/os/banks.xml';
|
|
const PBN_TEST_BANK_LINK = 'https://pbn.paybynet.com.pl/PayByNetT/update/os/banks.xml';
|
|
|
|
const PBN_BANK_IMG_LINK = 'https://pbn.paybynet.com.pl/PayByNet/update/os/';
|
|
const PBN_TEST_BANK_IMG_LINK = 'https://pbn.paybynet.com.pl/PayByNetT/update/os/';
|
|
|
|
const BANK_XML_FILE = 'banks.xml';
|
|
const SANDBOX_BANK_XML_FILE = 'banks_test.xml';
|
|
|
|
const LOG_FILE = 'log.txt';
|
|
const SANDBOX_LOG_FILE = 'log_test.txt';
|
|
|
|
const IMAGE_DIRECTORY = 'images/';
|
|
const SANDBOX_IMAGE_DIRECTORY = 'images_test/';
|
|
|
|
public $bank_xml_file_path;
|
|
public $log_file_path;
|
|
public $images_path;
|
|
|
|
public $sandbox = false;
|
|
public $log_operations = false;
|
|
|
|
public function __construct($config = array())
|
|
{
|
|
$main_path = dirname(__FILE__).'/../cache/';
|
|
$this->bank_xml_file_path = $main_path.self::BANK_XML_FILE;
|
|
$this->log_file_path = $main_path.self::LOG_FILE;
|
|
$this->images_path = $main_path.self::IMAGE_DIRECTORY;
|
|
if ($config['sandbox'] == 1) {
|
|
$this->sandbox = true;
|
|
$this->bank_xml_file_path = $main_path.self::SANDBOX_BANK_XML_FILE;
|
|
$this->log_file_path = $main_path.self::SANDBOX_LOG_FILE;
|
|
$this->images_path = $main_path.self::SANDBOX_IMAGE_DIRECTORY;
|
|
}
|
|
$this->log_operations = ($config['log'])?true:false;
|
|
|
|
$this->createDirectories();
|
|
}
|
|
|
|
public function getBankFormLink()
|
|
{
|
|
if ($this->sandbox) {
|
|
return self::PBN_TEST_BANK_PAYMENT_LINK;
|
|
}
|
|
return self::PBN_BANK_PAYMENT_LINK;
|
|
}
|
|
|
|
/**
|
|
* Create directories for storage bank images
|
|
*/
|
|
private function createDirectories()
|
|
{
|
|
if (!is_dir(dirname(__FILE__).'/../cache/')) {
|
|
mkdir(dirname(__FILE__).'/../cache/', 0777);
|
|
}
|
|
if (!is_dir($this->images_path)) {
|
|
mkdir($this->images_path, 0777);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generates cache if needed
|
|
* check if cached file exists and if it's new
|
|
* @return string XML
|
|
*/
|
|
public function getBanksXml()
|
|
{
|
|
$cache_file = $this->bank_xml_file_path;
|
|
$banks_list_xml_cache = array();
|
|
if (file_exists($cache_file)) {
|
|
$banks_list_xml_cache['xml'] = file_get_contents($cache_file);
|
|
$banks_list_xml_cache['last_mod'] = date ("Y-m-d", filemtime($cache_file));
|
|
}
|
|
if ($banks_list_xml_cache['last_mod'] == date("Y-m-d")) {
|
|
return $banks_list_xml_cache['xml'];
|
|
}
|
|
return $this->setBanksXmlCache();
|
|
}
|
|
|
|
public function removeBankFile()
|
|
{
|
|
$cache_file = $this->bank_xml_file_path;
|
|
if (file_exists($cache_file)) {
|
|
unlink($cache_file);
|
|
}
|
|
}
|
|
|
|
public function getBnaksFileTime()
|
|
{
|
|
$file = array(
|
|
'name' => 'no data',
|
|
'date' => 'no data'
|
|
);
|
|
$cache_file = $this->bank_xml_file_path;
|
|
if (file_exists($cache_file)) {
|
|
$file['date'] = date ("Y-m-d H:i:s", filemtime($cache_file));
|
|
$file['name'] = basename($cache_file);
|
|
}
|
|
return $file;
|
|
}
|
|
|
|
public function getBanksArray($with_cc = 1)
|
|
{
|
|
|
|
$banks_xml_string = $this->getBanksXml();
|
|
$banks_array = array();
|
|
try {
|
|
$banks_xml = new SimpleXMLElement( $banks_xml_string );
|
|
foreach ($banks_xml->bank as $bank) {
|
|
if ($with_cc == 0 && $bank->card == 1) {
|
|
continue;
|
|
}
|
|
if (is_file($this->images_path.$bank->image)) {
|
|
$banks_array[(string)$bank->id] = array(
|
|
'id' => (string)$bank->id,
|
|
'name' => (string)$bank->name,
|
|
'image' => (string)$bank->image,
|
|
'card' => (string)$bank->card
|
|
);
|
|
}
|
|
}
|
|
} catch ( Exception $e ) {
|
|
$msg = $e->getMessage();
|
|
$this->logOperation($msg, 'ERROR');
|
|
}
|
|
|
|
return $banks_array;
|
|
|
|
}
|
|
|
|
/**
|
|
* Saves cache with xml data
|
|
* @return string XML code
|
|
*/
|
|
private function setBanksXmlCache()
|
|
{
|
|
|
|
$link_banks_xml = self::PBN_BANK_LINK;
|
|
if ($this->sandbox == true) {
|
|
$link_banks_xml = self::PBN_TEST_BANK_LINK;
|
|
}
|
|
|
|
$cache_file = $this->bank_xml_file_path;
|
|
$banks_list_xml_for_caceh = file_get_contents( $link_banks_xml );
|
|
|
|
if ($banks_list_xml_for_caceh) {
|
|
try{
|
|
file_put_contents($cache_file, $banks_list_xml_for_caceh );
|
|
} catch ( Exception $e) {
|
|
$msg = $e->getMessage();
|
|
$this->logOperation($msg, 'ERROR');
|
|
}
|
|
$this->setBanksImagesCache();
|
|
}
|
|
return $banks_list_xml_for_caceh;
|
|
}
|
|
|
|
/**
|
|
* Generates cache
|
|
* with bank images porived form XML
|
|
*/
|
|
private function setBanksImagesCache()
|
|
{
|
|
$link_img_banks = self::PBN_BANK_IMG_LINK;
|
|
if ($this->sandbox == true) {
|
|
$link_img_banks = self::PBN_TEST_BANK_IMG_LINK;
|
|
}
|
|
|
|
$cache_file = $this->bank_xml_file_path;
|
|
$cache_img_dir = $this->images_path;
|
|
if (file_exists($cache_file))
|
|
{
|
|
$banks_xml_string = file_get_contents($cache_file);
|
|
try {
|
|
$banks_xml = new SimpleXMLElement( $banks_xml_string );
|
|
foreach ($banks_xml->bank as $bank) {
|
|
$img = file_get_contents( $link_img_banks . $bank->image);
|
|
if (!$img) {
|
|
$msg = 'download Image ' . $bank->image . ' failed';
|
|
$this->logOperation($msg, 'ERROR');
|
|
continue;
|
|
}
|
|
|
|
$write_img = file_put_contents($cache_img_dir . $bank->image, $img ) ;
|
|
if (!$write_img ){
|
|
$msg = 'write Image ' . $bank->image . ' failed';
|
|
$this->logOperation($msg, 'ERROR');
|
|
continue;
|
|
}
|
|
}
|
|
} catch ( Exception $e ) {
|
|
$msg = $e->getMessage();
|
|
$this->logOperation($msg, 'ERROR');
|
|
}
|
|
}
|
|
}
|
|
|
|
public function getFormElements($params)
|
|
{
|
|
if (is_numeric($params['paybynet_date_valid'])) {
|
|
$pay_time = (int)$params['paybynet_date_valid'] * 60;
|
|
} else {
|
|
$pay_time = 50000 * 60;
|
|
}
|
|
|
|
$date = new DateTime();
|
|
$date->add(new DateInterval('PT'.$pay_time.'S'));
|
|
|
|
$accname = trim($params['paybynet_name']) . '^NM^' . trim($params['paybynet_zip_code']) . '^ZP^' . trim($params['paybynet_city']) . '^CI^' . trim($params['paybynet_street']) . '^ST^' . trim($params['paybynet_country']) . '^CT^';
|
|
|
|
$parameters = array();
|
|
$parameters['id_client'] = '<id_client>'.$params['paybynet_id_client'].'</id_client>';
|
|
$parameters['id_trans'] = '<id_trans>'.sprintf("%010s", $params['id_trans']).'</id_trans>';
|
|
$parameters['date_valid'] = '<date_valid>' . $date->format('d-m-Y H:i:s') . '</date_valid>';
|
|
$parameters['amount'] = '<amount>' . number_format($params['amount'], 2,',','') . '</amount>';
|
|
$parameters['currency'] = '<currency>' . $params['paybynet_currency'] . '</currency>';
|
|
$parameters['email'] = '<email>' . $params['email'] . '</email>';
|
|
$parameters['account'] = '<account>' . $params['paybynet_account'] . '</account>';
|
|
$parameters['accname'] = '<accname>' . $accname . '</accname>';
|
|
$parameters['backpage'] = '<backpage>' . $params['backpage'] . '</backpage>';
|
|
$parameters['backpagereject'] = '<backpagereject>' . $params['backpage_reject'] . '</backpagereject>';
|
|
$parameters['password'] = '<password>' . $params['paybynet_password'] . '</password>';
|
|
$parameters['hash'] = '<hash>' . sha1($parameters['id_client'].$parameters['id_trans'].$parameters['date_valid'].$parameters['amount'].$parameters['currency'].$parameters['email'].$parameters['account'].$parameters['accname'].$parameters['backpage'].$parameters['backpagereject'].$parameters['password']).'</hash>';
|
|
$form = '';
|
|
|
|
foreach ($parameters as $key => $val) {
|
|
if ($key == 'password') {
|
|
continue;
|
|
}
|
|
$form .= $val;
|
|
}
|
|
return base64_encode($form);
|
|
}
|
|
|
|
public function transactionStatus($status_id)
|
|
{
|
|
$transaction_status = '';
|
|
switch ($status_id) {
|
|
case '2203':
|
|
case '2303':
|
|
$transaction_status = 'approved';
|
|
break;
|
|
case '2202':
|
|
case '2302':
|
|
$transaction_status = 'rejected';
|
|
break;
|
|
case '2201':
|
|
case '2301':
|
|
$transaction_status = 'expired';
|
|
break;
|
|
}
|
|
|
|
return $transaction_status;
|
|
}
|
|
|
|
/**
|
|
* Log operations to file
|
|
* LOG const defines if the log is gathered to file
|
|
* @param string $message
|
|
* @param string $type
|
|
*/
|
|
public function logOperation($message, $type = 'INFO')
|
|
{
|
|
if ($this->log_operations) {
|
|
// Bad place for log but it's stays here for now
|
|
$content = date("Y-m-d H:i:s") . " " . strtoupper($type) . ": " . $message;
|
|
$content_coded = base64_encode($content). PHP_EOL;
|
|
file_put_contents($this->log_file_path, $content_coded, FILE_APPEND ) ;
|
|
}
|
|
}
|
|
|
|
}
|