shicoy Posted July 8, 2015 Posted July 8, 2015 Притащили мне терминала оплаты (бывший Cyberplat кажется). Сказали научить принимать платежи напрямую в биллинг (ну шлюз написать не проблема). Вопрос, какой софт туда поставить что бы: - можно было сделать свой UI или как-то кустомизировать (цвета, лого, форма ввода лиц.счета) - умел печатать чеки, фискальную память поддерживал - принимал деньги :) Вставить ник Quote
pppoetest Posted July 8, 2015 Posted July 8, 2015 Смотрите модели купюроприёмника и принтера, гуглите мануалы на сайте производителя и пилите. Мы по крайней мере так поступили. Вставить ник Quote
Wingman Posted July 8, 2015 Posted July 8, 2015 Киберплатовский софт неплохо кастомизируется ; умеет складывать платежи для кастомного провайдера в отдельные файлики (которые скриптами можно слать как и куда угодно) А драйвера на купюроприёмник/принтер/тачскрин от софта не зависят Вставить ник Quote
Умник Posted July 8, 2015 Posted July 8, 2015 Они исходники своего терминального софта выкладывали, вот что-то и сейчас есть, но не знаю, насколько живо. https://help.cyberplat.com/projects/terminal/wiki Вставить ник Quote
shicoy Posted July 13, 2015 Author Posted July 13, 2015 Спасибо, но с Киберплатом такая засада, что версия 1 клиента, которая кустомизируется и т.д. не умеет работать с фискальной памятью. А доступная версия 3, просит ключей авторизации через сервис Киберплат. Конечно можно что-то скачать с SVN и попробовать самому, но для этого нужен ресурс кодера на Visual C/C++ которого у нас нет. :( Вставить ник Quote
stas_k Posted July 14, 2015 Posted July 14, 2015 Ну я бы все же посмотрел на модели купюроприемника, и посмотрел в сторону торгового оборудования типа атолл или штрих. у них есть куча компонентов и драйверов для 1С. с готовыми примерами на 1С, вижуальном бэйсике и местами на паскале. не нужен там ресурс кодера на С++. там просто обычный принтер и просто счетчик и просто обычный тачскрин. формочку можно за выходные запилить на php. разворачивать на весь экран браузер в иксах. читать из одного порта сколько купюр ввели. в обычный принтер печатать бумажку. вся кажущаяся сложность программного кода платежных систем от того только, что им нужно поддерживать кучу получателей платежей, в каком то развесистом меню это показывать, регулярно их список обновлять и собственный софт централизованно тоже обновлять. убери это и там не останется почти ничего. когда у тебя один получатель - ты, и софт ты обновляешь руками раз в год, вся задача становится значительно проще. Вставить ник Quote
shicoy Posted July 16, 2015 Author Posted July 16, 2015 Собственно у нас купюроприемник CashCode, принтер Custom VKP800, плюс будет еще фискальник (модель пока не знаю, видимо он ставится как-то на принтер). Есть кто готов взяться за реализацию, готовы договариваться по вознаграждению. Собственно требуется реализовать следующие шаги: 1) Начало (кнопка оплатить) 2) Ввод договора (запрос check в платежный шлюз) 3) Подтверждение договора (вывод на экран Инициалов и Баланс) 4) Прием денег и подтверждение оплаты 5) Печать чека Ну разумеется, с кустомизированной мордной (лого, телефон и т.д.). Протокол обмена между терминалом и платежных шлюзом OSMP по https. Вставить ник Quote
stas_k Posted July 16, 2015 Posted July 16, 2015 Сказали научить принимать платежи напрямую в биллинг (ну шлюз написать не проблема). Протокол обмена между терминалом и платежных шлюзом OSMP по https. а зачем вам тут OSMP? Вставить ник Quote
vop Posted July 16, 2015 Posted July 16, 2015 (edited) а зачем вам тут OSMP? Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :) Edited July 16, 2015 by vop Вставить ник Quote
stas_k Posted July 16, 2015 Posted July 16, 2015 Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :) А что это за биллинг такой который умеет только осмп? Вставить ник Quote
vop Posted July 17, 2015 Posted July 17, 2015 Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :) А что это за биллинг такой который умеет только осмп? Я подозреваю, что любой, где платежные системы продаются отдельно. Вот и получилось, что купили уже одну, теперь хотят под нее танцы исполнять. :) Вставить ник Quote
shicoy Posted July 22, 2015 Author Posted July 22, 2015 Да вообщем протокол может быть любым) Биллинг позволяет. Просто OSMP вроде как наиболее лаконичен) Вставить ник Quote
rdc Posted August 1, 2015 Posted August 1, 2015 Протокол osmp уже фактически стал стандартом. Даже крупные конторы типа МКБ сразу его предлагают… А что это за биллинг такой который умеет только осмп?Любой биллинг заведомо умеет осмп, так что вариант вполне логичен. Вставить ник Quote
stas_k Posted August 2, 2015 Posted August 2, 2015 Любой биллинг заведомо умеет осмп, так что вариант вполне логичен. протокол общения между терминалом и осмп, скорее всего, отличается от протокола общения между осмп и биллингом. я так думаю. Вставить ник Quote
ThreeDHead Posted August 9, 2015 Posted August 9, 2015 Ниже код для валидатора CashCode MVU. Запускать тупо из консоли. const.php <?php $BillToBill_CMD = array(); $BillToBill_CMD["ACK"] = pack("c*", 0x02, 0x03, 0x06, 0x00, 0xC2, 0x82); $BillToBill_CMD["Reset"] = pack("c*", 0x02, 0x03, 0x06, 0x30, 0x41, 0xB3); $BillToBill_CMD["GetStatus"] = pack("c*", 0x02, 0x03, 0x06, 0x31, 0xC8, 0xA2); $BillToBill_CMD["SetSecurity"] = pack("c*", 0x02, 0x03, 0x06, 0x32, 0x53, 0x90); $BillToBill_CMD["Poll"] = pack("c*", 0x02, 0x03, 0x06, 0x33, 0xDA, 0x81); $BillToBill_CMD["EnableBillTypes"] = pack("c*", 0x02, 0x03, 0x0C, 0x34, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xB5, 0xC1); $BillToBill_CMD["EnableBillTypesEscrow"] = pack("c*", 0x02, 0x03, 0x0C, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7); $BillToBill_CMD["DisableBillTypes"] = pack("c*", 0x02, 0x03, 0x0C, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x0C); $BillToBill_CMD["Stack"] = pack("c*", 0x02, 0x03, 0x06, 0x35, 0xEC, 0xE4); $BillToBill_CMD["Return"] = pack("c*", 0x02, 0x03, 0x06, 0x36, 0x77, 0xD6); $BillToBill_CMD["Identification"] = pack("c*", 0x02, 0x03, 0x06, 0x37, 0xFE, 0xC7); $BillToBill_CMD["Hold"] = pack("c*", 0x02, 0x03, 0x06, 0x38, 0x09, 0x3F); $BillToBill_CMD["CassetteStatus"] = pack("c*", 0x02, 0x03, 0x06, 0x3B, 0x92, 0x0D); $BillToBill_CMD["Dispense"] = pack("c*", 0x02, 0x03, 0x06, 0x3C, 0x2D, 0x79); $BillToBill_CMD["Unload"] = pack("c*", 0x02, 0x03, 0x06, 0x3D, 0xA4, 0x68); $BillToBill_CMD["EscrowCassetteStatus"] = pack("c*", 0x02, 0x03, 0x06, 0x3E, 0x3F, 0x5A); $BillToBill_CMD["EscrowCassetteUnload"] = pack("c*", 0x02, 0x03, 0x06, 0x3F, 0xB6, 0x4B); $BillToBill_CMD["SetCassetteType"] = pack("c*", 0x02, 0x03, 0x06, 0x40, 0xC6, 0xC0); $BillToBill_CMD["GetBillTable"] = pack("c*", 0x02, 0x03, 0x06, 0x41, 0x4F, 0xD1); $BillToBill_CMD["Download"] = pack("c*", 0x02, 0x03, 0x06, 0x50, 0x47, 0xD0); $BillToBill_Code = array( 0x10 => "Power Up", 0x11 => "Power Bill", 0x12 => "Power?", 0x13 => "Initialize", 0x14 => "Idling", 0x15 => "Accepting", 0x17 => "Stacking", 0x18 => "Returning", 0x19 => "Unit Disabled", 0x1A => "Holding", 0x1B => "Device Busy", 0x1C => "Rejecting", 0x1D => "Dispensing", 0x1E => "Unloading", 0x1F => "Custom returning", 0x20 => "Recycling unloading", 0x21 => "Setting cassette type", 0x25 => "Dispensed", 0x26 => "Unloaded", 0x27 => "Custom bills returned", 0x28 => "Recycling cassette unloaded", 0x29 => "Set cassette type", 0x30 => "Invalid command", 0x41 => "Drop Cassette Full", 0x42 => "Drop Cassette out of position", 0x43 => "Bill Validator Jammed", 0x44 => "Cassette Jammed", 0x45 => "Cheated", 0x46 => "Pause", 0x47 => "Generic Failure codes", 0x48 => "Bill-to-Bill unit Jammed", 0x80 => "Escrow position", 0x81 => "Bill stacked", 0x82 => "Bill returned"); $BillToBill_ExtendedCode = array(); $BillToBill_ExtendedCode[0x1C] = array( 0x60 => "Rejecting due to Insertion", 0x61 => "Rejecting due to Magnetic", 0x62 => "Rejecting due to bill - Remaining in the head", 0x63 => "Rejecting due to Multiplying", 0x64 => "Rejecting due to Conveying", 0x65 => "Rejecting due to Identification1", 0x66 => "Rejecting due to Verification", 0x67 => "Rejecting due to Optic", 0x68 => "Rejecting due to Inhibit", 0x69 => "Rejecting due to Capacity", 0x6A => "Rejecting due to Operation", 0x6C => "Rejecting due to Length"); $BillToBill_ExtendedCode[0x47] = array( 0x50 => "Stack Motor Failure", 0x51 => "Transport Motor Speed Failure", 0x52 => "Transport Motor Failure", 0x53 => "Aligning Motor Failure", 0x54 => "Initial Box Status Failure", 0x55 => "Optic Canal Failure", 0x56 => "Magnetic Canal Failure", 0x57 => "Cassette 1 Motor Failure", 0x58 => "Cassette 2 Motor Failure", 0x59 => "Cassette 3 Motor Failure", 0x5A => "Bill-to-Bill unit Transport Motor Failure", 0x5B => "Switch Motor 1 Failure", 0x5C => "Switch Motor 2 Failure", 0x5D => "Dispenser Motor 1 Failure", 0x5E => "Dispenser Motor 2 Failure", 0x5F => "Capacitance Canal Failure"); $BillToBill_ExtendedCode[0x48] = array( 0x70 => "Bill Jammed in Cassette 1", 0x71 => "Bill Jammed in Cassette 2", 0x72 => "Bill Jammed in Cassette 3", 0x73 => "Bill Jammed in Transport Path", 0x74 => "Bill Jammed in Switch", 0x75 => "Bill Jammed in Dispenser"); $BillToBill_ExtendedCode[0x81] = array( 0x00 => "100", 0x01 => "200", 0x02 => "500", 0x03 => "1000", 0x04 => "2000", 0x05 => "5000"); global $BillToBill_CMD, $BillToBill_Code, $BillToBill_ExtendedCode; ?> test-validator.php <?php //stty 9600 cs8 -parity -parenb -cstopb -istrip -ixon -crtscts clocal -F /dev/ttyS2 require_once("consts.php"); set_time_limit(5); $data = array("result"=>0, "result_text"=>"", "error"=>0, "error_text"=>""); $ValidatorHandle = null; function ValidatorOpen() { global $ValidatorHandle; return $ValidatorHandle = dio_open("interface", O_RDWR | O_NONBLOCK | O_NOCTTY); } function ValidatorClose() { global $ValidatorHandle; if ($ValidatorHandle) {dio_close($ValidatorHandle);} } function ValidatorSendACK() { global $ValidatorHandle, $BillToBill_CMD; if ($ValidatorHandle) {dio_write($ValidatorHandle, $BillToBill_CMD["ACK"]);} } function ErrorHandler($errno, $errstr, $errfile, $errline) { $data["error_text"] = $errstr; return false; } function ExecuteCommand($Command, &$CommandResult, $Waiting = true) { $CommandResult = null; global $ValidatorHandle; if ($ValidatorHandle) { dio_write($ValidatorHandle, $Command); if (!$Waiting) {break;} $result = null; $cur_time = time(); $expire_time = mktime(date("H", $cur_time), date("i", $cur_time), date("s", $cur_time) + 5, date("m", $cur_time), date("d", $cur_time), date("Y", $cur_time)); while (time() < $expire_time) { $result .= dio_read($ValidatorHandle, 255); if (($result) && (ord($result[2]) > 0) && (strlen($result) >= ord($result[2]))) { $CommandResult = $result; break; } else {usleep(50 * 1000);} } } if ($CommandResult) {return true;} else {return false;} } set_error_handler("ErrorHandler", E_ALL & ~E_NOTICE); $Repeat = true; while ($Repeat) { $Repeat = false; if (ValidatorOpen()) { echo "Reset..."; if (((ExecuteCommand($BillToBill_CMD["Reset"], $CommandResult)) && (ord($CommandResult[3]) == 0)) || ((ExecuteCommand($BillToBill_CMD["Reset"], $CommandResult)) && (ord($CommandResult[3]) == 0))) { echo "ok\n"; echo "Enable Bill Types..."; if ((ExecuteCommand($BillToBill_CMD["EnableBillTypes"], $CommandResult)) && (ord($CommandResult[3]) == 0)) { echo "ok\n"; $LastCode = null; while (!$Repeat) { if (ExecuteCommand($BillToBill_CMD["Poll"], $CommandResult)) { ValidatorSendACK(); $Code = ord($CommandResult[3]); if ($Code != 0) { if ($Code == $LastCode) {echo ".";} else { $LastCode = $Code; $ExtendedCode = ord($CommandResult[4]); echo "\n".dechex($Code)."H ".$BillToBill_Code[$Code]; if ($BillToBill_ExtendedCode[$Code][$ExtendedCode] != "") {echo " [".$BillToBill_ExtendedCode[$Code][$ExtendedCode]."]";} switch ($Code) { case 0x43: case 0x44: case 0x47: case 0x48: $Repeat = true; break; case 0x80: ExecuteCommand($BillToBill_CMD["Stack"], $CommandResult); break; case 0x81: echo " *BILLING MONEY* [$ExtendedCode]"; break; } } } } usleep(300 * 1000); } } else {echo "Failed to set bill types!";} } else {echo "Failed to reset!";} echo "\n"; ValidatorClose(); } else {echo "ERROR: Validator is not opened!";} if ($Repeat) {sleep(1);} } ?> Вставить ник Quote
MakarkinPRO Posted August 10, 2015 Posted August 10, 2015 (edited) Добрый день Коллеги: немного о себе, был "домашним локальным провайдером" по молодости, когда это все зарождалась. Настраивал в свое время спутниковый интернет для раздачи по сети (тогда же был изучен Linux)? когда еще за 1МБ платили =) Сейчас жизнь свела с интернетом, и еще одной теме - софту для платежных терминалов. Скажите, тех кто принимает платежи в офисах (наличка, пока что), было бы интересно "автоматизировать этот узел"? ps: мы не относимся НЕ к одной платежных систем. Автору написал в личку. Если да, то наверное я сначала спрошу разрешение у Админа форума, где и как можно создать эту тему.) Спасибо. Edited August 10, 2015 by MakarkinPRO Вставить ник Quote
Wingman Posted August 11, 2015 Posted August 11, 2015 Ниже код для валидатора CashCode MVU. Запускать тупо из консоли. Уже и драйвера на php? Моща! :))) Вставить ник Quote
ThreeDHead Posted August 11, 2015 Posted August 11, 2015 Уже и драйвера на php? Моща! :))) Мог на Баше, не стал. Ща придет Ванька и скажет что надо было компилять на Сях :) Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.