Перейти до

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 користувачів

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

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

    • Від camchatix
      Добрий день,
      створили запасний NAS із зайвою хромосомою, все працює але коли треба вбити сесію користувача - то у списку NAS серверів лише один (той що основний)
      переназначити швидкість теж не можу
      я так розумію пакети CoA Disconnect, CoA connect, PoD - ідуть на IP адресу старого NAS ?
    • Від grach_witch_cheese
      Вітаю, колеги!
      Маю наступну схему:
      DHCP-сервер: Accel-PPP (IPoE) DHCP-Relay: MikroTik RADIUS: Запущений безпосередньо на сервері uBilling Зараз авторизація абонентів здійснюється за MAC-адресою, але планується перехід на авторизацію через Option 82.
      У документації uBilling наведені приклади конфігурацій, коли DHCP-сервер працює локально (на самому uBilling) і містить відповідні шаблони для обробки Option 82.
      Однак немає чіткої інформації про використання Option 82 при віддаленому DHCP-сервері, зокрема, коли Accel-PPP використовується як DHCP-сервер у режимі remote та налаштований через Купаген.
      Питання:
      Чи можливо використовувати Accel-PPP як віддалений DHCP-сервер з авторизацією через Option 82? Якщо так, то де відбувається парсинг значень Remote-ID і Circuit-ID? Де в цьому випадку мають зберігатися шаблони для Option 82? Буду вдячний за роз'яснення або посилання на відповідні приклади.
    • Від nightfly
      Ubilling 1.5.2 rev 9302 Book of Endings
       
      Зміни в структурі БД. alter.ini: нова опція FASTPROFITCALC_ENABLED, що вмикає швидкий підрахунок прибутку. alter.ini: нова необов'язкова опція KARMA_IN_PROFILE що вмикає показ карми в профілі користувача. alter.ini: нова опція SWITCHES_AUTH_ENABLED, що вмикає довідник даних авторизації пристроїв. alter.ini: нова опція PON_SCRIPTS_ENABLED, що вмикає підтримку скриптів OLT в ПОНізаторі. alter.ini: нова опція PON_ONU_FDB_SELFFILTER, що вмикає фільтр MAC-ів при відображенні FDB за ONU. alter.ini: нова опція USERBYIP_ENABLED, що вмикає виклик userbyip в RemoteAPI. alter.ini: пачка нових опцій PB_FASTURL_*, що керують поведінкою модулю відсилання коротких посилань на оплату. Модуль PONizer: виправлена помилка зникнення PON інтерфейсів при опиті BDCOM GP3600 Модуль “Профіль користувача”: для опису плагінів профілю та оверлеїв на кшталт “чорної магії” тепер опційно можливо вказувати link_target. Модуль “Панель задач”: для опису елементів панелі задач, тепер опційно можна вказувати LINK_TARGET. Модуль Записи телефонних розмов: вирішено проблеми швидкодії, при перегляді списку записів дзвінків. Модуль “Записи телефонних розмов”: більше не призводить до вичерпання пам'яті процесу, при перегляді великих архівів дзвінків. Модуль “Записи телефонних розмов”: новий аудіо-плеєр для прослуховування записів з візуалізацією аудіо-хвилі. Модуль “Пошук оплат”: реалізовано можливість швиденького підрахунку прибутку по обраних чекбоксами платежах. Модуль УКВ: реалізовано можливість швиденького підрахунку прибутку по обраних чекбоксами платежах. Модулі Мапа обладнання та користувачів: трішки вичищено код. Ліпше не стало. Модуль “Мапа будинків”: поле пошуку при розташуванні будинку, тепер попередньо заповнено локацією, при переході за посиланням “розташувати на мапі”. Модуль “Панель задач”: опція TB_QUICKSEARCH_INLINE змінила свою поведінку, та може тепер приймати значення 0|1|2. Модуль “Звіт по трафіку”: виправлено проблему відображення графіків OphanimFlow для NAS на роздільних здатностях менше ніж FullHD. Кабінет користувача: в модулі “Відеоспостереження” відображення попереднього перегляду каналів користувача, стало трішки притомнішим. Сховище зображень: трішки покращено поведінку форми завантаження. RemoteAPI: новий виклик onusigcompressor, що радикально стискає розпухаючі дані історії сигналів ONU. RemoteAPI: новий виклик pbxmonrefill, що оновлює кеш записів телефонних розмов. RemoteAPI: новий виклик userbyip, що повертає дані про користувача за його IP. OpenPayz: в бекенді та фронтенді platon виправлено проблему диких заокруглень, при вказанні зовнішньої комісії.  
      Повний чейнджлог
      Оновлена демка
       

    • Від ppv
      Після оновлення до 1.5.1 не відображаються сигнали на
      OLT BDCOM P3310B (Device version10.1.0B)

      та
      P3608-2TE (Firmware Version10.1.0E). 

      3310C та P3608B ніяких проблем немає, знімає все добре. 
      З GPON3600-8 все зрозуміло будуть виправлення в Ubilling: 1.5.2.
       
      Може в когось було щось подібне? Хочу знати куди копати.
    • Від mac
      Глюк в тому, що один (так - тільки один) mac адрес onu існує в білінгу у вигляді строки. Це трохи заважає.
      olt - bdcom gepon.
      Наскільки зрозумів, це виключно проблема реалізації snmpwalk у freebsd, де snmpwalk може на свій розсуд віддати mac адресу не як hex-string, а як звичайний string.
      Можливо snmpwalk тригериться на якомусь символі, мені невідомо.
       
      # tcpdump -vv -i em0 udp port 161 and host olt and host ub | grep "3320.101.10.4.1.1.241 ... olt.snmp > ub.47940: [udp sum ok] { SNMPv2c C="*****" { GetResponse(44) R=93278354 E:3320.101.10.4.1.1.241="8LO"W*" } } ub.47940 > olt.snmp: [udp sum ok] { SNMPv2c C="*****" { GetNextRequest(34) R=93278355 E:3320.101.10.4.1.1.241 } } snmpwalk -c***** -v2c -t5 olt .1.3.6.1.4.1.3320.101.10.4.1.1 SNMPv2-SMI::enterprises.3320.101.10.4.1.1.241 = STRING: "8LO\"W*" snmpwalk -Ox -c***** -v2c -t5 olt .1.3.6.1.4.1.3320.101.10.4.1.1 SNMPv2-SMI::enterprises.3320.101.10.4.1.1.241 = Hex-STRING: 38 4C 4F 22 57 2A  
      Це стосується таких параметрів у snmp конфізі bdcom
       
      [signal] MACINDEX=".1.3.6.1.4.1.3320.101.10.4.1.1" [misc] ONUINDEX=".1.3.6.1.4.1.3320.101.11.1.1.3"  
      За для усунення глюку спробував трошки змінити код і завдати тип snmp параметру явно у ./api/libs/api.ponbdcom.php у function collect()
      Це працює. Мабуть станеться у нагоді:
       
      # diff api.ponbdcom.php{.new,.bak} 37c37 < $onuIndex = $this->snmp->walk('-Ox ' . $oltIp . ':' . self::SNMPPORT, $oltCommunity, $onuIndexOid, self::SNMPCACHE); --- > $onuIndex = $this->snmp->walk($oltIp . ':' . self::SNMPPORT, $oltCommunity, $onuIndexOid, self::SNMPCACHE); 91c91 < $macIndex = $this->snmp->walk('-Ox ' . $oltIp . ':' . self::SNMPPORT, $oltCommunity, $macIndexOID, self::SNMPCACHE); --- > $macIndex = $this->snmp->walk($oltIp . ':' . self::SNMPPORT, $oltCommunity, $macIndexOID, self::SNMPCACHE);  
      P.S. Створив тему, а зараз міркую: а може це глюк у ПЗ olt. Оновлю фірмваре olt та перевірю...
       

×
×
  • Створити нове...