Платежи по свободным реквизитам CyberPlat® – оплата любых товаров и услуг
слон писал(а):ну, собственно, как любой банк-клиент. Коряво, конечно, но я наловчился. Конечно, на боевой точке с юной дамой будет трудно...
Уважаемый Слон посмотрите пожалуйста на бланк, интересует Ваше мнение пройдет платеж или нет, мой менеджер пока молчит по этому вопросу. И интересует такой вопрос возникает ли проблема на местах? т.е. когда придут люди с моим чеком подтверждать оплату допустим детского сада, а там тетки скажут мол ничего не знаю давай сберовскую квитанцию или весь месяц сама с ребенком сиди.
30 рублей не жалко-попробую. КБК - я так понимаю определяется из поля - тип платежа. А раз ОКАТО не указывается значит действительно со счетом получателя будут проблемы я только сейчас заметил, может где-то указать что в шапке указано ДС_42 л\с 06902220282 (еще бы знать что это такое) моет это тогда поможет определить платеж? А что надо писать в поле "назначение платежа"?
Да детские сады по крайней мере у нас - очень "забавные зверьки", пытались с ними заключить договор на прямую на прием платежей, все спрашивают - даже и слышать ничего не хотят, я так понял что гл.буху чем меньше контр.агентов тем удобней жить и короче рабочий день, хотя может я ошибаюсь и причина в другом.
Да детские сады по крайней мере у нас - очень "забавные зверьки", пытались с ними заключить договор на прямую на прием платежей, все спрашивают - даже и слышать ничего не хотят, я так понял что гл.буху чем меньше контр.агентов тем удобней жить и короче рабочий день, хотя может я ошибаюсь и причина в другом.
-
Гость
слон писал(а):да, думаю можно в назначении дописать кбк и окато, а еще дс_42 и номер лицевого счета садика и свой. Но все это не влезет в поле назначения . b_w
Вы ошибаетесь, КБК и ОКАТО - это отдельные реквы бюджетного платежа. В назначении их нет смысла указывать. Манагер организует, если объем интересный. Ну а на местном уровне (в детсаду) - как договоритесь. Согласуйте с ними свои чеки.
Как сделать прием платежей на своего провайдера в онлайне, используя ПО Киберплат
Очень краткий FAQ о том, как на своих терминалах сделать прием платежей на собственного провайдера в онлайне, используя ПО Киберплат.
Вступление:
1. Не писатель я литературных рассказов!!!!!, просьба не пинать за стиль изложения, он у меня своеобразный!!!!
2. листинг нашего ПО это для версий кибера до 2.0.Х, часть кода вырезана, знаки ХХХХ.
3. Все рассказано в сильно общих чертах, особенно что касается взаимодействия с «вашим-нашим» банком,
4. Для работы с ДР банком используется «вторая» пара ключей.
5. Используется библиотека криптования (файл libipriv.dll) версии 1.0.0.1, можно найти в ранних версиях вэбклиента
6. Могут быть неточности или очепятки.
7. За то что мы используем ПО от ПС Киберплат для проведения платежей иных провайдеров не представленных в ПС КиберПлат мы проводим через ПС Киберплат те платежи которые у них представлены.
8. В последней версии ПО 2.0.7 убрана поддержка обращения к локалхост не черз хттпс!!! Пока курим доки как реализовать это с меньшим количеством костылей.
9. Написать можно все, вопрос в мозгах прогера.
10. На этом же принципе реализовали работу с системой «ГОРОД» или что то подобное точно не помню.
11. Что бы вынести из этого поста что то нужное для себя у Вас должно быть некое понятие процесса работы с ПС Киберплат.
12. Все пожелания типа, А можно поподробней это уже к нашему программисту.
И так, стоит задача автоматизировать прием «неких» платежей на софте ПС Киберплата. Исследовав ПО (логи и пр.) от Киберплата нашли очень много интересного в плане как использовать работу ПО для своих провайдеров, применяя логику ПО Киберплата в проведение и отбражениие и полученни статусов по платежам, а именно были интересными вызовы скриптов на шлюзы ПС Киберплат из файла операторс на тереме
Как видим по логу вызовы «куда и чего» формируются из файла операторс
Часть лога
11:03:44.437 [I] Payment 1257. Processing...
11:03:44.437 [I] Payment 1257. CHECK, operator: 5 (МегаФон (Урал)), session: 20101116110344437216, amount_all: 10.00, amount: 10.00.
11:03:44.453 [I] Payment 1257. Sending request to url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi. Fields: ACCOUNT = "", AMOUNT = "10.00", AMOUNT_ALL = "10.00", AP = "1874038", COMMENT = "20101116110321515122", NUMBER = "922692ХХХХ", OP = "1876503", SD = "1860224", SESSION = "20101116110344437216".
11:03:53.421 [I] Payment 1257. Response from url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi received. Fields: ACCOUNT = "", AUTHCODE = "", DATE = "16.11.2010 11:03:50", ERRMSG = "", ERROR = "0", OPNAME = "", RESULT = "0", SESSION = "20101116110344437216", TRANSID = "1001868597843".
11:03:53.421 [I] Payment 1257. Performing post step action. Step: check.
11:03:53.421 [I] Payment 1257. PAYMENT, operator: 5 (МегаФон (Урал)), session: 20101116110344437216, amount_all: 10.00, amount: 10.00.
11:03:53.546 [I] Payment 1257. Sending request to url service.cyberplat.ru/cgi-bin/ur ... ug_pay.cgi. Fields: ACCOUNT = "", AMOUNT = "10.00", AMOUNT_ALL = "10.00", AP = "1874038", COMMENT = "20101116110321515122", NUMBER = "922692ХХХХ", OP = "1876503", SD = "1860224", SESSION = "20101116110344437216".
11:03:58.750 [I] Payment 1257. Response from url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay.cgi received. Fields: DATE = "16.11.2010 11:03:55", ERROR = "0", RESULT = "0", SESSION = "20101116110344437216", TRANSID = "1001868597843".
11:03:58.750 [I] Payment 1257. Performing post step action. Step: payment.
11:03:58.750 [I] Payment 1257. Payment complete.
Часть файла операторс (оператор мегафон Урал), где есть эти запросы.
<processor rounding="false" keys="0" type="cyberplat" skip_check="true" pay_online="false" >
<request name="check">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi</url>
<request_property name="NUMBER" value="{100}" />
</request>
<request name="payment">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay.cgi</url>
<request_property name="NUMBER" value="{100}" />
</request>
<request name="status">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_status.cgi</url>
</request>
</processor>
Видим урл, классно, решили попробовать в файле опрераторс заменить строку вызова скрипта на свою (тег <url>)
<processor rounding="false" keys="2" type="cyberplat" skip_check="false" pay_online="false" show_add_info="true">
<request name="check">
<url>localhost/_pay_check.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
<receive_property name="ADDINFO" />
</request>
<request name="payment">
<url>localhost/_pay.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
</request>
<request name="status">
<url>localhost/status.asp</url>
</request>
</processor>
Как видим вместо конкретного урла появился локалхост, с которого и вызывается нужный нам скрипт (файл!!! запустить можно что угодно).
Мы использовали IIS который идет с вин ХП ПРО (IIS вер 5), ставим так, заходим в установку удаление программ, далее в установку компонентов винды и видим желанный IIS, ставим и находим на диске папку Х:\Inetpub\wwwroot\, вот тут то и буду лежать наши скрипты (файлы) вызываемые из файла операторс.
Далее «курим» алгоритм ПС Киберплат, выясняем что на сервере Киберплата на каждом шлюзе у каждого опера есть 3 скрипта
1 Проверка номера (service.cyberplat.ru/cgi-bin/хх/хх_pay_check.cgi
2 Проведение платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay.cgi
3 Проверка статуса платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay_status.cgi
к этим скриптам ПО на тереме обращается на разных стадиях платежа (взято отсюда service.cyberplat.ru/cgi-bin/view_stat.utf/help.cgi),
Так теперь думаем как это использовать и к чему это прикрутить. Гуглим. У нас есть некий банк у которого есть сервис чтобы платить через интернет со своей банковской карты в пользу разных поставщиков услуг. Идем в банк, открываем карту, получаем ее, изучаем как идет обмен при «платеже» при платеже используется авторизация, номер карты и некий дин код или что то подобное, О, то что нам надо, идем дальше. Выходим на банк (самое сложное!!!!) и выциганиваем протокол работы, предварительно объясняя что хотим «это» делать через терминал и у нас очень бооольшие планы и т.д. Доки получили, курим, пробуем, и тестим, и вуаля, кое что начинает работать.
Из протокола который получили у банка выясняем что у всех операторов есть код услуги (аналог номера в операторс) и поля которые передаются после заполнения формы на сайте и нажатии на кнопку оплатить, все это шифруется через хттпс и отправляется на «сайт» банка, ну здорово, значит нам нужно обыграть это через ПО Киберплата.
Пишем в операторсе своего оператора с нужными нам данными и вводимыми полями, в данном случае номер оператора или «код услуги» как это называться у нашего банка заводим через поле "ACCOUNT" а некоторые спец параметры для платежа указываем через двоеточие (это особенность только наверное нашего банка, платежи делить на количество шагов, в данном случае у платежа 2 шага)
<operator id="100130">
<name>ОАО Удмуртская Энергосбытовая компания</name>
<limit min="10" max="10000" system="" />
<fields>
<field type="number" id="100" min_size="1" max_size="9" >
<name>Лицевой счет ОАО Удмуртская Энергосбытовая компания</name>
<comment>Введите лицевой счет ОАО Удмуртская Энергосбытовая компания, от 1 до 9 знаков</comment>
</field>
</fields>
<processor rounding="false" keys="2" type="cyberplat" skip_check="false" pay_online="false" show_add_info="true">
<request name="check">
<url>localhost/_pay_check.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
<receive_property name="ADDINFO" />
</request>
<request name="payment">
<url>localhost/_pay.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
</request>
<request name="status">
<url>localhost/status.asp</url>
</request>
</processor>
<receipts>
<parameter name="OPERATOR_INN" value="1831060988"/>
<parameter name="OPERATOR_NAME" value="ОАО Удмуртская Энергосбытовая компания"/>
<receipt type="UTB" template="UTB_ADD.xml"/>
</receipts>
</operator>
после обработки этого оператора (запуска ПО и ввода данных) получаем сформированный ПО кибера платежный пакет (в версиях ПО от 2.Х это лежит в базе данных (ну или почти это), то что показано здесь это от ПО 1.0.Х, это просто для наглядности).
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<root>
<fields>
<NUMBER>хххххххххх</NUMBER>
<ACCOUNT>130:2</ACCOUNT>
<AMOUNT>97.00</AMOUNT>
<AMOUNT_ALL>100.00</AMOUNT_ALL>
</fields>
<processor_type>Cyberplat</processor_type>
<operator_id>100130</operator_id>
<initial_session_num>хххххххххххххххххххххххх</initial_session_num>
<last_session></last_session>
<transid></transid>
<status>0</status>
<last_error_code>0</last_error_code>
<cancelled>0</cancelled>
<first_try_dt>хххххххххххххххх</first_try_dt>
<next_try_dt>ххххххххххххххх</next_try_dt>
<num_of_tries>0</num_of_tries>
<notes>
<note validator_id="0" currency_id="RUR" nominal="100" count="1"/>
</notes>
</root>
После этого ПО кибера начинает его «проводить» вызывая соотв скрипты из директорий Х:\Inetpub\wwwroot\. ПО Киберплата вызывает наш скрипт и передает ему данные указанные в сформированном пакете платежа. Ну и так далее
Теперь самое интересное.
Т.К. я не получил разрешения у автора нашей программы на публикацию всего кода, то выложу лишь кое какие моменты.
Файл общих функций
var Carding = "хххххххххххххххххххх";
var DIN = "ххххххххххххххх";
var keynumb = ххххххххххх; //здесь укажем номер pubkey для текущего терминала
var passw = "ххххххххххххххххх"
var Serv = "https://хххххххх.ххх"
function GetBodyRequest() { // Возвращает текстовое поле полученное по Request.BinaryRead()
var adoStream = new ActiveXObject("ADODB.Stream")
adoStream.Mode = 3 //read/write mode
adoStream.Open //Open the stream
adoStream.Type = 1 //adTypeBinary - Set it as binary
//Read the stream in from the request object
adoStream.Write(Request.BinaryRead(Request.TotalBytes))
adoStream.Position = 0 //reset the position
adoStream.Type = 2 //text
adoStream.Charset = "us-ascii"
var msg = new String(adoStream.ReadText);
for (var i = 0; i < 10; i++) {
msg = msg.replace("%2b","+")
}
return (msg)
}
function FNSFormated(Suffics,session) { // Возвращает строку в формате YYYY-MM-DD-<Suffics>
ХХХ
ХХХ
}
function DateTimeRequest() { // Возвращает строку в формате DD.MM.YYYY
ХХХХ
ХХХХ
function SignVerify(SignMsg,PubkeyFile,KeyNumber) { // Возвращает тело сообщения без подписи. При ошибке ""
var UserPublicKey=new ActiveXObject ("Libipriv.PublicKey");
// Загружаем объект для работы с ЭЦП
var Signer=new ActiveXObject ("Libipriv.Signer");
// Загружаем открытый ключ из файла "pubkeys.key" банка с серийным номером "XXXXXXX"
if(UserPublicKey.LoadFromFile(PubkeyFile,KeyNumber)) {
ХХХХХХ
}
return (UnsignMsg);
}
function Sign(Msg,SeckeyFile,Pwd) { // Возвращает сообщения c подписью. При ошибке ""
// Загружаем объект закрытого ключа (для формирования подписи)
ХХХХХХХХХ
// Загружаем объект для работы с ЭЦП
var Signer=new ActiveXObject ("Libipriv.Signer");
// Загружаем закрытый ключ из файла "<SeckeyFile>", кодовая фраза - "<Pwd>"
if(UserSecretKey.LoadFromFile(SeckeyFile,Pwd)) {
// Подписываем оригинальное сообщение закрытым ключем
var Sign=Signer.Sign(Msg,UserSecretKey);
}
return(Sign);
}
function GetField(Msg,Name,StopSymb) { // Возвращает значение поля <Name> из <Msg> до ограничителя <StopSymb>
var start, end;
var Field = new String();
start = Msg.search(Name);
Field = Msg.substring(start+Name.length,Msg.length);
end = Field.search(StopSymb);
return(Field.substring(0,end));
}
ххх
ххх
ххх
ххх
return(Ans)
}
function WriteLog(FileName,Str) { //запись в файл <FileName> строки <Str>
ххх
ххх
ххх
ххх
}
function WriteMessage(FileName,Str) { //запись в файл <FileName> строки <Str>
ххх
ххх
ххх
function GetPayAttribute (FileName,Session){
ххх
ххх
ххх
return("")
файл платежа (выполняем платеж)
<%
var TimeStamp = DateTimeRequest(); // получаем метку времени
var MSG = GetBodyRequest(); // получаем содержимое request
Err = 30
MSG = MSG.substring(13,MSG.length); // отбрасываем inputmessage=
var BdMSG=SignVerify(MSG,"C:/WebClient/keys/pubkeys.key",keynumb)+"\r\n";
//============Разбираем на поля =====================================
var Session = GetField(BdMSG,"SESSION=","\r");
//======Формируем ответ для терминала==========================================
var Answer = "DATE="+TimeStamp+"\r\nSESSION="+Session+"\r\nERROR=0"+"\r\nRESULT=0\r\n";
// Подписываем документ для правильного отображения в клиенте
var SignAnswer = Sign(Answer,"C:/WebClient/keys/secret.key",pass);
//--------------------------------------------------------------
%>
<% = SignAnswer %>
файл проверки статуса платежа и выполнение «первого платежа»
<%@ Language="JScript" %>
<% Response.Buffer = true %>
<!--#include virtual="Function.js"-->
<%
var TimeStamp = DateTimeRequest(); // получаем метку времени
var MSG = GetBodyRequest(); // получаем содержимое request
MSG = MSG.substring(13,MSG.length); // отбрасываем inputmessage=
var BdMSG=SignVerify(MSG,"C:/WebClient/keys/pubkeys.key",keynumb)+"\r\n";
//============Разбираем на поля =================================================
// WriteLog("c:/WebClient/logs/BodyMess.log",TimeStamp+" Check: "+BdMSG);
var Session = GetField(BdMSG,"SESSION=","\r");
var FileNC = FNSFormated("ConnUTB.txt",Session); // формируем имя лог-файла атрибутов платежа для проверки статуса
var FileNP = FNSFormated("PayUTB.txt",Session); // формируем имя лог-файла атрибутов платежа для проверки статуса
var Amount = GetField(BdMSG,"AMOUNT=","\r"); if (test!=0) {Amount="0.01"};
var InitSess = "";
var Req = GetField(BdMSG,"REQ_TYPE=","\r");
if (Req != "1") {InitSess = GetField(BdMSG,"COMMENT=","\r");}
var Numb = GetField(BdMSG,"NUMBER=","\r");
var Selecto = GetField(BdMSG,"ACCOUNT=",":");
var NextStep = GetField(BdMSG,"ACCOUNT=","\r") + "\r";
NextStep = GetField(NextStep,":","\r");
//====== Связь с Трастовым банком =======
var Str1 = "utb_dealer_card_number="+Card+"&utb_dealer_card_din="+DIN;
var AnswerUTB_s1 = PostURL(Serv+"/dealer/data/auth.xml?"+Str1,"",Session);
var SessID = GetField(AnswerUTB_s1,"<session_id>","<");
var Status = "";
var Err = 0;
var ErrCode = "";
if (NextStep == "2") {
var Str2 = "utb_dealer_sess_id="+SessID+"&selecto="+Selecto+"&step=2&AdvInfo="+Numb;
var AnswerUTB_s2 = PostURL(Serv+"/dealer/data/payment.xml?"+Str2,"",Session);
Status = GetField(AnswerUTB_s2,"<status>","</status>");
if (Status == "0") {
ххх
х
х
х
х
х
х
х }
if (ErrCode == ""){
var Str3 = "utb_dealer_sess_id="+SessID+"&selecto="+Selecto+"&step=3&AdvInfo="+
Numb+"&summ="+Amount+"&payment_number="+InitSess;
var AnswerUTB_s3 = PostURL(Serv+"/dealer/data/payment.xml?"+Str3,"",Session);
Status = GetField(AnswerUTB_s3,"<status>","</status>");
if (Status != "0") {
ErrCode = GetField(AnswerUTB_s3,"<error_code>","</error_code>");
Err = 50;
}
else {
if (Req != "1") {
submit_payment_key = GetField(AnswerUTB_s3,"<submit_payment_key>","</submit_payment_key>");
var LogStr = "Session="+Session+",number="+Numb+",selecto="+Selecto+",summ="+Amount+
",submit_payment_key="+submit_payment_key+
",utb_dealer_sess_id="+SessID+",InitSessionNumber="+InitSess+";";
WriteLog("c:/WebClient/logs/"+FileNC,TimeStamp+" "+LogStr);
//====== Связь с Трастовым банком - СРАЗУ ВЫПОЛНЯЕМ ПЛАТЕЖ =======
х
хх
х
х
х
if (Status == "0") {
AuthCode = GetField(AnswerUTB_s4,"<auth_code>","</auth_code>");
Date = GetField(AnswerUTB_s4,"<date>","</date>");
}
var LogStr = "ServDate="+Date+",Session="+Session+",number="+Numb+",payment_key="+
submit_payment_key+",utb_dealer_sess_id="+SessID+
",InitSessionNumber="+InitSess+",summ="+Amount+",AuthCode="+AuthCode+";";
WriteLog("c:/WebClient/logs/"+FileNP,TimeStamp+" "+LogStr);
}
}
}
if (ErrCode == "4") {Err = 21}
if (ErrCode == "110") {Err = 23}
if (ErrCode == "104") {Err = 30}
if (ErrCode == "3") {Err = 9}
//======Формируем ответ для терминала==========================================
var Answer = "DATE="+TimeStamp+"\r\nSESSION="+Session+"\r\nERROR="+Err+"\r\nRESULT=0"+"\r\nTRANSID="+InitSess;
var SignAnswer = Sign(Answer,"C:/WebClient/keys/secret.key",pass);
%>
<% = SignAnswer %>
Вступление:
1. Не писатель я литературных рассказов!!!!!, просьба не пинать за стиль изложения, он у меня своеобразный!!!!
2. листинг нашего ПО это для версий кибера до 2.0.Х, часть кода вырезана, знаки ХХХХ.
3. Все рассказано в сильно общих чертах, особенно что касается взаимодействия с «вашим-нашим» банком,
4. Для работы с ДР банком используется «вторая» пара ключей.
5. Используется библиотека криптования (файл libipriv.dll) версии 1.0.0.1, можно найти в ранних версиях вэбклиента
6. Могут быть неточности или очепятки.
7. За то что мы используем ПО от ПС Киберплат для проведения платежей иных провайдеров не представленных в ПС КиберПлат мы проводим через ПС Киберплат те платежи которые у них представлены.
8. В последней версии ПО 2.0.7 убрана поддержка обращения к локалхост не черз хттпс!!! Пока курим доки как реализовать это с меньшим количеством костылей.
9. Написать можно все, вопрос в мозгах прогера.
10. На этом же принципе реализовали работу с системой «ГОРОД» или что то подобное точно не помню.
11. Что бы вынести из этого поста что то нужное для себя у Вас должно быть некое понятие процесса работы с ПС Киберплат.
12. Все пожелания типа, А можно поподробней это уже к нашему программисту.
И так, стоит задача автоматизировать прием «неких» платежей на софте ПС Киберплата. Исследовав ПО (логи и пр.) от Киберплата нашли очень много интересного в плане как использовать работу ПО для своих провайдеров, применяя логику ПО Киберплата в проведение и отбражениие и полученни статусов по платежам, а именно были интересными вызовы скриптов на шлюзы ПС Киберплат из файла операторс на тереме
Как видим по логу вызовы «куда и чего» формируются из файла операторс
Часть лога
11:03:44.437 [I] Payment 1257. Processing...
11:03:44.437 [I] Payment 1257. CHECK, operator: 5 (МегаФон (Урал)), session: 20101116110344437216, amount_all: 10.00, amount: 10.00.
11:03:44.453 [I] Payment 1257. Sending request to url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi. Fields: ACCOUNT = "", AMOUNT = "10.00", AMOUNT_ALL = "10.00", AP = "1874038", COMMENT = "20101116110321515122", NUMBER = "922692ХХХХ", OP = "1876503", SD = "1860224", SESSION = "20101116110344437216".
11:03:53.421 [I] Payment 1257. Response from url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi received. Fields: ACCOUNT = "", AUTHCODE = "", DATE = "16.11.2010 11:03:50", ERRMSG = "", ERROR = "0", OPNAME = "", RESULT = "0", SESSION = "20101116110344437216", TRANSID = "1001868597843".
11:03:53.421 [I] Payment 1257. Performing post step action. Step: check.
11:03:53.421 [I] Payment 1257. PAYMENT, operator: 5 (МегаФон (Урал)), session: 20101116110344437216, amount_all: 10.00, amount: 10.00.
11:03:53.546 [I] Payment 1257. Sending request to url service.cyberplat.ru/cgi-bin/ur ... ug_pay.cgi. Fields: ACCOUNT = "", AMOUNT = "10.00", AMOUNT_ALL = "10.00", AP = "1874038", COMMENT = "20101116110321515122", NUMBER = "922692ХХХХ", OP = "1876503", SD = "1860224", SESSION = "20101116110344437216".
11:03:58.750 [I] Payment 1257. Response from url service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay.cgi received. Fields: DATE = "16.11.2010 11:03:55", ERROR = "0", RESULT = "0", SESSION = "20101116110344437216", TRANSID = "1001868597843".
11:03:58.750 [I] Payment 1257. Performing post step action. Step: payment.
11:03:58.750 [I] Payment 1257. Payment complete.
Часть файла операторс (оператор мегафон Урал), где есть эти запросы.
<processor rounding="false" keys="0" type="cyberplat" skip_check="true" pay_online="false" >
<request name="check">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_check.cgi</url>
<request_property name="NUMBER" value="{100}" />
</request>
<request name="payment">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay.cgi</url>
<request_property name="NUMBER" value="{100}" />
</request>
<request name="status">
<url>service.cyberplat.ru/cgi-bin/ural_gsm/ug_pay_status.cgi</url>
</request>
</processor>
Видим урл, классно, решили попробовать в файле опрераторс заменить строку вызова скрипта на свою (тег <url>)
<processor rounding="false" keys="2" type="cyberplat" skip_check="false" pay_online="false" show_add_info="true">
<request name="check">
<url>localhost/_pay_check.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
<receive_property name="ADDINFO" />
</request>
<request name="payment">
<url>localhost/_pay.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
</request>
<request name="status">
<url>localhost/status.asp</url>
</request>
</processor>
Как видим вместо конкретного урла появился локалхост, с которого и вызывается нужный нам скрипт (файл!!! запустить можно что угодно).
Мы использовали IIS который идет с вин ХП ПРО (IIS вер 5), ставим так, заходим в установку удаление программ, далее в установку компонентов винды и видим желанный IIS, ставим и находим на диске папку Х:\Inetpub\wwwroot\, вот тут то и буду лежать наши скрипты (файлы) вызываемые из файла операторс.
Далее «курим» алгоритм ПС Киберплат, выясняем что на сервере Киберплата на каждом шлюзе у каждого опера есть 3 скрипта
1 Проверка номера (service.cyberplat.ru/cgi-bin/хх/хх_pay_check.cgi
2 Проведение платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay.cgi
3 Проверка статуса платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay_status.cgi
к этим скриптам ПО на тереме обращается на разных стадиях платежа (взято отсюда service.cyberplat.ru/cgi-bin/view_stat.utf/help.cgi),
Так теперь думаем как это использовать и к чему это прикрутить. Гуглим. У нас есть некий банк у которого есть сервис чтобы платить через интернет со своей банковской карты в пользу разных поставщиков услуг. Идем в банк, открываем карту, получаем ее, изучаем как идет обмен при «платеже» при платеже используется авторизация, номер карты и некий дин код или что то подобное, О, то что нам надо, идем дальше. Выходим на банк (самое сложное!!!!) и выциганиваем протокол работы, предварительно объясняя что хотим «это» делать через терминал и у нас очень бооольшие планы и т.д. Доки получили, курим, пробуем, и тестим, и вуаля, кое что начинает работать.
Из протокола который получили у банка выясняем что у всех операторов есть код услуги (аналог номера в операторс) и поля которые передаются после заполнения формы на сайте и нажатии на кнопку оплатить, все это шифруется через хттпс и отправляется на «сайт» банка, ну здорово, значит нам нужно обыграть это через ПО Киберплата.
Пишем в операторсе своего оператора с нужными нам данными и вводимыми полями, в данном случае номер оператора или «код услуги» как это называться у нашего банка заводим через поле "ACCOUNT" а некоторые спец параметры для платежа указываем через двоеточие (это особенность только наверное нашего банка, платежи делить на количество шагов, в данном случае у платежа 2 шага)
<operator id="100130">
<name>ОАО Удмуртская Энергосбытовая компания</name>
<limit min="10" max="10000" system="" />
<fields>
<field type="number" id="100" min_size="1" max_size="9" >
<name>Лицевой счет ОАО Удмуртская Энергосбытовая компания</name>
<comment>Введите лицевой счет ОАО Удмуртская Энергосбытовая компания, от 1 до 9 знаков</comment>
</field>
</fields>
<processor rounding="false" keys="2" type="cyberplat" skip_check="false" pay_online="false" show_add_info="true">
<request name="check">
<url>localhost/_pay_check.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
<receive_property name="ADDINFO" />
</request>
<request name="payment">
<url>localhost/_pay.asp</url>
<request_property name="NUMBER" value="{100}" />
<request_property name="ACCOUNT" value="130:2" />
</request>
<request name="status">
<url>localhost/status.asp</url>
</request>
</processor>
<receipts>
<parameter name="OPERATOR_INN" value="1831060988"/>
<parameter name="OPERATOR_NAME" value="ОАО Удмуртская Энергосбытовая компания"/>
<receipt type="UTB" template="UTB_ADD.xml"/>
</receipts>
</operator>
после обработки этого оператора (запуска ПО и ввода данных) получаем сформированный ПО кибера платежный пакет (в версиях ПО от 2.Х это лежит в базе данных (ну или почти это), то что показано здесь это от ПО 1.0.Х, это просто для наглядности).
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<root>
<fields>
<NUMBER>хххххххххх</NUMBER>
<ACCOUNT>130:2</ACCOUNT>
<AMOUNT>97.00</AMOUNT>
<AMOUNT_ALL>100.00</AMOUNT_ALL>
</fields>
<processor_type>Cyberplat</processor_type>
<operator_id>100130</operator_id>
<initial_session_num>хххххххххххххххххххххххх</initial_session_num>
<last_session></last_session>
<transid></transid>
<status>0</status>
<last_error_code>0</last_error_code>
<cancelled>0</cancelled>
<first_try_dt>хххххххххххххххх</first_try_dt>
<next_try_dt>ххххххххххххххх</next_try_dt>
<num_of_tries>0</num_of_tries>
<notes>
<note validator_id="0" currency_id="RUR" nominal="100" count="1"/>
</notes>
</root>
После этого ПО кибера начинает его «проводить» вызывая соотв скрипты из директорий Х:\Inetpub\wwwroot\. ПО Киберплата вызывает наш скрипт и передает ему данные указанные в сформированном пакете платежа. Ну и так далее
Теперь самое интересное.
Т.К. я не получил разрешения у автора нашей программы на публикацию всего кода, то выложу лишь кое какие моменты.
Файл общих функций
var Carding = "хххххххххххххххххххх";
var DIN = "ххххххххххххххх";
var keynumb = ххххххххххх; //здесь укажем номер pubkey для текущего терминала
var passw = "ххххххххххххххххх"
var Serv = "https://хххххххх.ххх"
function GetBodyRequest() { // Возвращает текстовое поле полученное по Request.BinaryRead()
var adoStream = new ActiveXObject("ADODB.Stream")
adoStream.Mode = 3 //read/write mode
adoStream.Open //Open the stream
adoStream.Type = 1 //adTypeBinary - Set it as binary
//Read the stream in from the request object
adoStream.Write(Request.BinaryRead(Request.TotalBytes))
adoStream.Position = 0 //reset the position
adoStream.Type = 2 //text
adoStream.Charset = "us-ascii"
var msg = new String(adoStream.ReadText);
for (var i = 0; i < 10; i++) {
msg = msg.replace("%2b","+")
}
return (msg)
}
function FNSFormated(Suffics,session) { // Возвращает строку в формате YYYY-MM-DD-<Suffics>
ХХХ
ХХХ
}
function DateTimeRequest() { // Возвращает строку в формате DD.MM.YYYY
ХХХХ
ХХХХ
function SignVerify(SignMsg,PubkeyFile,KeyNumber) { // Возвращает тело сообщения без подписи. При ошибке ""
var UserPublicKey=new ActiveXObject ("Libipriv.PublicKey");
// Загружаем объект для работы с ЭЦП
var Signer=new ActiveXObject ("Libipriv.Signer");
// Загружаем открытый ключ из файла "pubkeys.key" банка с серийным номером "XXXXXXX"
if(UserPublicKey.LoadFromFile(PubkeyFile,KeyNumber)) {
ХХХХХХ
}
return (UnsignMsg);
}
function Sign(Msg,SeckeyFile,Pwd) { // Возвращает сообщения c подписью. При ошибке ""
// Загружаем объект закрытого ключа (для формирования подписи)
ХХХХХХХХХ
// Загружаем объект для работы с ЭЦП
var Signer=new ActiveXObject ("Libipriv.Signer");
// Загружаем закрытый ключ из файла "<SeckeyFile>", кодовая фраза - "<Pwd>"
if(UserSecretKey.LoadFromFile(SeckeyFile,Pwd)) {
// Подписываем оригинальное сообщение закрытым ключем
var Sign=Signer.Sign(Msg,UserSecretKey);
}
return(Sign);
}
function GetField(Msg,Name,StopSymb) { // Возвращает значение поля <Name> из <Msg> до ограничителя <StopSymb>
var start, end;
var Field = new String();
start = Msg.search(Name);
Field = Msg.substring(start+Name.length,Msg.length);
end = Field.search(StopSymb);
return(Field.substring(0,end));
}
ххх
ххх
ххх
ххх
return(Ans)
}
function WriteLog(FileName,Str) { //запись в файл <FileName> строки <Str>
ххх
ххх
ххх
ххх
}
function WriteMessage(FileName,Str) { //запись в файл <FileName> строки <Str>
ххх
ххх
ххх
function GetPayAttribute (FileName,Session){
ххх
ххх
ххх
return("")
файл платежа (выполняем платеж)
<%
var TimeStamp = DateTimeRequest(); // получаем метку времени
var MSG = GetBodyRequest(); // получаем содержимое request
Err = 30
MSG = MSG.substring(13,MSG.length); // отбрасываем inputmessage=
var BdMSG=SignVerify(MSG,"C:/WebClient/keys/pubkeys.key",keynumb)+"\r\n";
//============Разбираем на поля =====================================
var Session = GetField(BdMSG,"SESSION=","\r");
//======Формируем ответ для терминала==========================================
var Answer = "DATE="+TimeStamp+"\r\nSESSION="+Session+"\r\nERROR=0"+"\r\nRESULT=0\r\n";
// Подписываем документ для правильного отображения в клиенте
var SignAnswer = Sign(Answer,"C:/WebClient/keys/secret.key",pass);
//--------------------------------------------------------------
%>
<% = SignAnswer %>
файл проверки статуса платежа и выполнение «первого платежа»
<%@ Language="JScript" %>
<% Response.Buffer = true %>
<!--#include virtual="Function.js"-->
<%
var TimeStamp = DateTimeRequest(); // получаем метку времени
var MSG = GetBodyRequest(); // получаем содержимое request
MSG = MSG.substring(13,MSG.length); // отбрасываем inputmessage=
var BdMSG=SignVerify(MSG,"C:/WebClient/keys/pubkeys.key",keynumb)+"\r\n";
//============Разбираем на поля =================================================
// WriteLog("c:/WebClient/logs/BodyMess.log",TimeStamp+" Check: "+BdMSG);
var Session = GetField(BdMSG,"SESSION=","\r");
var FileNC = FNSFormated("ConnUTB.txt",Session); // формируем имя лог-файла атрибутов платежа для проверки статуса
var FileNP = FNSFormated("PayUTB.txt",Session); // формируем имя лог-файла атрибутов платежа для проверки статуса
var Amount = GetField(BdMSG,"AMOUNT=","\r"); if (test!=0) {Amount="0.01"};
var InitSess = "";
var Req = GetField(BdMSG,"REQ_TYPE=","\r");
if (Req != "1") {InitSess = GetField(BdMSG,"COMMENT=","\r");}
var Numb = GetField(BdMSG,"NUMBER=","\r");
var Selecto = GetField(BdMSG,"ACCOUNT=",":");
var NextStep = GetField(BdMSG,"ACCOUNT=","\r") + "\r";
NextStep = GetField(NextStep,":","\r");
//====== Связь с Трастовым банком =======
var Str1 = "utb_dealer_card_number="+Card+"&utb_dealer_card_din="+DIN;
var AnswerUTB_s1 = PostURL(Serv+"/dealer/data/auth.xml?"+Str1,"",Session);
var SessID = GetField(AnswerUTB_s1,"<session_id>","<");
var Status = "";
var Err = 0;
var ErrCode = "";
if (NextStep == "2") {
var Str2 = "utb_dealer_sess_id="+SessID+"&selecto="+Selecto+"&step=2&AdvInfo="+Numb;
var AnswerUTB_s2 = PostURL(Serv+"/dealer/data/payment.xml?"+Str2,"",Session);
Status = GetField(AnswerUTB_s2,"<status>","</status>");
if (Status == "0") {
ххх
х
х
х
х
х
х
х }
if (ErrCode == ""){
var Str3 = "utb_dealer_sess_id="+SessID+"&selecto="+Selecto+"&step=3&AdvInfo="+
Numb+"&summ="+Amount+"&payment_number="+InitSess;
var AnswerUTB_s3 = PostURL(Serv+"/dealer/data/payment.xml?"+Str3,"",Session);
Status = GetField(AnswerUTB_s3,"<status>","</status>");
if (Status != "0") {
ErrCode = GetField(AnswerUTB_s3,"<error_code>","</error_code>");
Err = 50;
}
else {
if (Req != "1") {
submit_payment_key = GetField(AnswerUTB_s3,"<submit_payment_key>","</submit_payment_key>");
var LogStr = "Session="+Session+",number="+Numb+",selecto="+Selecto+",summ="+Amount+
",submit_payment_key="+submit_payment_key+
",utb_dealer_sess_id="+SessID+",InitSessionNumber="+InitSess+";";
WriteLog("c:/WebClient/logs/"+FileNC,TimeStamp+" "+LogStr);
//====== Связь с Трастовым банком - СРАЗУ ВЫПОЛНЯЕМ ПЛАТЕЖ =======
х
хх
х
х
х
if (Status == "0") {
AuthCode = GetField(AnswerUTB_s4,"<auth_code>","</auth_code>");
Date = GetField(AnswerUTB_s4,"<date>","</date>");
}
var LogStr = "ServDate="+Date+",Session="+Session+",number="+Numb+",payment_key="+
submit_payment_key+",utb_dealer_sess_id="+SessID+
",InitSessionNumber="+InitSess+",summ="+Amount+",AuthCode="+AuthCode+";";
WriteLog("c:/WebClient/logs/"+FileNP,TimeStamp+" "+LogStr);
}
}
}
if (ErrCode == "4") {Err = 21}
if (ErrCode == "110") {Err = 23}
if (ErrCode == "104") {Err = 30}
if (ErrCode == "3") {Err = 9}
//======Формируем ответ для терминала==========================================
var Answer = "DATE="+TimeStamp+"\r\nSESSION="+Session+"\r\nERROR="+Err+"\r\nRESULT=0"+"\r\nTRANSID="+InitSess;
var SignAnswer = Sign(Answer,"C:/WebClient/keys/secret.key",pass);
%>
<% = SignAnswer %>
ООО "Терминал-партнер". Полное техническое обслуживание платежных терминалов в Удмуртии. Свой Call-цент. Свой сервер мониторинга для ПО 2.0.Х и 3,0,Х!!! Свой Фискальный Сервер под ПС Киберплат!!! Подключены все местные операторы и ЖКХ + подключим Ваших провайдеров с любым оборотом. 18 регион (только ПС Киберплат)
-
Гость
Smart77 писал(а):Далее «курим» алгоритм ПС Киберплат, выясняем что на сервере Киберплата на каждом шлюзе у каждого опера есть 3 скрипта
1 Проверка номера (service.cyberplat.ru/cgi-bin/хх/хх_pay_check.cgi
2 Проведение платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay.cgi
3 Проверка статуса платежа (service.cyberplat.ru/cgi-bin/хх/хх_pay_status.cgi
А для особо тупых вроде меня можно поподробнее.
(Непонятна серверная часть "провайдера")
Что такое CGI, на чем пишется, на каких серверах выкладывается.
Есть ли примеры этих программ?
Надо поставить задачу программеру, а что говорить - не понимаю.
Смотрм в наш операторс
<request name="check">
<url>localhost/_pay_check.asp</url>
ищем в листинге скрипта (_pay_check.asp) который лежит у нас на тереме и видим что
var Str4 = "utb_dealer_sess_id="+SessID+"&step=4&payment_key="+submit_payment_key;
var AnswerUTB_s4 = PostURL(Serv+"/dealer/data/payment.xml?"+Str4,"",Session);
т.е. пост на Serv+"/dealer/data/payment.xml?"+Str4,"",Session а что у "банка" на той стороне я не ведаю. У нас только протокол их работы, а как и чем они парсят наш ответ незнаю. Примерно так. НО это же можно и самим сделать, самое главное понять суть как это работает.
Про My_pay_check.cgi это смотря чем делать.
<request name="check">
<url>localhost/_pay_check.asp</url>
ищем в листинге скрипта (_pay_check.asp) который лежит у нас на тереме и видим что
var Str4 = "utb_dealer_sess_id="+SessID+"&step=4&payment_key="+submit_payment_key;
var AnswerUTB_s4 = PostURL(Serv+"/dealer/data/payment.xml?"+Str4,"",Session);
т.е. пост на Serv+"/dealer/data/payment.xml?"+Str4,"",Session а что у "банка" на той стороне я не ведаю. У нас только протокол их работы, а как и чем они парсят наш ответ незнаю. Примерно так. НО это же можно и самим сделать, самое главное понять суть как это работает.
Про My_pay_check.cgi это смотря чем делать.
ООО "Терминал-партнер". Полное техническое обслуживание платежных терминалов в Удмуртии. Свой Call-цент. Свой сервер мониторинга для ПО 2.0.Х и 3,0,Х!!! Свой Фискальный Сервер под ПС Киберплат!!! Подключены все местные операторы и ЖКХ + подключим Ваших провайдеров с любым оборотом. 18 регион (только ПС Киберплат)
Яков писал(а):Юридическая сторона это дело десятое.
Про юридическую сторону, здесь все наоборот гладко, они же "ПС" при банке, т.е. 3-х или 2-х сторонний договор и все.
ООО "Терминал-партнер". Полное техническое обслуживание платежных терминалов в Удмуртии. Свой Call-цент. Свой сервер мониторинга для ПО 2.0.Х и 3,0,Х!!! Свой Фискальный Сервер под ПС Киберплат!!! Подключены все местные операторы и ЖКХ + подключим Ваших провайдеров с любым оборотом. 18 регион (только ПС Киберплат)
-
Гость
Карта открыта на каждый терминал. По ней выставлен лимит дневной, все карты принадлежат ИП или ООО, смотря кто работает с банком.
Конечно, банк все знает. Договор же с ним о проведение платежей.
Конечно, банк все знает. Договор же с ним о проведение платежей.
ООО "Терминал-партнер". Полное техническое обслуживание платежных терминалов в Удмуртии. Свой Call-цент. Свой сервер мониторинга для ПО 2.0.Х и 3,0,Х!!! Свой Фискальный Сервер под ПС Киберплат!!! Подключены все местные операторы и ЖКХ + подключим Ваших провайдеров с любым оборотом. 18 регион (только ПС Киберплат)
-
Гость
-
Гость
Поставил на тестовый стенд Denver, в нем есть поддержка https. Перенаправил в файле operators шлюз на localhost по https. В логах пишет "network error".
Smart77, вы какого рода костыли поставили по поводу перехода на https?
Есть у Кибера какие то требования к SSL сертификату? Или он отправляет платежи сейчас только на свои шлюзы со своим сертификатом?
Smart77, вы какого рода костыли поставили по поводу перехода на https?
Есть у Кибера какие то требования к SSL сертификату? Или он отправляет платежи сейчас только на свои шлюзы со своим сертификатом?
Банки, карточки ... не понимаю о чем вы.
Задача простая.
Есть гаражный кооператив, рядом магазин, в магазине мой терминал.
Членские взносы платят через терминал.
(Как это организовано по юр/бух рассматривать не будем).
Сейчас с мониторинга делаю реестр.
Хочется перейти на следующий шаг.
Поствить в бухгалтерии кооператива сервер, настроить там некое ПО
таким образом, чтоб информация с терминала сразу отправлялась бы данному "провайдеру".
Что делать на терминале - знаю.
Что делать в бухгалтерии кооператива на сервере - не знаю.
Подскажет кто?
Задача простая.
Есть гаражный кооператив, рядом магазин, в магазине мой терминал.
Членские взносы платят через терминал.
(Как это организовано по юр/бух рассматривать не будем).
Сейчас с мониторинга делаю реестр.
Хочется перейти на следующий шаг.
Поствить в бухгалтерии кооператива сервер, настроить там некое ПО
таким образом, чтоб информация с терминала сразу отправлялась бы данному "провайдеру".
Что делать на терминале - знаю.
Что делать в бухгалтерии кооператива на сервере - не знаю.
Подскажет кто?
Вернуться в «Платежная система CyberPlat (не действует)»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей
