Jump to content
Калькуляторы

ПО для терминала оплаты у кого есть?

Притащили мне терминала оплаты (бывший Cyberplat кажется).

Сказали научить принимать платежи напрямую в биллинг (ну шлюз написать не проблема).

Вопрос, какой софт туда поставить что бы:

- можно было сделать свой UI или как-то кустомизировать (цвета, лого, форма ввода лиц.счета)

- умел печатать чеки, фискальную память поддерживал

- принимал деньги :)

Share this post


Link to post
Share on other sites

Смотрите модели купюроприёмника и принтера, гуглите мануалы на сайте производителя и пилите. Мы по крайней мере так поступили.

Share this post


Link to post
Share on other sites

Киберплатовский софт неплохо кастомизируется ; умеет складывать платежи для кастомного провайдера в отдельные файлики (которые скриптами можно слать как и куда угодно)

 

А драйвера на купюроприёмник/принтер/тачскрин от софта не зависят

Share this post


Link to post
Share on other sites

Они исходники своего терминального софта выкладывали, вот что-то и сейчас есть, но не знаю, насколько живо.

 

https://help.cyberplat.com/projects/terminal/wiki

Share this post


Link to post
Share on other sites

Спасибо, но с Киберплатом такая засада, что версия 1 клиента, которая кустомизируется и т.д. не умеет работать с фискальной памятью. А доступная версия 3, просит ключей авторизации через сервис Киберплат.

Конечно можно что-то скачать с SVN и попробовать самому, но для этого нужен ресурс кодера на Visual C/C++ которого у нас нет. :(

Share this post


Link to post
Share on other sites

Ну я бы все же посмотрел на модели купюроприемника,

 

и посмотрел в сторону торгового оборудования типа атолл или штрих. у них есть куча компонентов и драйверов для 1С. с готовыми примерами на 1С, вижуальном бэйсике и местами на паскале.

 

не нужен там ресурс кодера на С++. там просто обычный принтер и просто счетчик и просто обычный тачскрин. формочку можно за выходные запилить на php. разворачивать на весь экран браузер в иксах. читать из одного порта сколько купюр ввели. в обычный принтер печатать бумажку.

 

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

 

когда у тебя один получатель - ты, и софт ты обновляешь руками раз в год, вся задача становится значительно проще.

Share this post


Link to post
Share on other sites

Собственно у нас купюроприемник CashCode, принтер Custom VKP800, плюс будет еще фискальник (модель пока не знаю, видимо он ставится как-то на принтер).

Есть кто готов взяться за реализацию, готовы договариваться по вознаграждению.

Собственно требуется реализовать следующие шаги:

1) Начало (кнопка оплатить)

2) Ввод договора (запрос check в платежный шлюз)

3) Подтверждение договора (вывод на экран Инициалов и Баланс)

4) Прием денег и подтверждение оплаты

5) Печать чека

 

Ну разумеется, с кустомизированной мордной (лого, телефон и т.д.). Протокол обмена между терминалом и платежных шлюзом OSMP по https.

Share this post


Link to post
Share on other sites

Сказали научить принимать платежи напрямую в биллинг (ну шлюз написать не проблема).
Протокол обмена между терминалом и платежных шлюзом OSMP по https.

а зачем вам тут OSMP?

Share this post


Link to post
Share on other sites

а зачем вам тут OSMP?

 

Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :)

Edited by vop

Share this post


Link to post
Share on other sites

Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :)

А что это за биллинг такой который умеет только осмп?

Share this post


Link to post
Share on other sites

Патаму-чта, не существует унифицированных протоколов в этой области деятельности, о чем я как-то писал. Поэтому хотят тот протокол, который умеет их биллинг. :)

А что это за биллинг такой который умеет только осмп?

 

Я подозреваю, что любой, где платежные системы продаются отдельно. Вот и получилось, что купили уже одну, теперь хотят под нее танцы исполнять. :)

Share this post


Link to post
Share on other sites

Да вообщем протокол может быть любым) Биллинг позволяет. Просто OSMP вроде как наиболее лаконичен)

Share this post


Link to post
Share on other sites

Протокол osmp уже фактически стал стандартом. Даже крупные конторы типа МКБ сразу его предлагают…

 

А что это за биллинг такой который умеет только осмп?
Любой биллинг заведомо умеет осмп, так что вариант вполне логичен.

Share this post


Link to post
Share on other sites

Любой биллинг заведомо умеет осмп, так что вариант вполне логичен.

протокол общения между терминалом и осмп, скорее всего, отличается от протокола общения между осмп и биллингом.

я так думаю.

Share this post


Link to post
Share on other sites

Ниже код для валидатора 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);}
}

?>

 

 

Share this post


Link to post
Share on other sites

Добрый день Коллеги:

 

немного о себе, был "домашним локальным провайдером" по молодости, когда это все зарождалась. Настраивал в свое время спутниковый интернет для раздачи по сети (тогда же был изучен Linux)? когда еще за 1МБ платили =)

 

Сейчас жизнь свела с интернетом, и еще одной теме - софту для платежных терминалов. Скажите, тех кто принимает платежи в офисах (наличка, пока что), было бы интересно "автоматизировать этот узел"?

 

ps: мы не относимся НЕ к одной платежных систем.

 

Автору написал в личку. Если да, то наверное я сначала спрошу разрешение у Админа форума, где и как можно создать эту тему.)

 

Спасибо.

Edited by MakarkinPRO

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.