Інтеграція 1С та телефонії від Binotel
Binotel пропонує зручну і швидку телефонію, тому вона достатньо популярна серед користувачів. До того ж Бінотел реалізував АПІ доступ до керування дзвінками, що дозволило інтегрувати цю телефонію з багатьма сервісами та CRM системами. Звісно ж 1С не стало виключенням. Багато хто з користувачів хочуть інтегрувати Бінотел з 1С. На сьогодні існує 2 платні модулі партнерів Бінотелу які він і пропонує. Але цікаво те, що сама інтеграція достатньо проста, і кожен прграміст 1С може її зробити самостійно. Єдине що викликає труднощі – це відсутність нормальної документації АПІ. Є приклади реалізації на php, і дуже короткий опис функцій, і цього на старті дуже замало. Але якщо розібрати ці приклади на php то все стає зрозуміло.
Роблю для себе нотатку – як відправити запит на виконання методу в бінотел та отримання результату. А далі вже справа техніки – виклик різних методів та їх обробка. Робимо простий метод – отримання дзвінків за період.
Ось що ми маємо в прикладах на Бінотел на php:
вхідні та вихідні дзвінки за період часу:
Методи:
– incoming-calls-for-period – для вхідних дзвінків
– outgoing-calls-for-period – для вихідних дзвінківПараметри:
– startTime – час початку відбору дзвінків (у форматі unix timestamp)
– stopTime – час закінчення відбору дзвінків (в формате unix timestamp)
І сам код виклику методу на php:
1 2 3 4 5 6 7 8 9 10 |
$result = $api->sendRequest('stats/outgoing-calls-for-period', array( 'startTime' => 1370034000, // Sat, 01 Jun 2013 00:00:00 +0300 'stopTime' => 1370120399 // Sat, 01 Jun 2013 23:59:59 +0300 )); if ($result['status'] === 'success') { var_dump($result['callDetails']); } else { printf('REST API ошибка %s: %s %s', $result['code'], $result['message'], PHP_EOL); } |
І звісно ж функція надсилання запиту (я не копіюю весь код тільки фрагменти які нам потрібні, тому окремо код не робочій):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function sendRequest($url, array $params) { $params['signature'] = $this->getSingnatureByRequest($params); $params['key'] = $this->key; $url = $this->apiHost . $this->apiVersion .'/'. $url .'.'. $this->apiFormat; // Send request $ch = curl_init(); $postData = json_encode($params); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); if ($this->disableSSLChecks) { curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); } curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Length: ' . mb_strlen($postData), 'Content-Type: application/json' )); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); } |
Тепер зробимо все це на 1С. Робимо на останніх версіях 1С 8.3, тому що там є підтримка JSON, для більш старих версій доведеться ще підключіти формування та обробку файлів цього формату. Це можна знайти в інтернеті.
Для роботи нам потрібен АПІ ключ та АПІ код secret, який можна отримати через підтримку бінотелу ( в прикладі неправильні).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
apikey = "5dffd4fd-b25dde3"; secret = "716549-501sd7-12d54d-654fs-5454sdf"; //Наш метод для отримання дзвінків. Виберемо вхідні дзвінки Бінотел metod = "stats/incoming-calls-for-period"; //Сервер для підключення, версія та формат даних, він однаковий для всіх apiHost = "my.binotel.ua"; apiVersion = "2.0"; apiFormat = "json"; //Сформуємо УРЛ для запиту url = "/" + "api" + "/" + apiVersion + "/" + metod + "." + apiFormat; //Підготуємо параметри для виклику методу Параметры = Новый Структура; //період відбору дзвінків у форматі unix timestamp Параметры.Вставить("startTime",Формат(ДатаНачало - Дата(1970,01,01,00,00,01),"ЧГ=0")); Параметры.Вставить("stopTime",Формат(ДатаКонец - Дата(1970,01,01,00,00,01),"ЧГ=0")); //Головне для правильного запиту це сформувати корректну сігнатуру, інакше жоден запит не пройде в бінотел. //Для цього робимо окрему функцію яка це зробить - СформироватьСигнатуру і викликаєио її в потрібних місцях Параметры.Вставить("signature", НРег(СформироватьСигнатуру(Новый Массив, secret))); //Вставляємо наш ключ Параметры.Вставить("key", apikey); //Ще одна функція яка наші дані з структури запише в формат JSON postData = ЗаписатьJSONПоСтруктуре(Параметры); //Встановлюємо з'єднання з сервером Бінотел SSL = Новый ЗащищенноеСоединениеOpenSSL; HTTP = Новый HTTPСоединение(apiHost, Неопределено, Неопределено, Неопределено, Неопределено, Неопределено, SSL); //Формуємо заголовки які зрозуміє Бінотел ЗаголовокHTTP = Новый Соответствие; ЗаголовокHTTP.Вставить("Content-Length", СтрДлина(postData)); ЗаголовокHTTP.Вставить("Content-Type", "application/json"); //І тепер відправляємо запит HTTP_Запрос = Новый HTTPЗапрос(url, ЗаголовокHTTP); HTTP_Запрос.УстановитьТелоИзСтроки(postData, КодировкаТекста.Системная); Попытка HTTP_Ответ = HTTP.ОтправитьДляОбработки(HTTP_Запрос); Исключение Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; //У відповідь отримаємо діні по вхідним дзвінкам у форматі JSON, або текст помилки Рез = HTTP_Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8); // В залежності від методу структура даних буде відрізнятись, тому обробку даних не пишу. //Функція правильного формування сігнатури для запиту в Бінотел Функция СформироватьСигнатуру(Параметры, Secret) Перем signature; signature = "" + Secret + ЗаписатьJSONПоСтруктуре(Параметры,Истина); ХД = Новый ХешированиеДанных(ХешФункция.MD5); ХД.Добавить(signature); signature = Строка(ХД.ХешСумма); signature = СтрЗаменить(signature, " ", ""); Возврат signature; КонецФункции //Функція формування даних в JSON по структурі Функция ЗаписатьJSONПоСтруктуре(СтруктураВыгрузки,ОчисткаJSON = ЛОжь) Экспорт НастройкиСериализации = Новый НастройкиСериализацииJSON; НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата; НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь; ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.ПроверятьСтруктуру = Истина; ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); ЗаписатьJSON(ЗаписьJSON, СтруктураВыгрузки, НастройкиСериализации); СтрокаJSON = ЗаписьJSON.Закрыть(); Если ОчисткаJSON ТОгда СтрокаJSON = СтрЗаменить(СтрокаJSON,Символы.ПС,""); СтрокаJSON = СтрЗаменить(СтрокаJSON,Символы.ВК,""); СтрокаJSON = СтрЗаменить(СтрокаJSON," ",""); КонецЕслИ; Возврат СтрокаJSON; КонецФункции |
Все. Запит відправлений, дзвінки з Бінотел в 1С отримали і можемо їх обробляти далі як нам потрібно.
Використовуючи різні методи можна отримати та передати в Бінотел різну інформацію. Також Бінотел дозволяє отримувати вхідні дзвінки одразу на наш сервер, то ж ми можемо підняти web сервер 1С і налаштувати отримання дзвінків одразу в 1С, а це дозволить менеджерам володіти інформацією по клієнту та роботі з ним в онлайн режимі.
Не маєте власних програмістів, або хочете отримати якісний продукт? Можете замовити інтеграцію 1С з телефонією Binotel або будь-якою іншою, для будь якої конфігурації 1С в компанії ІТ рішення для бізнесу.
В коде ошибка.
Текущий пример не заработает, и в переменную “Рез” будет ответ “Bad signature.”
Ошибка в строке : “Параметры.Вставить(“signature”, НРег(СформироватьСигнатуру(Новый Массив, secret)));”
Для формирования сигнатуры недостаточно apikey и secret, туда нужно передавать так же аргументы метода “stats/incoming-calls-for-period”.
т.е. для формирования хеш суммы тело запроса для данного примера должно выглядеть так :
716549-501sd7-12d54d-654fs-5454sdf{“startTime”:”1546300799″,”stopTime”:”1577836798″}.
Таким образом что бы заработало нужно исправить строку вот так :
“Параметры.Вставить(“signature”, НРег(СформироватьСигнатуру(Параметры, secret)));”
// Долго ломал голову, пока не связался с техподдержкой.