Перейти до

wayforpay ubilling


Рекомендованные сообщения

В общем из за нулевых знаний php уже 3 дня леплю wayforpay к ubilling .  Половина уже  работает как надо а именно backand , а frontend через зад. Несколько платежей случайно залетело. Может уже кто писал frontend wayforpay на ubilling?

Ссылка на сообщение
Поделиться на других сайтах

пока на frontend накручивал функции то имитировал данные на serviceUrl под $_post  ,   а надо было под json , теперь понял разницу

Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

все переписал , заработало ! ( все орправляется , пополняет ,  принимается,  логается. Допишу пару проверяющих функций , приведу к божескому виду и выложу

Відредаговано zaza12
Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

Вот фронтенд , уже запущен, и работает. Гарантировать правильность не буду , но это бесплатно. Вопрос с curl , как я его только не собирал и тестировал , так и не понял , доходит accept на шлюз , или нет (запросы от wayforpay продолжают сыпаться). Частично или на постоянку решил через die(''.$send_json.'');  никакой ценной информации  там нет . Если понадобится  более обширный сервис с запросами о статусе , или выставить инвойс и т д , то это уже будет другая басня. 

<?php
// Фронтенд к Ubilling для получения оплат от "Wayforpay"
// подключаем API OpenPayz
include ('../../libs/api.openpayz.php');
//конфиг wayforpay
$conf_wayforpay=parse_ini_file('../../backend/wayforpay/config/wayforpay.ini');
//получаем ответ  и создаем все нужное
global $conf_wayforpay;
$json = file_get_contents('php://input');
$data = json_decode($json, true);
$merchantAccount=$data['merchantAccount'];
$merchantSignature=$data['merchantSignature'];
$orderReference=$data['orderReference'];
$amount=$data['amount'];
$currency=$data['currency'];
$authCode=$data['authCode'];
$cardPan=$data['cardPan'];
$transactionStatus=$data['transactionStatus'];
$reasonCode=$data['reasonCode'];
$merchant_key=$conf_wayforpay['MERCHANT_KEY'];
$weyforpay_link=$conf_wayforpay['WAYFORPAY_LINK'];
$time=time();
$status='accept';
// генерация  контрольной подписи HMAC_MD5
$string="{$merchantAccount};{$orderReference};{$amount};{$currency};{$authCode};{$cardPan};{$transactionStatus};{$reasonCode}";
$send_string="{$orderReference};{$status};{$time}";
$sign_hash = hash_hmac("md5",$string,$merchant_key);
$send_signature = hash_hmac("md5",$send_string,$merchant_key);
//DEBUG_MODE=1 включаем log
if ($conf_wayforpay['DEBUG_MODE']) {
    $datetime=curdatetime();
    $log_file="config/forms.log";
    $log_data='========== '.$datetime.' ==========='."\n";
    $log_data.=print_r($data,true);
$log_data.='merchant_Signature = '.$merchantSignature."\n";
    $log_data.='sign_hashSignature = '.$sign_hash."\n";
$log_data.='=========================================='."\n";
    file_put_contents($log_file,$log_data,FILE_APPEND);
}
/* собираем данные для ответа на weyforpay.В случае, если WayForPay НЕ получит корректный 
 *   ответ от сервера торговца, то система будет направлять запросы в *течении 4-х
 *   суток или до получения правильного ответа.
*/
//формируем json для отправки ответа на шлюз что запрос принят и обработан
    $send_data = array();
         $send_data['orderReference']=$orderReference;
         $send_data['status']='accept';
         $send_data['time']=$time;
         $send_data['signature']=$send_signature;
         $send_json=json_encode($send_data);
       // проверка подписи
 if ($merchantSignature == $sign_hash) {
   /*==>> //curl  не использую вопрос решил отправляем accept через die(''.$send_json.''); никакой ценной инфы там нет 
         $ch = curl_init($weyforpay_link);
         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
         curl_setopt($ch, CURLOPT_POSTFIELDS, $send_json);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_exec($ch);
    // Проверяем наличие ошибок в ответе на шлюз
if (!curl_errno($ch)) {$info = curl_getinfo($ch);}
file_put_contents("config/forms.log",print_r('=== send to w4p == '.$datetime.' ==='."\n".$send_json,true)."\n".'Прошло '. $info['total_time']. ' секунд во время запроса к '.$info['url'].' ,  http_code: '.$info['http_code']."\n".'=========================================='."\n",FILE_APPEND);
curl_close($ch);
<<<==*/      // проверка успешности платежа,  выполнена ли операция без ошибок
               if ($reasonCode == '1100'){
            $raw_order=$orderReference;
                 $order=explode('-', $raw_order);
                 if (sizeof($order)==2)  {
                    $hash=$raw_order;
                    $summ=$amount;
                    $customerid=$order[0];
   $create_date=$order[1];
                    $paysys='WAYFORPAY';
                    $note='order:'.$orderReference.' status:'. $transactionStatus.' sig:'.$merchantSignature;
   // новая транзакция
                   op_TransactionAdd($hash, $summ, $customerid, $paysys, $note);
                   // обработчики необработанных транзакций
                 op_ProcessHandlers();
                //транзакция ok
                die(''.$send_json.'');     // при успешной транзакции
else 
   {
die(''.$send_json.'');       // при неправильном ордере
}
}
  else {
  die(''.$send_json.'');       // при других кодах ответов
}
  }
else  {
die(''.$send_json.'');     // несовпадение сигнатур , а по сути отправление  асcept тупо всегда когда приняли! дабы не складировать ненужные логи
}
 
?>
Відредаговано zaza12
  • Thanks 1
Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

1 часть   кода платежки  - backend   ,  

 

<?php

// wayforpay
 //Ловим методом GET виртуальный идентификатор пользователя
if (isset($_GET['customer_id'])) {
    $customer_id=$_GET['customer_id'];
} else {
    die('customer_id fail');
}
// подключаем API OpenPayz
include ("../../libs/api.openpayz.php");
// подгружаем конфиг
$conf_wayforpay=parse_ini_file("config/wayforpay.ini");
// переменные о мерчанте
$merchant_name=$conf_wayforpay['MERCHANT_NAME'];
$merchant_url=$conf_wayforpay['MERCHANT_URL'];
$merchant_logo=$conf_wayforpay['MERCHANT_LOGO'];
$merchant_currency=$conf_wayforpay['MERCHANT_CURRENCY'];
$template_file=$conf_wayforpay['TEMPLATE'];
$raw_amount=$conf_wayforpay['AMOUNT'];
// настройки  WAYFORPAY
$merchant_account=$conf_wayforpay['MERCHANT_ACCOUNT'];
$domain_name=$conf_wayforpay['DOMAIN_NAME'];
$merchant_key=$conf_wayforpay['MERCHANT_KEY'];
$service_url=$conf_wayforpay['SERVICE_URL'];
$return_url=$conf_wayforpay['RETURN_URL'];
$order_date= time();
$date= date("ymdHis");
$order_reference=$customer_id.'-'.$date;
$wayforpay_link=$conf_wayforpay['WAYFORPAY_LINK'];
$currency=$conf_wayforpay['CURRENCY'];
$payment_systems=$conf_wayforpay['PAYMENT_SYSTEMS'];
$lang=$conf_wayforpay['LANG'];
$product_name=$conf_wayforpay['PRODUCT_NAME'];
$product_price=$conf_wayforpay['PRODUCT_PRICE'];
$product_count=$conf_wayforpay['PRODUCT_COUNT'];
$amount=array();
if (!empty($raw_amount)) {
    $amount=  explode(',', $raw_amount);
}
//сумма платежа
if (isset($_POST['PaySumm'])) {
    $money=vf(trim($_POST['PaySumm']));
} else {
    $money=200;
}
function paysumm_form($amount,$merchant_currency) {
    //сборка выбора платежа
    if (!empty($amount)) {
        $moneySub='';
        foreach ($amount as $each) {
$moneySub.='<input name="PaySumm" id="cash'.$each.'" value="'.$each.'" checked="" type="radio"> <label for="cash'.$each.'">'.$each.' '.$merchant_currency.'</label><br>'."\n";
        }
    } else {
        $moneySub='<input type="text" name="PaySumm" value="" size="5"> Введите сумму платежа';
    }
    
    $result='
        <form action="" method="POST">Выберите сумму платежа</br>
        '.$moneySub.'
        <br>
        <input type="submit" value="Перейти к оплате">
        </form>
        ';
    return ($result);
}
// генерация  контрольной подписи HMAC_MD5 
$string = "{$merchant_account};{$domain_name};{$order_reference};{$order_date};{$money};{$currency};{$product_name};{$product_price};{$product_count}";
$signature= hash_hmac("md5",$string,$merchant_key);
 
function wayforpay_form($merchant_currency,$wayforpay_link,$amount, $merchant_account,$domain_name,$signature,$order_reference,$order_date,$money, $currency,$product_name,$product_price,$product_count,$lang,$return_url,$service_url,$payment_systems) {
   
   $form='
        <br>
        <h3>Выбран платеж на сумму '.$money.' '.$merchant_currency.'</h3>
        <form action="'.$wayforpay_link.'" method="POST">
        <input type="hidden" name="merchantAccount" value="'.$merchant_account.'">
        <input type="hidden" name="merchantDomainName" value="'.$domain_name.'">
        <input type="hidden" name="merchantTransactionType" value="AUTO">
        <input type="hidden" name="merchantTransactionSecureType" value="AUTO">
   <input type="hidden" name="merchantSignature" value="'.$signature.'">
   <input type="hidden" name="orderReference" value="'.$order_reference.'">
        <input type="hidden" name="orderDate" value="'.$order_date.'">
<input type="hidden" name="amount" value="'.$money.'">
   <input type="hidden" name="currency" value="'.$currency.'">
        <input type="hidden" name="productName[]" value="'.$product_name.'">
        <input type="hidden" name="productPrice[]" value="'.$product_price.'">
        <input type="hidden" name="productCount[]" value="'.$product_count.'">
        <input type="hidden" name="language" value="'.$lang.'">
        <input type="hidden" name="returnUrl" value="'.$return_url.'">
        <input type="hidden" name="serviceUrl" value="'.$service_url.'">
   <input type="hidden" name="paymentSystems" value="'.$payment_systems.'">
         <br>
        <input type="submit" name="Submit" value="Оплатить">
        </form>
        ';
     return($form);
}
 
// форма выбора сумы платежа
if (!isset($_POST['PaySumm'])) {
    $payment_form= paysumm_form($amount,$merchant_currency);
} else {
    // подтверждаем форму платежа
$payment_form= wayforpay_form($merchant_currency, $wayforpay_link,$amount, $merchant_account, $domain_name,$signature,$order_reference,$order_date, $money,$currency,$product_name,$product_price,$product_count,$lang,$return_url,$service_url,$payment_systems);
}
//DEBUG_MODE=1 включаем log
if ($conf_wayforpay['DEBUG_MODE']) {
    $datetime=curdatetime();
    $log_file="config/forms.log";
    $remote_ip=$_SERVER['WAYFORPAY_LINK'];
    $log_data='===== '.$datetime.' ====='."\n";
    $log_data.=$payment_form;
    $log_data.="\n".'================================'."\n";
    file_put_contents($log_file, $log_data,FILE_APPEND);
}
//показываем  в темплейт
include($template_file);
 
?>
Відредаговано zaza12
  • Thanks 1
Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

что бы закрыть тему -  weyforpay.ini 

; Параметры WAYFORPAY
;Включение логов для отладки frontend  backend forms.log, требует права на запись!
DEBUG_MODE=1
;Ссылка WAYFORPAY
;Сайт мерчанта. Данная информация будет видна на странице оплаты заказа.
DOMAIN_NAME="http://my-site.xxx"
;Тестовые риквизиты мерчанта WAYFORPAY
MERCHANT_ACCOUNT="test_merch_n1"
MERCHANT_KEY="flk3409refn54t54t*FNJRET"
;Рекомендуемые суммы платежа. 
AMOUNT=100,150,200
;Язык платежной страницы.
LANG=RU
;Валюта платежа.
CURRENCY=UAH
;URL, на который система должна отправлять ответ с результатом платежа напрямую мерчанту, (url фронтенда)
;URL, на который система должна перенаправлять клиента с результатом платежа.
;В случае отсутствия параметра переадресация происходит на страницу результата оплаты checkout psp 
RETURN_URL=
;Список платежных систем должны быть разделены точкой с запятой - card; privat24; lpTerminal; btc; credit; payParts.
PAYMENT_SYSTEMS="card"
;Массив с наименованием заказанных товаров. Данная информация будет видна на странице оплаты заказа.
PRODUCT_NAME=ОПЛАТА ИНТЕРНЕТ
;Массив с ценами за единицу товара. Данная информация будет видна на странице оплаты заказа.
PRODUCT_PRICE=1
;Массив с количеством заказанного товара по каждой позиции. 
PRODUCT_COUNT=1
; Параметры мерчанта
MERCHANT_NAME = "super-puper-lan"
MERCHANT_URL = "http://my-site.xxx"
MERCHANT_CURRENCY = "грн"
TEMPLATE = "template.html"
Відредаговано zaza12
  • Thanks 1
Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

  • Схожий контент

    • Від nightfly
      Ubilling 1.5.9 rev 9525 The Perfect Lock
       
      Зміни в структурі БД. alter.ini: нова опція GENERATORS_ENABLED, що вмикає модуль моніторингу генераторів. alter.ini: нова опція TB_GENERATORS_NOTIFY, що вмикає нотифікацію про запущені генератори в області сповіщень. alter.ini: нова опція PON_ONU_UNI_STATUS_COMPACT, що вмикає компактне відображення стану мідних портів на ONU. alter.ini: нова опція PONBOXES_MINIMAP, що дозволяє вмикати та вимикати міні-мапу, при редагування ПОН коробки. Новий модуль Єдинорожий телепорт: дозволяє просто та зручно переносити ваш робочий білінг на новий сервер. Модуль “Реєстрація користувачів”: виправлено проблеми сумісності з PHP 8.5. Модуль “Останні події”: викинуто дубову статку на мороз. Askozia PBX: інтеграція була давно непідтримуваною, викинуто на мороз, разом зі всіма опціями. Модуль Mapon: тепер використовує OmaeURL для взаємодії з API. Модуль “Мапа ONU”: в черговий раз покращення навігації між мапою та іншими модулями системи. Новий модуль Генератори: дозволяє моніторити стан генераторів, базово облікувати мотогодини, пальне та планувати ТО. Модуль ПОНізатор: тепер причини останньої дереєстрації ONU можуть визначатись також по серійнику ONU а не тільки за MAC. Модуль “ПОН Коробки”: покращено продуктивність відмальовки зв'язків коробок на мапах. Глобально: проведено чергову спробу зробити логування подій, що відбуваються навколо користувачів, якимось трішки більш притомним. RemoteAPI: новий виклик generators, що запускає скрипти обробки станів генераторів з автоматичним запуском. RemoteAPI: новий виклик gencontrol, для примусового запуску/зупинки генераторів за допомогою зовнішнього ПЗ. Бібліотека UbillingCache: виправлено проблеми сумісності з PHP 8.5. Бібліотека OmaeURL: виправлено проблеми сумісності з PHP 8.5. Бібліотека UbillingTelegram: вся робота з CURL перенесена до одного методу, покращено сумісність з PHP 8.5. Кабінет користувача: виправлено проблеми сумісності з PHP 8.5. UBinstaller: тепер при встановленні попередньо розгортає та конфігурує SphinxSearch. UBinstaller: Зібрано бінарні пакунки для FreeBSD 14.3 amd64 + PHP 8.5. UBinstaller: Зібрано бінарні пакунки для FreeBSD 15.0 amd64 + PHP 8.5.  
      Повний чейнджлог
      Оновлена демка
       
       

    • Від maxkorn
      Доброго дня!
      На Mikrotik NAS, створив нову підмережу для клієнтів, все наче порядок, тільки помітив, що не створюються шейпери в Queues для клієнтів цієї підмережі.
      В логах Stargazer наступне:
      2025-12-29 09:05:57 - [Ubilling] - OnConnect started for user `xxasdb5rzm`:
      2025-12-29 09:05:57 - [Executer] - Success: Firewall entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Error: Queue entry can't be updated, missing
      2025-12-29 09:05:57 - [Executer] - Success: Queue_tree entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Success: DHCP entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Success: ARP entry was updated/created
      2025-12-29 09:05:57 - [Ubilling] - QC: 6, elapsed time: 0.064 sec.
       
      При чому, на тому ж мікротіку є ще кілька підмереж, в яких все проходить нормально:
       
      2025-12-29 08:30:17 - [Ubilling] - OnConnect started for user `22zxp7u58x`:
      2025-12-29 08:30:17 - [Executer] - Success: Firewall entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: Queue entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: Queue_tree entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: DHCP entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: ARP entry was updated/created
      2025-12-29 08:30:17 - [Ubilling] - QC: 6, elapsed time: 0.602 sec.
       
      Налаштування аналогічні, в чому може бути причина?
    • Від ProstoName
      Змінювали мережеву карту. Здається все поправив. Працює. Але є невелика проблема - після внесення коштів (коли абонент був відключений), інет в нього не з'являється. Тільки після заміни тарифу на інший (і потім вернувши тариф) в абонента з'являється інет. 
    • Від ppv
      Собака-посилака перестала відправляти повідомлення. Підкажіть де шукати.
      Можливо таке після пропадання світла, сервер ребутнувся, але я не впевнений. Візуально все працює, крон працює, а повідомлення висять в черзі, смс така ж картина.

    • Від camchatix
      Привіт!
       
      Є багато запитів, щоб інтернет не виключався у північ, а скажімо в день (сигналізації, камери під охороною і тд)
      При щоденній абонплаті - як знімати гроші не у 12:00 у північ, а наприклад у 11 годин дня ?
×
×
  • Створити нове...