Перейти до

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

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

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

    • Від ppv
      Потрібно було витерти одну мережу, всі абоненти з неї були перенесені в іншу. Але світить що 6 IP зайняті, хоча вона повністю вільна.
       
      ID    Мережа/CID           RВсього IP        Використано IP ▾           Вільно IPСервіс
      6      172.16.70.0/23        506                    6                                       500
       
      Підкажіть як правильно це підчистити щоб видалити мережу.
    • Від sanyadnepr
      Приветствую всех.
      Подскажите пожалуйста где копнуть и нет ли проблемы со стороны протокола взаимодействия сити24 или возможно не учтена необходимая проверка в модуле сити24 в Ubilling, пока писал понял что похоже в проверке payID, но это не точно.  
      Недавно обнаружилось с сити24 начали прилетать дубликаты платежей, в целом платежей мало, два одинаковых запроса Pay с одинаковым transactionID и payID в одну секунду одному платежному ID при этом биллинг "думает" примерно чуть больше минуты и отвечает одним ответом <result>0</result>, сити24 утверждает что ответ они не получили и по протоколу дальше повторяет запросы дублем, биллинг ответ и так по кругу, сити24 спрашивает каким образом с одинаковым payID от сити24 билл продолжает обрабатывать запросы и пополнять абоненту счет раз в 5 минут примерно, на одну и туже сумму, ведь этот payID уже был обработан предполагают сити24 согласно протоколу.
      Конечно есть вопрос к сити24 зачем они дублем присылают два запроса, но они отвечают что эта ситуация учтена в протоколе и проблема на стороне биллинга, потому что он пополняет счет по уже обработанному одинаковому payID.
      При этом transactionID в дублях одинаковый, но с каждым новым дублем разный.
      Если зафаерволить запросы от сити24, но оставить возможность отвечать то после блокировки билл отправляет 2-3 минуты 6 ответов <account>0001</account>  <result>0</result>.
      После снятия блокировки, дубли и платежи нескольких проблемных абонентов прилетают так же по кругу, при этом и с некоторыми новыми пополнениями происходит аналогичная ситуация.
      В openpayz в платежах transactionID и не видно payID.
    • Від nightfly
      Ubilling 1.4.3 rev 9058 The Bladewood Grove
       
      Зміни в структурі БД. alter.ini: нові опції OPHANIMFLOW_ENABLED та OPHANIMFLOW_URLS котрі вмикають та керують інтеграцією з OphanimFlow. alter:ini: нова опція PHOTOSTORAGE_POSTPROCESSING, що вмикає післяобробку зображень при завантаженні в Сховище зображень. alter:ini: нова опція PHOTOSTORAGE_WATERMARK, що вмикає розміщення вотермарки на всіх зображеннях, що завантажуються. alter:ini: нова опція PHOTOSTORAGE_RECOMPRESS, що вмикає зміну компрессії завантажених зображень. alter:ini: нова опція PHOTOSTORAGE_AUTORESIZE, що вмикає автоматичне та лагідне масштабування зображень конячих розмірів. alter:ini: нова опція PHOTOSTORAGE_DRAWIMGINFO, що вмикає вдруковування в зображення відлагоджувальної інформації. alter.ini: нова опція ONDEMAND_CHARTS, що вмикає відкладене завантаження графіків завантаження користувацької смуги. userstats.ini: нова опція OPHANIM_ENABLED, що вмикає інтеграцію OphanimFlow в кабінеті користувача. Модуль Заздрість: тепер авторизаційні дані пристроїв, не відображаються в списку пристроїв. Модуль “Заздрість”: при створенні та редагуванні пристроїв, для полів “пароль” та “enable пароль” тепер використовуються інпути паролів. Модуль “Заздрість”: заздрісним пристроям додано нове поле “Порт”. Тепер в скриптах можна використовувати, відповідний макрос {PORT}. Модуль “Статистика трафіку користувача”: проведено радикальний рефакторинг. Модуль “Статистика трафіку користувача”: додано опційну можливість, відображення трафіку отриманого з OphanimFlow. Модуль “Статистика трафіку користувача”: виправлено проблему невірного відображення залишку коштів на кінець місяця, при використанні Ішимури. Модуль “Статистика трафіку користувача”: додано можливість відображення графіків за останню годину з OphanimFlow. Модуль “Користувачі”: додано опційну можливість, відображення трафіку отриманого з OphanimFlow. Модуль “Сховище зображень”: тепер додатково перевіряє завантажувані зображення на тему їх валідності. Модуль “Фінансові операції”: виправлено відображення суми платежів користувача. Remote API: новий виклик ophanimtraff, який просто бере і синхронізує локальну БД з віддаленими джерелами OphanimFlow. Remote API: виклик userbynum тепер також опційно містить поле з “Платіжним ID” користувача. Глобально: у всіх полях вводу паролів, окрім форми входу, тепер відображається елемент керування “показати/приховати” пароль. Кабінет користувача: в модулі “Трафік” додано опційну можливість, відображення трафіку отриманого з OphanimFlow. Кабінет користувача: в модулі “Трафік” виправлено проблему невірного відображення залишку коштів на кінець місяця, при використанні Ішимури. Кабінет користувача: в модулі “Відеоспостереження” для NVR WolfRecorder замінено розділювач попередньо заповнених даних авторизації. OpenPayz: додано frontend portmonemulti, для отримання платежів від різних контрагентів. Інформацію по контрагентам бере з біллінгу, також використовую розширену інформацію контрагента. Платіжна система в контрагенті мусить бути створена, як PORTMONE 1984tech: додано функціонал генерації RPZ для isc-bind, спасибі @misterromanbush  
      Повний чейнджлог
      Оновлена демка
       

    • Від mac
      Здається, після оновлення PHP 7.4 до PHP 8.2 feesharvester припинив працювати:
       
      /usr/local/bin/curl "http://127.0.0.1/billing/?module=remoteapi&key={SERIAL}&action=feesharvester" <br /> <b>Fatal error</b>: Uncaught TypeError: Unsupported operand types: string - string in {UBPATH}/billing/api/libs/api.fundsflow.php:570 Stack trace: #0 {UBPATH}/billing/modules/remoteapi/feesharvester.php(22): FundsFlow-&gt;harvestFees('2024-01') ...  
      Невеличке розслідування врешті з'ясувало, що це через наявність пробілу у деяких логінах абонентів. Як так сталося? Тому що інколи був неуважно додан трейлінг пробіл до номеру будинка і цей пробіл потрапив до логіну абоненту. Логін абоненту неможливо змінити ніяким чином штатними засобами. Я не розглядаю створення нового абонента для усунення помілки.

      Був обран такий шлях вирішення проблеми. Заміну функції php explode() знайшов у мережі. Мабуть це станеться в нагоді:

       
      diff api.fundsflow.php.bak api.fundsflow.php.new 559c559 < $eachfee = explode(' ', $eachline); --- > $eachfee = preg_split("~(?<!\\\\)(?:\\\\{2})*'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(*SKIP)(*F)|\s+~s" , $eachline);  
    • Від Dilan
      Собственно ищу кто сделает такую связку с нуля под ключ. Тз высылаю в личку. Заранее спасибо.
×
×
  • Створити нове...