Категории

[FAQ] Часто задаваемые вопросы и ответы

Проблемы и решения

Ошибки и исправления

Общие вопросы

Расширения

Установка и обновление

Модули

Шаблоны

Локализация интерфейса

Коммерческие предложения

Учимся бизнесу

Бизнес книги

Поисковая оптимизация (SEO)

Магазины на ShopOS

Хостинг для ShopOS

Предложения и пожелания

Курилка

Разработка модуля оплаты через систему Epay Казкомерцбанка в Казахстане

Народ, в Казахстане самая популярная система мерчанта это Epay от банка Казкомерцбанк.

Модуль почти готов. Потом выложу. Не хватает одного. Нужно передать email адрес на который будет отсылаться подтверждение оплаты.

Как мне его получить в качестве переменной
1. из быстрого заказа?
2. Как зарегистрированный пользователь?


Вопрос снят


Народ, возник другой вопрос. Данный модуль делаю на основе модуля Interkassa. Так вот этот модуль для определения id последнего заказа использует код

$order_id_query = os_db_query("select max(orders_id) as max from " . TABLE_ORDERS);
.

Вроде бы все в порядке. Но когда незавершенные заказы удаляются, то и последний id тоже удаляется из таблицы os_orders. К примеру если удалился последний заказ с id=90, то и максимальное id становится < 90, к примеру 85. Но при оформлении нового заказа, этому заказу присваивается id равный 91. А код $order_id_query = os_db_query("select max(orders_id) as max from " . TABLE_ORDERS); возвратит мне значение 85. Это расхождение не позволяет осуществить оплату, так как мерчант epay требует уникального номера заказа.

Вопрос: как получить самый последний id независимо от статуса заказа, т.е. пусть даже он удален. 


Там id заказа формируется из сессии при формировании заказа.
смотрите $order_id = substr($_SESSION, strpos($_SESSION, '-')+1);



Там id заказа формируется из сессии при формировании заказа.
смотрите $order_id = substr($_SESSION, strpos($_SESSION, '-')+1);


где "там"?

в Intercasse используется приведенный раннее мною код. А в базу заносится id который формируется в checkout_process.php
вот тут

