v7: Отправка СМС из 1С через SMS-Fly #745154


#0 by Anempadest
Решаю задачу по отправке СМС из 1С. Использую API сервиса SMS-Fly (Украина). Всё уже написал (соединение, отправка запроса XML, разбор ответа), но  есть одно препятствие: не могу авторизироваться. От службы поддержки получил пример на PHP: *** Если коротко, то алгоритм действий для разных языков одинаков. 1) Открывается сокет на наш ресурс на 80 порт (стандартный порт http протокола); 2) Формируется XML        $data          = "<?xml version="1.0" encoding="utf-8"?><request><operation>GETBALANCE</operation></request>"; 3) Формируются заголовки для передаваемых данных. в PHP это выглядит 4) данные записываются в открытое соединение. 5) читаются данные из открытого соединения для получения ответа от сервера. 6) полученные данные анализируются приложением, отслеживается результат выполнения команды. *** Я не большой специалист по HTTP протоколу и отправке POST запросов, поэтому с трудом понимаю написанное. Написал так: *** "POST HTTP/1.1 *** В переменную приёмник получаю ответ "HTTP/1.1 401 Unauthorized", то есть авторизация не выполнена. Уже не знаю, что делать. Поможете?
#1 by EverGreenMouse
|Authorization: Basic "+СокрЛП(Рассылка.Логин)+":"+СокрЛП(Рассылка.Пароль)+" не тут ли косяк? Может так? |Authorization: Basic "СокрЛП(Рассылка.Логин)+":"+СокрЛП(Рассылка.Пароль)"
#2 by Anempadest
Я же создаю текстовую строку с разделителями строк.
#3 by AMKahm
А где конвертация в base64 в вашем коде? типа Authorization: Basic "+base64_encode(СокрЛП(Рассылка.Логин)+":"+СокрЛП(Рассылка.Пароль))
#4 by Anempadest
Да, ТП написала про конвертацию. А оно обязательно? Логин - это номер телефона, то есть numeric. А пароль состоит из латинских символов. Мне кажется, перекодировать ничего не нужно. Или я ошибаюсь?
#5 by AMKahm
Ошибаетесь. Вот - посмотрите здесь:
#6 by AMKahm
login:pass кодируются в bG9naW46cGFzcw==
#7 by Anempadest
Я понял. Спасибо. Сейчас буду делать.
#8 by Anempadest
Хорошие новости. [code] "POST HTTP/1.1 [/code] Удалось авторизоваться на сайте. Но желаемый результат не достигнут. В файл Приемник сервер возвращает просто Главную страницу сайта, а должен вернуть ответ в формате XML. Есть какие-то идеи?
#9 by Garykom
сменить оператора рассылки смс ЗЫ это послать по адресу...
#10 by Garykom
+ у нормальных даже готовые примеры для разных 1С выложены..
#11 by Anempadest
Истину говоришь, товарищ! Но у этой конторы - самая низкая стоимость СМС в Украине: 0,159 грн.
#12 by Anempadest
Работающий код: <code>
#13 by Anempadest
Внешнюю компоненту V7PLUS для отправки данного запроса использовать не получилось. Сервер не авторизует соединение, то есть метод не работает:
#14 by oleg_km
Вообще-то метод SetCredentials должен это вроде делать.
#15 by Anempadest
Присмотритесь внимательней к коду. Сервер просит отправить Логин и Пароль в закодированном виде.
#16 by Serginio1
#17 by oleg_km
А может теорию почитаешь? В протоколе HTTP есть авторизация Basic, Digest, NTLM, SSL. Как правило, разработчики API уже реализуют эту реализацию на уровне своего API. Ты лучше попробуй
#18 by Anempadest
Только ради вас попробовал. И получил ошибку: {Обработка.Извещение.Форма.Модуль}: WinHttp.WinHttpRequest: Нельзя вызвать этот метод до вызова метода Send Мне специалист из СП дал чёткие инструкции, что нужно использовать заголовок:
#19 by Serginio1
Ты бы 16 почитал внимательно
#20 by Serginio1
Там пример на JavaScript вполне читаемый. Дело в том, что при отсутствии авторизации сервер возвращает еще и какую авторизацию он хочет
#21 by Anempadest
Прости, что я тебя не понимаю, но мне кажется, что ты меня троллишь. Смотри. Эта служба просит у меня послать запрос для отправки СМС. Для авторизации на сервере нужно в заголовке запроса разместить переменную "Authorization" и значение. Обрати внимание, что значение переменной - это не просто строка "Логин:Пароль". Эта строка должна быть ещё закодирована по протоколу Base64. Понял? В заголовке есть переменная и значение. И только так. По-другому работать не будет. Если бы работало, то Служба Поддержки бы этого не скрывала. Не согласен?
#22 by Serginio1
Какой смысл мне тебя троллить? Почитай про авторизацию например Обычно авотризация отдается на откуп Api. Например в Net Класс NetworkCredential является базовым классом, который поддерживает учетные данные в схемах аутентификации на основе пароля, таких как "Обычная", "Дайджест", "NTLM" и "Kerberos". Классы, реализующие интерфейс ICredentials, например класс CredentialCache, возвращают объекты NetworkCredential. Ты не заботишься какую авторизацию поддерживает сервер и как данные авторизации нужно записать.
#23 by Serginio1
И если вдруг на сервере изменят тип авторизации тебе не нежно будет править код
#24 by ДенисЧ
Кто о чём, а лыс^W о дотнете....
#25 by Serginio1
А что в этом плохого? Так или иначе он использует не родные компоненты. Я же ему не предлагаю Просто даю понять как правильно использовать инструменты. Просто в Net куча библиотек на все случаи жизни. Что тебя так коробит?
#26 by oleg_km
"Православные 1сники все остальное считают ересью
#27 by vladimirmir2012
Да нет просто 1С прекрасно интегрирована с automation и не сложно написать ВК, использующую .Net. Отсюда и приверженность к .Net /в частности/.
#28 by oleg_km
Вот и непонятно, почему многим упоминание дотнета вызывает ассоциацию чуть ли не с ассемблером
#29 by vladimirmir2012
Так для 1С .Net и есть своего рода ассемблер
#30 by Serginio1
Да нет ассемблер это низкоуровневый код которым пользуются гики. C# уже давно один из самых распространенных инструментов. Да и ВК давно уже писать не надо. Посмотри В 8 ке есть подключение событий. А для 7 ки можно использовать только ВК достающий AppDispatch с передачей в нетовские сборки.
#31 by Anempadest
Я в написал, что при использовании предлагаемого тобой метода 1С выдаёт ошибку. Говорит, что сначала нужно установить связь, а только после этого использовать SetCredentials(Логин,Пароль). Если ты считаешь себя правым в теории, то докажи свою уверенность на практике и покажи, какой код нужно написать в 1С 7.7, чтобы предлагаемый тобой метод заработал. Например, после прочтения литературы о HTTP я понял, что 1С 7.7 не способна выполнить нечто наподобие такого: У неё есть только одна команда: Соединение.ОтправитьДляОбработки(Адрес,Источник,2,Приемник,2); И я так понимаю, что внутри 1С одновременно открывает, делает запрос POST и закрывает (?). И мне, кстати, очень жаль, что как бы встроенный функционал 1С не способен выполнить такую казалось бы популярную и простую задачу. При этом, в 1С 8 подобная команда уже есть.
#32 by Serginio1
Вот пример на JavaScript var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); // Specify the target resource. var targURL = ";+             WScript.Echo("Requires Server UserName and Password.");             WScript.Echo("Requires Proxy UserName and Password.");
#33 by Serginio1
Из примера видно, что мы сначала посылаем  WinHttpReq.send; и обрабатываем какой получили ответ. case 401:             WScript.Echo("Requires Server UserName and Password.");
#34 by Serginio1
А где это в семерке Соединение.ОтправитьДляОбработки Если тебе, что то не хватает в семерке используй Net. Там будет что типа врап=СоздатьОбъект("NetObjectToIDispatch45");
#35 by Serginio1
Если тебе нужно послать данные то
#36 by Serginio1
request.ContentType = "text/xml; encoding='utf-8'";
#37 by Serginio1
например этот пример легко переделать
#38 by Anempadest
В посте то же, только короче. В общем, спасибо. А я потихоньку буду на 8 переходить.
#39 by Serginio1
Восьмерка не все решает
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С