Простая отправка сообщений из 1С в MAX — это один POST-запрос на шлюз https://1module.ru/gw/ga-gateway.php. В теле передаются idInstance, apiTokenInstance, apiUrl и метод Green API. Шлюз вызывает Green API и возвращает ответ в 1С.
Заголовок: Content-Type: application/json; charset=utf-8. Таймаут — 30 секунд. Другие HTTP-методы не принимаются.
| Поле | Тип | Ограничение |
|---|---|---|
idInstance | строка | 1–64 символа, латиница и цифры |
apiTokenInstance | строка | 1–128 символов: латиница, цифры, _, - |
apiUrl | строка | https, хост green-api.com или *.green-api.com, без логина, пароля, порта и пути |
method | строка | checkAccount, sendMessage или getMessage |
body | строка или объект | JSON тела метода Green API. Пустая строка уходит как {} |
Шлюз выполняет POST {apiUrl}/waInstance{idInstance}/{method}/{apiTokenInstance} и отдаёт код состояния вместе с телом ответа Green API. Поле reason в ответе с кодом 200 означает, что вызов не выполнен.
Общая функция собирает конверт шлюза и читает JSON-ответ. ТелоJSON — уже готовая строка тела метода Green API.
Функция ВызватьШлюзMAX(ИмяМетода, ТелоJSON, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки)
ОписаниеОшибки = "";
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("idInstance");
Запись.ЗаписатьЗначение(СокрЛП(ИдЭкземпляра));
Запись.ЗаписатьИмяСвойства("apiTokenInstance");
Запись.ЗаписатьЗначение(СокрЛП(Токен));
Запись.ЗаписатьИмяСвойства("apiUrl");
Запись.ЗаписатьЗначение("https://" + Хост);
Запись.ЗаписатьИмяСвойства("method");
Запись.ЗаписатьЗначение(ИмяМетода);
Запись.ЗаписатьИмяСвойства("body");
Запись.ЗаписатьЗначение(ТелоJSON);
Запись.ЗаписатьКонецОбъекта();
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос = Новый HTTPЗапрос("/gw/ga-gateway.php", Заголовки);
Запрос.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
Соединение = Новый HTTPСоединение("1module.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Исключение
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Возврат Неопределено;
КонецПопытки;
Если Ответ.КодСостояния <> 200 Тогда
ОписаниеОшибки = СтрШаблон("Код: %1 Ошибка: %2", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено;
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Причина = "";
Если ТипЗнч(Данные) = Тип("Структура")
И Данные.Свойство("reason", Причина)
И ЗначениеЗаполнено(Причина) Тогда
ОписаниеОшибки = Строка(Причина);
Возврат Неопределено;
КонецЕсли;
Возврат Данные;
КонецФункцииПроверяет номер в MAX и возвращает chatId. phoneNumber передаётся числом: 11 цифр с 7 для России или 12 цифр с 375 для Беларуси.
Функция ИдентификаторЧатаMAX(НомерТелефона, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("phoneNumber");
ЗаписьJSON.ЗаписатьЗначение(Число(НомерТелефона));
ЗаписьJSON.ЗаписатьКонецОбъекта();
Данные = ВызватьШлюзMAX("checkAccount", ЗаписьJSON.Закрыть(),
ИдЭкземпляра, Токен, Хост, ОписаниеОшибки);
Если Данные = Неопределено Тогда
Возврат "";
КонецЕсли;
Если Не Данные.Свойство("exist") Или Данные.exist <> Истина Тогда
ОписаниеОшибки = "На номере нет аккаунта MAX.";
Возврат "";
КонецЕсли;
ИдентификаторЧата = "";
Данные.Свойство("chatId", ИдентификаторЧата);
Возврат Строка(ИдентификаторЧата);
КонецФункцииУспешный ответ Green API: {"exist": true, "chatId": "123456"}.
Отправляет текст в чат, полученный из checkAccount. В ответе нужен idMessage.
Функция ОтправитьСообщениеMAX(ИдентификаторЧата, ТекстСообщения, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("message");
ЗаписьJSON.ЗаписатьЗначение(СокрЛП(ТекстСообщения));
ЗаписьJSON.ЗаписатьИмяСвойства("chatId");
ЗаписьJSON.ЗаписатьЗначение(Строка(ИдентификаторЧата));
ЗаписьJSON.ЗаписатьКонецОбъекта();
Данные = ВызватьШлюзMAX("sendMessage", ЗаписьJSON.Закрыть(),
ИдЭкземпляра, Токен, Хост, ОписаниеОшибки);
Если Данные = Неопределено Тогда
Возврат "";
КонецЕсли;
ИдентификаторСообщения = "";
Данные.Свойство("idMessage", ИдентификаторСообщения);
Возврат СокрЛП(Строка(ИдентификаторСообщения));
КонецФункцииУспешный ответ Green API: {"idMessage": "BAE5F4886F6F2D05"}.
Сначала по номеру получается chatId, затем в этот чат уходит текст. Хост — часть адреса из поля apiUrl, без https://.
Процедура ОтправитьТекстВMAX(НомерТелефона, ТекстСообщения, ИдЭкземпляра, Токен, Хост)
ОписаниеОшибки = "";
ИдентификаторЧата = ИдентификаторЧатаMAX(НомерТелефона, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки);
Если Не ЗначениеЗаполнено(ИдентификаторЧата) Тогда
Сообщить(ОписаниеОшибки);
Возврат;
КонецЕсли;
ИдентификаторСообщения = ОтправитьСообщениеMAX(ИдентификаторЧата, ТекстСообщения, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки);
Если Не ЗначениеЗаполнено(ИдентификаторСообщения) Тогда
Сообщить(ОписаниеОшибки);
Возврат;
КонецЕсли;
Сообщить("Сообщение отправлено: " + ИдентификаторСообщения);
КонецПроцедуры
ОтправитьТекстВMAX(
"79001234567",
"Текст сообщения",
"1103123456",
"token",
"1103.api.green-api.com");Возвращает статус доставки по chatId и idMessage.
Функция СтатусСообщенияMAX(ИдентификаторЧата, ИдентификаторСообщения, ИдЭкземпляра, Токен, Хост, ОписаниеОшибки)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("chatId");
ЗаписьJSON.ЗаписатьЗначение(ИдентификаторЧата);
ЗаписьJSON.ЗаписатьИмяСвойства("idMessage");
ЗаписьJSON.ЗаписатьЗначение(ИдентификаторСообщения);
ЗаписьJSON.ЗаписатьКонецОбъекта();
Данные = ВызватьШлюзMAX("getMessage", ЗаписьJSON.Закрыть(),
ИдЭкземпляра, Токен, Хост, ОписаниеОшибки);
Если Данные = Неопределено Тогда
Возврат "";
КонецЕсли;
Статус = "";
Данные.Свойство("statusMessage", Статус);
Возврат НРег(СокрЛП(Строка(Статус)));
КонецФункции
Функция ПредставлениеСтатусаMAX(СтатусGreenAPI)
Статус = НРег(СокрЛП(Строка(СтатусGreenAPI)));
Если Статус = "sent" Тогда
Возврат "Отправлено";
ИначеЕсли Статус = "delivered" Или Статус = "read" Тогда
Возврат "Доставлено";
ИначеЕсли Статус = "failed" Или Статус = "noaccount" Или Статус = "notingroup" Тогда
Возврат "НеДоставлено";
ИначеЕсли Статус = "queued" Или Статус = "pending" Тогда
Возврат "Отправляется";
КонецЕсли;
Возврат "Ошибка";
КонецФункцииЭти ответы приходят с кодом 200 и полем reason.
| reason | Когда |
|---|---|
Ожидается POST. | Метод запроса не POST |
Пустой запрос к шлюзу. | Нет тела |
Некорректный JSON шлюза. | Тело не является JSON-объектом |
Некорректный idInstance. | Пустой или недопустимый идентификатор |
Некорректный apiTokenInstance. | Пустой или недопустимый токен |
Метод Green API не разрешен шлюзом. | Метод не из списка трёх |
Некорректный apiUrl. Допустимы только адреса Green API. | Адрес не прошёл проверку |
Выполните POST на https://1module.ru/gw/ga-gateway.php. В JSON передайте idInstance, apiTokenInstance, apiUrl, method со значением sendMessage и body со строкой JSON, в которой есть chatId и message.
Адрес шлюза: POST https://1module.ru/gw/ga-gateway.php. Заголовок Content-Type: application/json; charset=utf-8. Таймаут 30 секунд.
checkAccount получает chatId по номеру телефона, sendMessage отправляет текст, getMessage возвращает статус доставки.
Если в ответе с кодом 200 есть непустое поле reason, вызов не выполнен. Текст reason и есть описание ошибки.