====== OpenPayz ====== ===== Ой що це? ===== OpenPayz - існує для отримання інформації про онлайн-платежі здійснені з зовнішніх платіжних систем. Надає спільні інтерфейси для реєстрації та обробки повідомлень, що надійшли від платіжних систем, про здійснені користувачами платежі, а також для автоматизованого рознесення отриманих від платіжних систем сум по особових рахунках користувачів Ubilling.\\ \\ ===== Чим приймаються оплати? ===== На даний момент підтримуються і **безкоштовно** поширюються фронтенди/бекенди для: ^ Платіжна система ^ Що приймає? ^ Фронтенд / бекенд ^ | [[https://easypay.ua/|EasyPay]] | Термінали\\ VISA\\ MasterCard | easypay, easypaymulti, easypaymultibyid | | [[http://2click.money/|2click]]| Термінали/картки | 2click | | [[http://24nonstop.com.ua/|24NonStop]] | Термінали | 24nonstop | | [[http://24nonstop.com.ua/|МобиАЗС]] | Термінали | 24nonstop| | [[https://privatbank.ua|Приватбанк]] | Приват24\\ Термінали\\ | privatx, privatx_strict, privatmulti, privatmultifa, [[openpayz#privat_multiserv|privat_multiserv]], PrivatGoose | | [[https://liqpay.ua/|LiqPay]] | VISA\\ MasterCard | liqpay | | [[https://www.ibox.ua/|iBox]] | Термінали | ibox, iboxmulti | | [[http://www.fbank.com.ua/|Банк "Фамільний"]] | Термінали 2click\\ Термінали CITY 24\\ Термінали БНК 24\\ Термінали ФК Система \\ Термінали TYME\\ WebMoney \\ Ipay \\ Walletone W1 \\ plategka.com\\ TachCard | fbank, fbankmulti (24nonstop) / fbank2 (easypay) | | [[https://ukrpays.com|Ukrpays]] | VISA\\ MasterCard\\ WebMoney\\ картки НСМЭП\\ City24\\ IBox\\ Tyme\\ EasyPay\\ E-Pay\\ 24NonStop\\ ФК Система\\ | ukrpays | | [[https://oplata.tinkoff.ru/|Банк "Тинькофф"]] | Visa \\ MasterCard\\ МИР\\ | tinkoff | | [[https://coin.com.ua/|COIN]] | VISA\\ MasterCard | 24nonstop | | [[https://mpay.lifecell.com.ua/|Mpay lifecell]] | мобільні платежі lifecell | easypay | | [[http://fondy.eu|fondy.eu]] | Qiwi\\ Яндекс.Деньги\\ Webmoney\\ VISA\\ MasterCard\\ Приват24 | fondy | | [[https://paymaster.ua/|Paymaster]] | VISA\\ MasterCard\\ WebMoney\\ Приват 24\\ MoneXy\\ LiqPay\\ Wishround | paymaster | | [[http://ipay.ua|iPay checkout]] | VISA\\ MasterCard\\ Google pay\\ Apple pay | ipayz | | [[http://ipay.ua|iPay MasterPass]] | VISA\\ MasterCard\\ ПРОСТІР | ipayx | | [[http://ipay.by|IPAY.BY]] | МТС (Беларусь)\\ Лайф (Беларусь)\\ Система «Расчет» (ЕРИП) | ipay_by | | [[http://qiwi.com|QIWI]] | Термінали | qiwi | | [[http://www.novo-plat.ru|Новоплат]] | Термінали | novoplat | | [[http://uniteller.ru/|Uniteller]] | VISA\\ MasterCard\\ JCB\\ Diners Club\\ ChinaUnionPay\\ QIWI Кошелек\\ Яндекс.Деньги\\ WebMoney WMR\\ Евросеть\\ EasyPay\\ MoneyMail\\ Platezh.ru\\ RBK Money\\ WebCreds\\ PayPal\\ Деньги@Mail.ru\\ мобільні платежі:\\ -МТС\\ - Мегафон\\ - Билайн\\ | uniteller | | [[http://www.comepay.ru/|Comepay]] | Термінали | comepay | | [[http://city-pay.com.ua/|City-Pay]] | Термінали | citypay | | [[https://www.city24.ua|City24]] | Термінали | city24 city24_multi City24Goose | | [[https://www.copayco.com/ru/|CoPAYCo]] | VISA\\ MasterCard\\ Укрексимбанк\\ Кредитпромбанк\\ НСМЭП\\ WebMoney | copayco | | [[http://www.pay-logic.ru/|Paylogic / ОСМП]] | Термінали | osmp | | [[http://www.sberbank.ru/|Сбербанк России]] | Готівкові платежі | sberbank | | [[https://www.portmone.com.ua/r3/|Portmone]] | VISA\\ Visa Electron\\ MasterCard\\ Cirrus\\ Maestro | portmone \\ portmonemulti | | [[http://www.platezhka.com.ua/|platezhka.com.ua]] (Банк Національный Кредит) | Термінали | platezhka | | [[https://money.yandex.ru/|Яндекс.Деньги]] | Яндекс.Деньги\\ VISA\\ MasterCard | yandex_notify | | [[https://www.monobank.com.ua/|Монобанк]] | кредитки | monobank, monobankmulti | | [[https://a24m.a-bank.com.ua/|АБанк24]] | кредитки | abank24multi | | [[https://fc-sistema.com/uk|ФК-Система]] | Термінали | fcsistemamulti | | [[https://pay.concord.ua/|ConcordPay]] | VISA\\ MasterCard\\ ApplePay\\ GooglePay | concordpay | | [[https://docs.click.uz/|ClickUZ]] | кредитки\\ Android APP | click_uz / myclickuz | | [[https://developer.help.paycom.uz/ru/nastroyka-vzaimodeystviya|PaymeUZ]] | кредитки\\ Android APP | payme_uz / mypaymeuz | | [[https://globalmoney.ua/|GlobalMoney]] | Термінали | globalmoney | | [[https://platon.ua/|Platon]] | Google Pay\\ Apple Pay\\ Приват24\\ Privat Pay\\ Masterpass\\ VisaCheckout\\ Visa\\ Mastercard\\ Простір | platon platonGoose | | Platonmobile | Google Pay\\ Apple Pay\\ Visa\\ Mastercard | [[openpayz#platonmobile|platonmobile]] | | [[https://providex.net/uk/|Providex]] | Google Pay\\ Apple Pay\\ Visa\\ Mastercard | [[openpayz#providex|providex]] / providex | | [[https://a-bank.com.ua/|А-банк]] | термінали, àbank24 | abankcombo, a-bank | ===== Як це працює? ===== В цілому якось так: {{:opzarch.png|}} З чого випливає, що платіжні системи безпосередньо спілкуються зі своїми "фронтендами", абоненти у разі потреби спілкуються з "бекендами" інтегрованими в кабінет користувача або прямо в сайт провайдера, а OpenPayz реєструє транзакції, що надійшли від "фронтендів", вносить їх до загального реєстру транзакцій і викликає для них різноманітні "обробники".\\ Транзакції реєструються для конкретного "віртуального ідентифікатора" (Платіжного ID) користувача однозначно прив'язаного до "реального ідентифікатора" (логіну) користувача Ubilling. Яким він буде і як це все працюватиме – залежить повністю від вас. Для візуального контролю появи нових транзакцій існує однойменний модуль Ubilling. ===== Встановлення ===== Починаючи з Ubilling 1.3.4 OpenPayz вже попередньо сконфігуровано інсталятором системи та готово до розгортання одразу після встановлення Ubilling. Вам залишається тільки скопіювати OpenPayz в директорію в якій він працюватиме та налаштувати необхідні вам фронтенди. Отож кладемо OpenPayz десь подалі і за межі кореневої директорії Ubilling: # cp -R /usr/local/www/apache24/data/billing/docs/openpayz /usr/local/www/apache24/data/ Та запам'ятовуємо, що OpenPayz тепер живе ось тут # cd /usr/local/www/apache24/data/openpayz/ Після чого перевіряємо очима, чи відповідають налаштування в **config/mysql.ini** нашим реаліям: ;database host server = "localhost" ;database port port = "3306" ;user login username = "mylogin" ;user password password = "newpassword" ;database name to use db = "stg" ;connection codepage character = "UTF8" ;tables prefix prefix = "op_" та зазираємо в конфіг **config/openpayz.ini** ; Вносити оплати до Stargazer напряму за допомогою sgconf? STG_DIRECT=1 ; Шлях до sgconf SGCONF=/usr/sbin/sgconf ; Хост на якому встановлено Stargazer STG_HOST=localhost ; Порт stargazer STG_PORT=5555 ; Логін адміністратора stargazer STG_LOGIN=admin ; Пароль адміністратора stargazer STG_PASSWD=123456 ;ID типу оплат Ubilling (Взагалі хорошою практикою було б додати для цього окремий, наприклад "Самообслуговування") UB_CASHTYPE=1 ; Надсилати сповіщення про отримані платежі електропоштою? (DEPRECATED) SEND_MAIL=0 ; Пошта на котру надсилатимуться сповіщення (DEPRECATED) NOTIFY_MAIL=notify@ourisp.ua ; Режим сильнонавантаженого OpenPayz із мульйонами транзакцій. При включенні цієї опції всі транзакції ; повинні періодично оброблятися в окремому потоці, зовнішнім воркером op_WorkerPaymentsProceed OP_HIGHLOAD_ENABLE=0 ; У такому форматі можна вказувати кастомні типи платежів для різних платіжних систем. ; Але ми все ж таки рекомендуємо використовувати один загальний UB_CASHTYPE для цих цілей, і розрізняти платіжні системи налаштувавши відповідний довідник. ;CASHTYPEID_EASYPAY=33 ;CASHTYPEID_PRIVATX=34 Щиро сподіваюсь, що з цим усе зрозуміло. Далі нам слід знати, що в каталозі **frontend** в окремих каталогах лежать модулі, що взаємодіють з нашими платіжними системами. Все спілкування з ними у нас відбувається тільки через них. Описувати все немає ніякої можливості, так що можливо слід зазирнутивсередину і подивитися чи немає там якихось специфічних налаштувань усередині.\\ **Увага:** при введенні в продакшн, слід видалити всі каталоги фронтендів, що не використовуються, а використовувані перейменувати на щось більш рандомне (наприклад frontend/privatbank_87GS923FF) з цілком зрозумілих причин. Можливо, варто занепокоїтися про допуск до цих директорій лише конкретних IP платіжних сервісів, з якими вони повинні працювати за допомогою htaccess. Це вже на ваш смак. Але ховати фронтенди перейменуванням та видаляти невикористовувані - **обов`язково**! \\ ===== Режим високої продуктивності ===== При ввімкненні опції OP_HIGHLOAD_ENABLE=1 вся обробка транзакцій перестає здійснюватися вбудованими у фронтенди викликами op_ProcessHandlers і повинна бути винесена в окремий воркер op_WorkerPaymentsProceed, що періодично викликається. Викликатися він може, наприклад із "crontab -e" якось так: */2 * * * * /usr/local/bin/php /usr/local/www/apache24/data/openpayz/libs/op_WorkerPaymentsProceed.php Слід також зауважити, що експлуатація OpenPayz з вимкненою опцією OP_HIGHLOAD_ENABLE у реальному світі та на продакшні вкрай не рекомендується. Відключати його має сенс лише при тестуванні та запуску нових фронтендів платіжних систем. В іншому випадку, ви можете банально напоротись на дублікати оплат, та інші в цілому очікувані ефекти. ===== Альтернативні Платіжні ID ===== В деяких, випадках, наприклад, з "міркувань легасі" вам може захотітись використовувати "якісь інші Платіжні ID". Для цього варто знати, що усі меппінги "Логін"=>"Платіжний ID" лежать в view вашої БД з іменем **op_customers**. Власне для того аби на ходу замінити їх всі на потрібне вам представлення трансформуючи дані ваших користувачів для цього як вам заманеться. Нижче декілька прикладів: ==== Рекомендований за замовчуванням ==== CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT users.login, CRC32(users.login) FROM users LEFT JOIN op_denied ON users.login = op_denied.login WHERE op_denied.login IS NULL; ==== З можливістю оверрайду статикою ==== CREATE OR REPLACE VIEW op_customers (realid,virtualid) as SELECT DISTINCT users.login as realid, COALESCE(op_static.virtualid,CRC32(users.login)) as virtualid FROM users LEFT JOIN op_static on op_static.realid=users.login LEFT JOIN op_denied ON users.login = op_denied.login WHERE op_denied.login IS NULL; ==== Без заборон ==== власне все той же за замовчуванням, але з ігноруванням заборон за рахунок чого є трішечки швидшим -- transform users.login -> crc32(users.login); CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT users.login, CRC32(users.login) FROM `users`; ==== Використовуємо IP ==== Або якось так, для використання IP адрес користувачів у вигляді INT -- transform users.login -> ip2int(users.IP); CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT users.login, INET_ATON(users.IP) from `users`; ==== Використовуємо логіни ==== Або якось так, у випадку якщо у вас повністю цифрові логіни користувачів: -- transform users.login -> users.login; CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT users.login, users.login from `users`; ==== Використовуємо угоди ==== Або якось так, якщо ви впевнені, що у всіх ваших користувачів є унікальні номери угод: -- transform contracts.login -> contracts.contract; CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT contracts.login, contracts.contract from `contracts`; ==== Непорожні угоди ==== Можна якось так, якщо ви впевнені, що у всіх ваших користувачів унікальні номери угод - в різниці від попереднього, не буде записів для користувачів з порожніми угодами: -- transform contracts.login -> contracts.contract; CREATE OR REPLACE VIEW `op_customers` (`realid`,`virtualid`) AS SELECT `users`.`login`,`contracts`.`contract` FROM (`users` JOIN `contracts` ON((`users`.`login` = `contracts`.`login`))) WHERE (`contracts`.`contract` <> ''); ==== Знову угоди ==== Наступне представлення більш універсальне, теж створює платіжний ID на базі номеру угоди, але виникають помилки при відсутній угоді. CREATE OR REPLACE VIEW `op_customers` (realid,virtualid) AS SELECT `users`.`login` AS `realid`,`contracts`.`contract` AS `virtualid` from (`users` join `contracts` on ((convert(`users`.`login` using utf8) = `contracts`.`login`))) where (`contracts`.`contract` <> ''); ==== Логін + угода ==== Також ви можете спробувати використовувати два різних платіжних ID для ваших користувачів, наприклад використовуючи для цього одночасно їх логін (сподіваємось що він цифровий) а також можливо номер угоди цього користувача, у випадку якщо він не порожній. Якось так: CREATE OR REPLACE VIEW `op_customers` (realid,virtualid) AS SELECT DISTINCT `users`.`login` AS `realid`, `users`.`login` AS `virtualid` FROM `users` LEFT JOIN `op_denied` ON `users`.`login` = `op_denied`.`login` WHERE `op_denied`.`login` IS NULL UNION SELECT DISTINCT `contracts`.`login` AS `realid`, `contracts`.`contract` AS `virtualid` FROM `contracts` LEFT JOIN `op_denied` ON `contracts`.`login` = `op_denied`.`login` WHERE `op_denied`.`login` IS NULL AND `contracts`.`contract` !='' AND `contracts`.`contract` IS NOT NULL Загалом як не складно помітити все лімітовано тільки збоченістю вашої фантазії ;)\\ (Переконайтесь що у вас всюди увімкнено OPENPAYZ_REALID для використання Платіжних ID з БД, до слова "всюди" це в [[alteriniconf|alter.ini]] та в [[userstats|userstats.ini]]) ==== Статичні платіжні ID ==== У випадку, якщо вам треба з якоїсь причини (ну наприклад хочете зберегти старі, які були до міграції), щоб платіжні ідентифікатори наглухо лежали в якійсь табличці в БД, ви можете налаштувати опцію **OPENPAYZ_STATIC_ID** конфігу [[alteriniconf|alter.ini]] та зберігати їх собі у окремій табличці **op_static**. В цьому вигляді вьюшка повинна мати наступний вигляд: CREATE OR REPLACE VIEW op_customers (realid,virtualid) AS SELECT op_static.realid, op_static.virtualid FROM op_static LEFT JOIN op_denied ON op_static.realid = op_denied.login WHERE op_denied.login IS NULL; ===== Розробка власного фронтенду ===== Далі, щоб було зрозуміло як це насправді працює ми можемо наприклад, написати наш власний фронтенд для прийому платежів від абстрактної "ГрабуйКоровани payment system" :) Специфікація отримання повідомлення про успішну оплату користувачем від платіжної системи "ГрабуйКоровани payment system" При успішному поповненні рахунку вам буде надіслано набір GET наступних обов'язкових параметрів: user - ідентифікатор користувача від якого отримано платіж transactionid – унікальний ідентифікатор платежу cash - сума платежу Якщо ви все добре, ви повинні відповісти нам у форматі "transactionid:код статусу" Де "код статусу" це OK - все добре, платіж отримано та оброблено USER_NOT_FOUND - немає такого користувача DONE – платіж вже оброблений, сума вже внесена на рахунок користувача NOT_ENOUGH_PARAMS - Ктулху фхтагн! Приклад запиту на внесення коштів з нашого боку: http://your_url/?user=90665123&transactionid=SDEFGSSDRHD324SDF&cash=100 Ось власне і все, у разі успіху - //op_TransactionAdd// створює нову транзакцію, а //op_ProcessHandlers// викликає стандартні обробники для всіх поки що необроблених транзакцій. Тепер Ubilling вміє грабувати коровани :) ===== Налаштування платіжних систем (очевидні і не дуже) ===== ==== Platonmobile ==== Мабуть, одна з перших "платіжок", що своїм конфігом спирається не тільки на доволі звичний багатьом власний **config/platonmobile.ini**, а й вимагає трохи додаткових рухів безпосередньо в біллінгу. \\ \\ Ітак: * вмикаємо модуль [[contragentextinfo|Додаткова інформація про контрагентів]]\\ * для необхідного нам контрагента створюємо новий запис для нашої платіжної системи в "Додатковій інфо про контрагента": {{ :contraextinfo3.png }} * або не помилитись - найменування платіжної системи бажано не вписувати руками, а вибрати з випадаючого списку наявних платіжних систем, бо найменування платіжної системи - **критично важливе** * **Merchant ID** та його **пароль** мають бути вписані точно в ті ж самі поля, які ви бачите на скріні вище, тобто **Код контрагента в платіжній системі** та **Пароль сервісу** відповідно * звичайно, за потреби ми можемо зробити необмежену кількість записів для кожного контрагента під необхідну кількість копій фронтендів даної платіжної системи Ось і все - налаштування креденшлів платіжної системи **Platonmobile** для певного господарюючого суб'єкта - завершено. \\ ==== Providex ==== * вмикаємо модуль [[contragentextinfo|Додаткова інформація про контрагентів]] \\ * для необхідного нам контрагента створюємо новий запис для нашої платіжної системи **PROVIDEX** в "Додатковій інфо про контрагента", враховуючи маппінг полів: {{ :contraextinfo_providex.png }} * звичайно, за потреби ми можемо зробити необмежену кількість записів для кожного контрагента під необхідну кількість копій фронтендів даної платіжної системи \\ ==== PRIVAT_MULTISERV ==== * вмикаємо модуль [[contragentextinfo|Додаткова інформація про контрагентів]]\\ * для необхідного нам контрагента створюємо новий запис для нашої платіжної системи **PB_MULTISERV**(нехай вас не бентежить трохи різне найменування, власне, платіжної системи та каталогу фронтенду - так історично склалося) в "Додатковій інфо про контрагента", враховуючи маппінг полів: {{ :contraextinfo_privat_multiserv.png }} * звичайно, за потреби ми можемо зробити необмежену кількість записів для кожного контрагента під необхідну кількість копій фронтендів даної платіжної системи