Имя: Пароль:
1C
1С v8
https запрос из 1с
0 Sintez123
 
22.05.13
00:35
Работы над конструированием оборонного спутника продолжаются. Напомню, что руководство распорядилось что мы должны использовать только отечественные програмные продукты. Было принято решение, что коррекцией орбиты спутника будет заниматься 1с.

Для удаленного управления вооружением спутника ранее планировали использовать PHP, но он не отечественный. Скрипт рабочий, и показывает в браузере нужный ответ. Так что к боевой системе спутника претензий у меня нет. Рабочий PHP-скрипт теперь необходимо 1с-русифицировать. Это и не получается.

       //получаем параметры, тут проблем нет

       $key = $_GET['key'];
   $secret = $_GET['secret'];
       $req['method'] = $method;
   $nonce = $_GET['nonce'];
       
       //тут уже интереснее

       $req['nonce'] = $nonce;

       //это данные о местанахождении вражеских танков, тут проблем нет

       $post_data = http_build_query($req, '', '&');

       //а тут я сделал эхо, строка совпадает со строкой, которую я сделал в 1с

   echo $post_data;

       //тут мы подписываем запрос, чтобы американским военным хакерам помешать, реализовано в 1с, проблем нет

       $sign = hash_hmac("sha512", $post_data, $secret);

       //опять эхом проверяю с 1с, всё совпадает

   echo $sign;

       //делаем заголовки, в 1с реализовано вроде верно

       $headers = array(
               'Sign: '.$sign,
               'Key: '.$key,
       );

       //это уже не понятно что
       static $ch = null;
       if (is_null($ch)) {
       //тут начали делать запрос
               $ch = curl_init();
               curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //непонятно что
               curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; BTCE PHP client; '.php_uname('s').'; PHP/'.phpversion().')'); //понятно что, но не понятно как сделать это в 1с, и не понятно надо ли делать
       }
       curl_setopt($ch, CURLOPT_URL, 'https://warsputnik.ru/api/'); //понятно
       curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); //понятно
       curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //понятно
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //уже опять не понятно
       //получаем результат запроса
       $res = curl_exec($ch);
   echo $res;
       //эхо сообщил результат как надо



Ниже идет две разные попытки скопировать это в 1с


       //Создадим наш запрос и подпишем его функцией SHA512
   НашЗапрос = "method=OrderList&nonce=" + СлучайноеЧисло;
   ХешЗапрос = SHA512(НашЗапрос, СекретныйКлюч);
   Сообщить(НашЗапрос);
   Сообщить(ХешЗапрос);

       ИмяФайлаОтправки = "C:\cc\1.txt";
   ИмяФайлаОтвета = "C:\cc\"+СлучайноеЧисло+".txt";

       Текст = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.UTF8);
   Текст.ЗаписатьСтроку(НашЗапрос);
   Текст.Закрыть();

       ЗаголовокHTTP = Новый Соответствие();
   ЗаголовокHTTP.Вставить("Key", Ключ);
   ЗаголовокHTTP.Вставить("Sign", ХешЗапрос);
       //заголовок то хоть правильно делаю?

       НТТР = Новый HTTPСоединение("warsputnik.ru",,,,,, SSL);
   НТТР.ОтправитьДляОбработки("C:\cc\1.txt", "api", ИмяФайлаОтвета, ЗаголовокHTTP);



В результате обрабки файл создается. Но содержание файла такое, как будто сервер от меня ничего не получил. Вот оно ниже.


{"success":0,"error":"invalid nonce parameter; 1369060029 "}


Это значит что прошлое число nonce было 1369060029, а следующее должно быть на 1 больше 1369060030. Переменная случайное число как раз такая цифра.


Если же дважды отправить одно и тоже число nonce, то ответ от сервера будет таким, проверял.

{"success":0,"error":"invalid nonce parameter; 1369060029 1369060029"}


Видите, число 2 раза. Это значит он получил запрос, но не пустил, потому число должно быть каждый раз на 1 больше.


А вот вторая попытка реализовать.


       WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.SetTimeouts(30000, 30000, 70000, 70000);
       WinHttp.Option(2, 1251);    
   
   WinHttp.Option(4, 13056); //intSslErrorIgnoreFlags
   WinHttp.Option(6, "true"); //blnEnableRedirects
   WinHttp.Option(12, "true"); //blnEnableHttpsToHttpRedirects

       WinHttp.Open("POST", "https://warsputnik.ru/api/", 0);  
       WinHttp.SetRequestHeader("sign", ХешЗапрос);
   WinHttp.SetRequestHeader("key", Ключ);
   
   РР = Новый ТекстовыйДокумент;
   РР.Прочитать(ИмяФайлаОтправки);
       
   ПараметрыПОСТ = РР.ПолучитьТекст();
   WinHttp.Send(ПараметрыПОСТ);
   Сообщить(WinHttp.getAllResponseHeaders());
   Сообщить(WinHttp.ResponseText());


В сообщениях получаю тот же самый ответ, как будто сервер от меня ничего не получил. Такой.

{"success":0,"error":"invalid nonce parameter; 1369060029 "}


Исключается ошибка не правильного хеша, проверял он правильный. Заголовки тоже правильные, ключ и секрет правильные. Адрес сервера правильный, SSL он точно требует. Что не так делаю не пойму, уже третий вечер маюсь не сплю до утра почти.

Будь патриотом! Помоги своей стране! А то вдруг с пендосами завтра воевать.
1 Sintez123
 
22.05.13
00:42
Кстати вот что выдает браузер при исполнении PHP скрипта, благодаря моим эха


method=OrderList&nonce=1369060029
*** a7ad47fc845337f40ee2c9632143710b3893f4a0c53c6b8a033034dee2d6241ec42762c9a4099b9f9bbd9f8d68058cc532a0d170be0946a20b1e438a63291183
***
{"success":1,"return":{"15140715":{"военная тайна"}}}
2 Asmody
 
22.05.13
01:45
Я б для начала проверил, что кодированные строки совпадают
2 + 2 = 3.9999999999999999999999999999999...