name = 'paybynet'; $this->tab = 'payments_gateways'; $this->version = '1.0'; $this->author = 'KIR'; $this->display = 'view'; $this->is_eu_compatible = 1; $this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_); $this->controllers = array('payment', 'validation'); $this->bootstrap = true; $this->currencies = true; $this->currencies_mode = 'checkbox'; parent::__construct(); $this->displayName = $this->l('PayByNet'); $this->description = $this->l('Paybynet jest jedynym w Polsce systemem do realizacji płatności przez Internet bezpośrednio z konta bankowego klienta na konto sklepu.'); $this->confirmUninstall = $this->l('Are you sure you want to delete your details?'); $this->module_link = $this->context->link->getAdminLink('AdminModules', true).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; } public function install() { if (!parent::install()) { return false; } if (!$this->registerHooks()) { return false; } if ( !Configuration::updateValue('PAYBYNET_NAME', '') || !Configuration::updateValue('PAYBYNET_SHOW_TYPE', '') || !Configuration::updateValue('PAYBYNET_ZIP_CODE', '') || !Configuration::updateValue('PAYBYNET_CITY', '') || !Configuration::updateValue('PAYBYNET_STREET', '') || !Configuration::updateValue('PAYBYNET_COUNTRY', 'Polska') || !Configuration::updateValue('PAYBYNET_ACCOUNT', '') || !Configuration::updateValue('PAYBYNET_CURRENCY', 'PLN') || !Configuration::updateValue('PAYBYNET_DATE_VALID', '30') || !Configuration::updateValue('PAYBYNET_ID_CLIENT', '') || !Configuration::updateValue('PAYBYNET_PASSWORD', '') || !Configuration::updateValue('PAYBYNET_SHOW_BANKS', '0') || !Configuration::updateValue('PAYBYNET_CC_ACTIVE', '0') || !Configuration::updateValue('PAYBYNET_SANDBOX', '1') || !Configuration::updateValue('PAYBYNET_SORAGE_LOGS', '1') ) { return false; } return true; } private function registerHooks() { if (!$this->registerHook('paymentOptions') || !$this->registerHook('displayOrderConfirmation') || !$this->registerHook('paymentReturn') || !$this->registerHook('displayAdminOrder') || !$this->registerHook('actionOrderStatusPostUpdate') || !$this->registerHook('actionOrderStatusUpdate') || !$this->registerHook('actionAdminControllerSetMedia') || !$this->registerHook('backOfficeHeader') || !$this->registerHook('header') || !$this->_crateOrderStates()) { return false; } return true; } public function uninstall() { if ( !Configuration::deleteByName('PAYBYNET_NAME') || !Configuration::deleteByName('PAYBYNET_SHOW_TYPE') || !Configuration::deleteByName('PAYBYNET_ZIP_CODE') || !Configuration::deleteByName('PAYBYNET_CITY') || !Configuration::deleteByName('PAYBYNET_STREET') || !Configuration::deleteByName('PAYBYNET_COUNTRY') || !Configuration::deleteByName('PAYBYNET_ACCOUNT') || !Configuration::deleteByName('PAYBYNET_CURRENCY') || !Configuration::deleteByName('PAYBYNET_DATE_VALID') || !Configuration::deleteByName('PAYBYNET_ID_CLIENT') || !Configuration::deleteByName('PAYBYNET_PASSWORD') || !Configuration::deleteByName('PAYBYNET_SHOW_BANKS') || !Configuration::deleteByName('PAYBYNET_CC_ACTIVE') || !Configuration::deleteByName('PAYBYNET_SANDBOX') || !Configuration::deleteByName('PAYBYNET_SORAGE_LOGS') || !parent::uninstall() ) { return false; } return true; } private function _crateOrderStates() { if (!Configuration::get('PAYBYNET_ORDERSTATE_WAITING_PAYMENT')) { $order_state = new OrderState(); $order_state->name = array(); foreach (Language::getLanguages(false) as $language) if (Tools::strtolower($language['iso_code']) == 'pl') { $order_state->name[(int)$language['id_lang']] = 'Oczekiwanie na płatność PayByNet'; } else { $order_state->name[(int)$language['id_lang']] = 'Pending payment PayByNet'; } $order_state->color = '#4169E1'; $order_state->hidden = false; $order_state->send_email = false; $order_state->delivery = false; $order_state->logable = false; $order_state->invoice = false; $order_state->unremovable = true; if ($order_state->add()) { Configuration::updateValue('PAYBYNET_ORDERSTATE_WAITING_PAYMENT', $order_state->id); copy($this->_path.'logo.gif', $this->_path.'../../img/os/'.(int)$order_state->id.'.gif'); } else { return false; } } if (!Configuration::get('PAYBYNET_ORDERSTATE_EXPIRED_PAYMENT')) { $order_state = new OrderState(); $order_state->name = array(); foreach (Language::getLanguages(false) as $language) if (Tools::strtolower($language['iso_code']) == 'pl') { $order_state->name[(int)$language['id_lang']] = 'Płatność przeterminowana PayByNet'; } else { $order_state->name[(int)$language['id_lang']] = 'Payment Expired PayByNet'; } $order_state->color = '#8f0621'; $order_state->hidden = false; $order_state->send_email = false; $order_state->delivery = false; $order_state->logable = false; $order_state->invoice = false; $order_state->unremovable = true; if ($order_state->add()) { Configuration::updateValue('PAYBYNET_ORDERSTATE_EXPIRED_PAYMENT', $order_state->id); copy($this->_path.'logo.gif', $this->_path.'../../img/os/'.(int)$order_state->id.'.gif'); } else { return false; } } if (!Configuration::get('PAYBYNET_ORDERSTATE_REJECTED_PAYMENT')) { $order_state = new OrderState(); $order_state->name = array(); foreach (Language::getLanguages(false) as $language) if (Tools::strtolower($language['iso_code']) == 'pl') { $order_state->name[(int)$language['id_lang']] = 'Płatność odrzucona PayByNet'; } else { $order_state->name[(int)$language['id_lang']] = 'Payment Rejected PayByNet'; } $order_state->color = '#8f0621'; $order_state->hidden = false; $order_state->send_email = false; $order_state->delivery = false; $order_state->logable = false; $order_state->invoice = false; $order_state->unremovable = true; if ($order_state->add()) { Configuration::updateValue('PAYBYNET_ORDERSTATE_REJECTED_PAYMENT', $order_state->id); copy($this->_path.'logo.gif', $this->_path.'../../img/os/'.(int)$order_state->id.'.gif'); } else { return false; } } if (!Configuration::get('PAYBYNET_ORDERSTATE_ACCEPTED_PAYMENT')) { $order_state = new OrderState(); $order_state->name = array(); foreach (Language::getLanguages(false) as $language) if (Tools::strtolower($language['iso_code']) == 'pl') { $order_state->name[(int)$language['id_lang']] = 'Płatność przyjęta PayByNet'; } else { $order_state->name[(int)$language['id_lang']] = 'Payment Accepted PayByNet'; } $order_state->color = '#32CD32'; $order_state->hidden = false; $order_state->send_email = false; $order_state->delivery = false; $order_state->logable = false; $order_state->unremovable = true; if ($order_state->add()) { Configuration::updateValue('PAYBYNET_ORDERSTATE_ACCEPTED_PAYMENT', $order_state->id); copy($this->_path.'logo.gif', $this->_path.'../../img/os/'.(int)$order_state->id.'.gif'); } else { return false; } } return true; } public function hookPaymentOptions($params) { $payment_options = new PaymentOption(); $action_text = $this->l('PayByNet'); $payments = $this->paymentOptionsByBank(); $paymentBanks = array(); if (Configuration::get('PAYBYNET_SHOW_TYPE') == 2) { if ($payments['banks_acvite']) { foreach ($payments['banks'] as $bank) { $payment_option = new PaymentOption(); $payment_option->setModuleName($this->l('PayByNet')); $additionalInfo = $this->l('Payment "%s" is supported by: %s'); $additionalInfo = sprintf($additionalInfo, '' . $bank['name'] . '', '' . $this->l('PayByNet') . ''); $payment_option->setAdditionalInformation('

' . $additionalInfo . '


'); $payment_option->setLogo(Media::getMediaPath($payments['icon_path'] . $bank['image'])); $payment_option->setAction($this->context->link->getModuleLink($this->name, 'submit', array('bank_id' => $bank['id']), true)); $paymentBanks[] = $payment_option; } } } elseif (Configuration::get('PAYBYNET_SHOW_TYPE') == 1) { $payment_option = new PaymentOption(); $payment_option->setModuleName($this->l('PayByNet')); $payment_option->setLogo(Media::getMediaPath($payments['icon_path'] . 'paybynet_logo_banks.jpg')); $payment_option->setAction($this->context->link->getModuleLink($this->name, 'submit', array(), true)); $paymentBanks[] = $payment_option; } else { $payment_option = new PaymentOption(); $payment_option->setModuleName($this->l('PayByNet')); $payment_option->setLogo(Media::getMediaPath($payments['icon_path'] . 'paybynet_logo.jpg')); $payment_option->setAction($this->context->link->getModuleLink($this->name, 'submit', array(), true)); $paymentBanks[] = $payment_option; } return $paymentBanks; } public function hookHeader() { if (Tools::getValue('controller') == 'order') { $this->context->controller->addCSS($this->_path . '/views/css/payment-options.css', 'all'); $this->context->controller->addJS($this->_path . '/views/js/payment-options.js', 'all'); } } private function paymentOptionsByBank() { $validation_configuration = $this->validateFormConfiguration(); $validation_data = $this->validateFormData(); if ($validation_configuration['status'] || $validation_data['status']) { return; } $banks = ''; $icon_path = _PS_MODULE_DIR_ . $this->name . '/'; $config = array( 'sandbox' => Configuration::get('PAYBYNET_SANDBOX'), 'log' => Configuration::get('PAYBYNET_SORAGE_LOGS') ); if (Configuration::get('PAYBYNET_SHOW_TYPE') == 2) { $paybynet_core = new PaybynetCore($config); $banks = $paybynet_core->getBanksArray(Configuration::get('PAYBYNET_CC_ACTIVE')); $icon_path .= 'cache/images/'; if (Configuration::get('PAYBYNET_SANDBOX')) { $icon_path .= 'cache/images_test/'; } } if (_PS_VERSION_ < '1.5'){ $redirect_url = Tools::getShopDomainSsl(true).__PS_BASE_URI__.'modules/'.$this->name.'/payment.php'; } else { $redirect_url = Context::getContext()->link->getModuleLink($this->name, 'payment'); } return array( // 'banks_acvite' => Configuration::get('PAYBYNET_SHOW_BANKS'), 'banks_acvite' => 1, 'banks' => $banks, 'icon_path' => $icon_path, 'module_path' => $this->_path, 'icon_path' => $icon_path, 'redirect_url' => $redirect_url ); // $this->smarty->assign(array( // 'banks_acvite' => Configuration::get('PAYBYNET_SHOW_BANKS'), 'banks_acvite' => 0, 'banks' => $banks, 'icon_path' => $icon_path, 'module_path' => $this->_path, 'redirect_url' => $redirect_url )); if (Configuration::get('PAYBYNET_SHOW_TYPE') == 2) { return $this->fetch('module:paybynet/views/templates/hook/payment.tpl'); } if (Configuration::get('PAYBYNET_SHOW_TYPE') == 1) { return $this->fetch('module:paybynet/views/templates/hook/payment_banner_with_banks.tpl'); } return $this->fetch('module:paybynet/views/templates/hook/payment_banner_pbn.tpl'); } public function hookActionAdminControllerSetMedia() { if (Tools::getValue('controller') == "AdminOrders" && Tools::getValue('id_order')) { } } public function hookPayment($params) { $validation_configuration = $this->validateFormConfiguration(); $validation_data = $this->validateFormData(); if ($validation_configuration['status'] || $validation_data['status']) { return; } $banks = ''; $config = array( 'sandbox' => Configuration::get('PAYBYNET_SANDBOX'), 'log' => Configuration::get('PAYBYNET_SORAGE_LOGS') ); $paybynet_core = new PaybynetCore($config); $banks = $paybynet_core->getBanksArray(Configuration::get('PAYBYNET_CC_ACTIVE')); $icon_paht = $this->_path.'cache/images/'; if (Configuration::get('PAYBYNET_SANDBOX')) { $icon_paht = $this->_path.'cache/images_test/'; } if (_PS_VERSION_ < '1.5'){ $redirect_url = Tools::getShopDomainSsl(true).__PS_BASE_URI__.'modules/'.$this->name.'/payment.php'; } else { $redirect_url = Context::getContext()->link->getModuleLink($this->name, 'payment'); } $this->smarty->assign(array( 'banks_acvite' => 1, 'banks' => $banks, 'icon_path' => $icon_paht, 'module_path' => $this->_path, 'redirect_url' => $redirect_url )); return $this->display($this->_path, '/views/templates/hook/payment.tpl'); } public function hookBackOfficeHeader() { if (Tools::getValue('configure') != 'paybynet') { return; } $this->context->controller->addCSS($this->_path.'views/css/admin-theme.css', 'all'); } public function getContent() { if (Tools::isSubmit('save_configuration')) { Configuration::updateValue('PAYBYNET_DATE_VALID', trim(Tools::getValue('paybynet_date_valid'))); Configuration::updateValue('PAYBYNET_SHOW_TYPE', trim(Tools::getValue('paybynet_show_type'))); Configuration::updateValue('PAYBYNET_SHOW_BANKS', Tools::getValue('paybynet_show_banks')); Configuration::updateValue('PAYBYNET_CC_ACTIVE', Tools::getValue('paybynet_cc_active')); Configuration::updateValue('PAYBYNET_SANDBOX', Tools::getValue('paybynet_sandbox')); Configuration::updateValue('PAYBYNET_SORAGE_LOGS', Tools::getValue('paybynet_sorage_logs')); } if (Tools::isSubmit('save_data')) { Configuration::updateValue('PAYBYNET_NAME', trim(Tools::getValue('paybynet_name'))); Configuration::updateValue('PAYBYNET_ZIP_CODE', trim(Tools::getValue('paybynet_zip_code'))); Configuration::updateValue('PAYBYNET_CITY', trim(Tools::getValue('paybynet_city'))); Configuration::updateValue('PAYBYNET_STREET', trim(Tools::getValue('paybynet_street'))); Configuration::updateValue('PAYBYNET_COUNTRY', trim(Tools::getValue('paybynet_country'))); Configuration::updateValue('PAYBYNET_ACCOUNT', str_replace(array('-',' '), array('','',), trim(Tools::getValue('paybynet_account')))); Configuration::updateValue('PAYBYNET_CURRENCY', trim(Tools::getValue('paybynet_currency'))); Configuration::updateValue('PAYBYNET_ID_CLIENT', str_replace(array('-',' '), array('','',), trim(Tools::getValue('paybynet_id_client')))); Configuration::updateValue('PAYBYNET_PASSWORD', trim(Tools::getValue('paybynet_password'))); } $config = array( 'sandbox' => Configuration::get('PAYBYNET_SANDBOX'), 'log' => Configuration::get('PAYBYNET_SORAGE_LOGS') ); $pbn = new PaybynetCore($config); if (Tools::isSubmit('bank_list_refresh')) { $pbn->removeBankFile(); } $bank_list = $pbn->getBanksArray(); $bank_file_info = $pbn->getBnaksFileTime(); $bank_image_path = $this->_path.'cache/images/'; if ($config['sandbox'] == 1) { $bank_image_path = $this->_path.'cache/images_test/'; } $this->smarty->assign(array( 'path' => $this->_path, 'index' => 'index.php?controller='.Tools::safeOutput(Tools::getValue('controller')), 'module' => $this->name, 'token' => Tools::safeOutput(Tools::getValue('token')), 'lang' => Context::getContext()->language->iso_code, 'form_values' => $this->getFormValues(), 'validate_configuration' => $this->validateFormConfiguration(), 'validate_data' => $this->validateFormData(), 'update_order_status_link' => _PS_BASE_URL_.'/modules/paybynet/update_transaction.php', 'file_info' => $bank_file_info, 'bank_list' => $bank_list, 'bank_image_path' => $bank_image_path )); return $this->display($this->_path, 'views/templates/admin/configuration.tpl'); } private function getFormValues() { $form_values = array(); $form_values['paybynet_name'] = Configuration::get('PAYBYNET_NAME'); $form_values['paybynet_show_type'] = Configuration::get('PAYBYNET_SHOW_TYPE'); $form_values['paybynet_zip_code'] = Configuration::get('PAYBYNET_ZIP_CODE'); $form_values['paybynet_city'] = Configuration::get('PAYBYNET_CITY'); $form_values['paybynet_street'] = Configuration::get('PAYBYNET_STREET'); $form_values['paybynet_country'] = Configuration::get('PAYBYNET_COUNTRY'); $form_values['paybynet_account'] = Configuration::get('PAYBYNET_ACCOUNT'); $form_values['paybynet_currency'] = Configuration::get('PAYBYNET_CURRENCY'); $form_values['paybynet_date_valid'] = Configuration::get('PAYBYNET_DATE_VALID'); $form_values['paybynet_id_client'] = Configuration::get('PAYBYNET_ID_CLIENT'); $form_values['paybynet_password'] = Configuration::get('PAYBYNET_PASSWORD'); $form_values['paybynet_show_banks'] = 0; $form_values['paybynet_cc_active'] = Configuration::get('PAYBYNET_CC_ACTIVE'); $form_values['paybynet_sandbox'] = Configuration::get('PAYBYNET_SANDBOX'); $form_values['paybynet_sorage_logs'] = Configuration::get('PAYBYNET_SORAGE_LOGS'); return $form_values; } private function validateFormData() { $form_values = $this->getFormValues(); $error = array(); $error['status'] = false; if (strlen(trim($form_values['paybynet_name'])) < 3) { $error['status'] = true; $error['message']['paybynet_name'] = $this->l('Field is required and must have more then 3 characters.'); } if (strlen(trim($form_values['paybynet_zip_code'])) < 5 || strlen(trim($form_values['paybynet_zip_code'])) > 6) { $error['status'] = true; $error['message']['paybynet_zip_code'] = $this->l('Field is required and must be between 5 and 6 characters.'); } if (strlen(trim($form_values['paybynet_city'])) < 3) { $error['status'] = true; $error['message']['paybynet_city'] = $this->l('Field is required and must have more then 3 characters.'); } if (strlen(trim($form_values['paybynet_street'])) < 3) { $error['status'] = true; $error['message']['paybynet_street'] = $this->l('Field is required and must have more then 3 characters.'); } if (strlen(trim($form_values['paybynet_country'])) < 3) { $error['status'] = true; $error['message']['paybynet_country'] = $this->l('Field is required and must have more then 3 characters.'); } if (strlen(str_replace(array('-',' '), array('','',), trim($form_values['paybynet_account']))) != 26) { $error['status'] = true; $error['message']['paybynet_account'] = $this->l('Field is required and must have 26 characters. (Without spaces and "-")'); } if (strlen(trim($form_values['paybynet_currency'])) < 2) { $error['status'] = true; $error['message']['paybynet_currency'] = $this->l('Field is required and must have more then 1 characters.'); } if (strlen(trim($form_values['paybynet_id_client'])) < 10 || strlen(trim($form_values['paybynet_id_client'])) > 11) { $error['status'] = true; $error['message']['paybynet_id_client'] = $this->l('Field is required and must be between 10 and 12 characters.'); } if (strlen(trim($form_values['paybynet_password'])) < 1) { $error['status'] = true; $error['message']['paybynet_password'] = $this->l('Field is required.'); } return $error; } private function validateFormConfiguration() { $error['message'] = array(); $error['status'] = false; if ((int)Configuration::get('PAYBYNET_DATE_VALID') <= 0) { $error['status'] = true; $error['message']['paybynet_date_valid'] = $this->l('Field is required and the value have to be greater then 0.'); } return $error; } public function updateTransaction() { $newStatus = Tools::getValue('newStatus'); $transAmount = Tools::getValue('transAmount'); $paymentId = Tools::getValue('paymentId'); $hash = Tools::getValue('hash'); $passwrod = Configuration::get('PAYBYNET_PASSWORD'); $valid_hash = sha1($newStatus.$transAmount.$paymentId.$passwrod); $config = array( 'sandbox' => Configuration::get('PAYBYNET_SANDBOX'), 'log' => 1 ); $pbn = new PaybynetCore($config); $pbn->logOperation('Update status: Start operation with parameters:'.print_r(Tools::getAllValues(), true), 'Error'); if ($hash != $valid_hash) { $pbn->logOperation('Update status: hash not valid.', 'Error'); return 'Error: hash not valid.'; } //Format paymentId to Int after hash validation $order = new Order((int)$paymentId); $order_history = new OrderHistory(); $order_history->id_order = (int)$order->id; if ($order) { $status_type = $pbn->transactionStatus($newStatus); $new_order_status_id = 0; switch ($status_type) { case 'approved': $new_order_status_id = Configuration::get('PAYBYNET_ORDERSTATE_ACCEPTED_PAYMENT'); break; case 'rejected': $new_order_status_id = Configuration::get('PAYBYNET_ORDERSTATE_REJECTED_PAYMENT'); break; case 'expired': $new_order_status_id = Configuration::get('PAYBYNET_ORDERSTATE_EXPIRED_PAYMENT'); break; } if ($new_order_status_id > 0) { $order_history->changeIdOrderState((int)($new_order_status_id), (int)($order->id)); return 'OK'; } else { $pbn->logOperation('Update status: Status didn\'t match: ' . $newStatus . '.', 'Error'); return 'Error: Status didn\'t match.'; } } else { $pbn->logOperation('Update status: Order not found ID: ' . (int)$paymentId . '.', 'Error'); return 'Error: order not found.'; } } }