if ($_SERVER) {
$customers_ip = $_SERVER;
} else {
$customers_ip = $_SERVER;
}
if ($_SESSION['credit_covers'] != '1') {
$sql_data_array = array ('customers_id' => $_SESSION['customer_id'],...
} else {
// free gift , no paymentaddress
$sql_data_array = array ('customers_id' => $_SESSION['customer_id'],...
}

os_db_perform(TABLE_ORDERS, $sql_data_array);
$insert_id = os_db_insert_id();


$insert_id и есть id заказа не зависимый от его статуса. Пусть даже заказ удаляется, $insert_id все равно увеличен на единицу относительно последнего заказа.

Но проблема в том, что  я не могу два раза исполнять этот код, так как id заказа увеличивается на 2. Не знаю что делать. Придется не удалять никакие заказы, даже которые отменены.

Отсюда вытек вопрос который изложен в теме http://www.shopos.ru/forum/index.php?topic=7995.0


В классе модуля оплаты, в файле ik.php
При переходе на страницу подтверждения создается временный заказ. Вот его id и получаем из сессии способом который я приводил выше.
если заказ удалили, то при новом оформлении там формируется новый временный заказ с новым id. не нужно из БД ничего тянуть.

Чтобы передать запрос банку можно использовать метод process_button. смотрите пример в ik.php
обработка ответа от банка в файле вашмод_process.php


Вот так? Не получает id

function process_button() {
      global $order, $currencies, $currency, $osPrice;
require_once('modules/payment/epay/paysys/kkb.utils.php');
        $self = $_SERVER['PHP_SELF'];
        $path1 = 'modules/payment/epay/paysys/config.txt';
        $currency_id = "398";
        $OrderID = substr($_SESSION, strpos($_SESSION, '-')+1);
 
  $customer_email_query = os_db_query("select customers_email_address from " . TABLE_CUSTOMERS . " WHERE customers_firstname='".$_SESSION['customer_first_name']."'");
  $customer_email = os_db_fetch_array($customer_email_query);
      $Customer_email = $customer_email['customers_email_address'];
     
      $TotalAmount = number_format($osPrice->CalculateCurrEx($order->info['total'], MODULE_PAYMENT_EPAY_CURRENCY), 2, '.', '');
  $content = process_request($OrderID,$currency_id,$TotalAmount,$path1);
     
  $process_button_string = os_draw_hidden_field('Signed_Order_B64', $content) .
  os_draw_hidden_field('email', $Customer_email) .
  os_draw_hidden_field('Language', 'rus') .
  os_draw_hidden_field('BackLink', 'http://simarket.kz/checkout_process.php') .
                              os_draw_hidden_field('FailureBackLink', 'http://simarket.kz/otmena_zakaza.html') .
  os_draw_hidden_field('PostLink', 'http://simarket.kz/modules/payment/epay/paysys/postlink.php');

      return $process_button_string;
    }


а что у вас в свойстве $this->name указано? Вы там изменили на название модуля на свое?
cart_вашмод_id


id покупателя в сессии есть $_SESSION['customer_id']





не понял вопрос, а по предыдущему выставил

$OrderID = substr($_SESSION['cart_epay_id'], strpos($_SESSION['cart_epay_id'], '-')+1);

Не получилось


А ничего что я все это дело сую в function process_button() {, а не function selection() {?


сделайте print_r($_SESSION);
и посмотрите как мод указан и посмотрите там id какой. должно быть типа -58 или чет подобное.
в нижней части массива, где . там временный id заказа есть.

А ничего что я все это дело сую в function process_button() {, а не function selection() {?

process_button - как раз то место которое нужно. в selection вы только выбираете мод. а process_button как раз кнопка Подтвердить. Там и запрос сервису идет если нужно.


не понял вопрос


;


вот что выдало

=> configuration => epay => => Array ( => Array ( => 1 ) ) )


не может быть. там куча инфы. в исходном коде страницы(ctrl+u) тогда смотрите.

у вас paymet просто epay


Там куча, но я вам не весь выслал, а только с . И что раз epay. Как изменить?


Может я вообще не в ту степь забрел. Вот посмотрите мой файл pay.php


Во модулях liqpay, webmaney_merchant  сессии типа $_SESSION создаются в function confirmation() {
вот этим кодом

os_db_perform(TABLE_ORDERS, $sql_data_array);

          $insert_id = os_db_insert_id();


$insert_id - новый id ордера. получается что при отмене заказа, id все равно увеличивается на 1. Это все сбивает.

Лучше оставить все как есть и просто не удалять, а отменять заказы в админке.


Вам нужно было брать за основу мод http://www.shopos.ru/forum/index.php?topic=7910.0


Так я именно на его основе и делал. Я же выложил в архиве. Так вот именно в нем и нельзя использовать

$order_id = substr($_SESSION, strpos($_SESSION, '-')+1);

такая сессия не создается в function confirmation() { в классе ik.php.

ладно, транзакция проходит успешно, теперь остается обработка заказа после транзакции. Со стороны банка отсылается XML документ. Вот что написано в руководстве.

XML документ отправляется в поле с именем "response" методом POST на URL указанный в поле PostLink

После получения поста вам необходимо проверить подпись банка, если это предоставляется возможным,
либо проверить данные через систему мониторинга платежей на сервере https://epay.kkb.kz
а затем разобрать документ для дальнейшей работы с указанными в нем данными

Внимание! Ваш PostLink всегда возвращает 0, без тегов


в качестве страницы указанный в поле PostLink я использовал checkout_process.php. -  заказ не обработался.
Вообще нужно указывать вложенный файл postlink.php, в котором обрабатывается ответ банка. Как в нем зафиксировать заказ и как выполнить их условие "Внимание! Ваш PostLink всегда возвращает 0, без тегов"- я не понял.

может просто - echo "0";


в выложенном архиве в половине методов ничего нет. в ik.php в разы больше кода.

вам там нужно было изменить только название ik на свое. изменить данные которые отсылаются на сервис и поправить ответ от сервиса.


действительно. откуда у меня взялся такой вариант ik. Я вроде отсюда скачивал. Может тогда другой вариант был. И главное все работало. Спасибо, буду ковыряться


Перепутали наверное модули.
этот ik новый я выложил. который в разделе модулей не рабочий вроде как. я его не проверял.
а выложенный мной уже протестирован и работает.


Теперь ясно. Но и тот работал. Теперь вопрос, ответ от intercassa обрабатывается в ik_process.php. Где он вызывается? Мне тоже нужно обработать ответ.


http://ваш-сайт/process.php?payment=вашмод

смотрите тут информацию по ссылкам http://www.shopos.ru/forum/index.php?topic=7910.0


Все работает отлично. НО, при успешной оплате, если не вернуться в магазин по соответствующей кнопке, которая направлена на http://ваш-сайт/checkout_process.php, то хотя заказ и принят, но товар остается в корзине и не отнимается со склада. Что делать?

Еще не пойму исполняется ли epay_process.php.

Я выложу модуль, испробуйте его. В текстовом файле тестовые данные пластиковой карты.

Не забудьте изменить в epay.php
os_draw_hidden_field('PostLink', 'http://ваш-сайт/process.php?payment=epay');

И еще файлы config.txt и confg2.txt почти идентичны, но есть различия из за которых я никак не могу использовать только один. Может вы что-то придумаете.


Сегодня посмотрю и поправлю.

os_draw_hidden_field('PostLink', 'http://ваш-сайт/process.php?payment=epay');
можно
os_draw_hidden_field('PostLink', _HTTP.'process.php?payment=epay');


На всякий случай вот вся документация которую выдал банк


Я взял фрагмент из checkout_process.php и вставил в epay_process.php.
В epay.php Url на postlink дал _HTTP.'modules/payment/epay/epay_process.php'.

Связался с банком. Сказали что ответ от моего postlink (echo '0';) получили, все нормально.
Но остальной код не исполняется, то есть товар в корзине так и остается. Сессии передаются на сторону банка?


Источник



Copyright ShopOS