Andrei Posted November 28, 2015 · Report post Ковыряю смотрёшкин API Коллеги, может быть подскажете что я делаю не так. API прилагаю Пытаюсь создать пользователя. #!/usr/bin/php<?php$api_string_url = "http://xxxxx.test.lfstrm.tv/v1/";function UserCreate($username, $email) {global $api_string_url;$add_url = "user";$body = array('email'=>$email,'username'=>$username,'info'=>"",'purchases'=>"");$opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => json_encode($body), 'timeout' => 60 ) );$context = stream_context_create($opts);$url = $api_string_url.$add_url;$result = file_get_contents($url, false, $context);echo $result;}UserCreate("var_test1", "var@atlint.ru");?> Получаю в ответ file_get_contents(http://xxxxx.test.lfstrm.tv/v1/user): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden Подумал - ОК, начну с более простого. Зашел через web-интерфейс, завел пользователя вручную. id пользователя получился - 56587b1f098f6b6f4f000006 Пробую получить инфу про него: function GetSubscription($user_id) {global $api_string_url;$add_url = $user_id."/subscriptions";$body = array('id'=>$user_id);$opts = array('http' => array( 'method' => 'GET', 'content' => json_encode($body), 'timeout' => 60 ) );$context = stream_context_create($opts);$url = $api_string_url.$add_url;$result = file_get_contents($url, false, $context);echo $result;}GetSubscription("56587b1f098f6b6f4f000006"); В ответ: PHP Notice: file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded in /home/andrey/test.php on line 52 PHP Warning: file_get_contents(http://xxxxx.test.lfstrm.tv/v1/56587b1f098f6b6f4f000006/subscriptions): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden Первый раз пишу подобное, может туплю в чем-то простом? Попробовал просто проверить через web-интерфейс: http://xxxxx.test.lfstrm.tv/v1/56587b1f098f6b6f4f000006/user {"error": "access denied"} http://xxxxx.test.lfstrm.tv/v1/56587b1f098f6b6f4f000006/subscriptions {"error": "access denied"} API v3.pdf API v3.pdf Share this post Link to post Share on other sites
nphs Posted November 28, 2015 · Report post А через сокеты если? Share this post Link to post Share on other sites
Andrei Posted November 28, 2015 · Report post А через сокеты если? Не знаю как это Share this post Link to post Share on other sites
nphs Posted November 28, 2015 · Report post http://digitorum.ru/blog/2013/08/01/3-sposoba-otpravit-POST-zapros-na-php.phtml Share this post Link to post Share on other sites
Andrei Posted November 29, 2015 · Report post Там один из способов - как раз тот, что я описал выше. И я так понимаю, что они равноценные. Значит будем пинать саппорт смотрешки в понедельник. Share this post Link to post Share on other sites
Negator Posted November 29, 2015 · Report post метод не post а get будьте внимательны. Еще у них привязка по ip. отсюда access denied. завтра могу выложить рабочий php код. Share this post Link to post Share on other sites
Andrei Posted November 29, 2015 · Report post метод не post а get будьте внимательны. Да не, в API и GET, и POST - для разных операций разные методы, и вроде я нигде не промахнулся. :) Еще у них привязка по ip. отсюда access denied. Утверждается, что открыто для моего IP. Хотя надо будет еще раз у них уточнить, т.к. я поначалу получал от них "Bad Gateway" и не понимал почему. Потом выяснилось, что у них легла платформа. Может и сейчас у них что-то "слетело" завтра могу выложить рабочий php код. Буду благодарен. Share this post Link to post Share on other sites
Andrei Posted November 30, 2015 · Report post Еще у них привязка по ip. отсюда access denied. В общем что-то они там опять накосячили, теперь с этой настройкой. А скрипты вышеприведенные мной рабочие - проверил после того как в смотрешке поправили настройки платформы. завтра могу выложить рабочий php код. Интеграция с биллингом делалась? Сама смотрешка быстро слилась со своего обещания в презентации "Мы проводим интеграцию платформы с вашим биллингом". Предоставил API, а все что дальше - наш головняк. Share this post Link to post Share on other sites
Dr. Fred Posted November 30, 2015 · Report post То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ. Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо. Share this post Link to post Share on other sites
Andrei Posted December 1, 2015 · Report post Опытом бега по граблям не поделитесь? Чтоб нам все заново не проходить пробегать. :) Пока застрял на том, что при попытке создать/удалить пользователя у них через API получаю в ответ PHP Warning: file_get_contents(http://xxxxx.test.lfstrm.tv/v1/user): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error Может опять они что-то не донастроили, например дали права только на чтение. Share this post Link to post Share on other sites
KaraVan Posted April 7, 2016 · Report post То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ. Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо. А как вы приостановление сервиса реализовали? Смотрешка предлагает каждый раз при блокировке отписывать юзера от пакетов и потом подписывать по-новой. Share this post Link to post Share on other sites
MaLblsH Posted July 11, 2016 · Report post То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ. Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо. А как вы приостановление сервиса реализовали? Смотрешка предлагает каждый раз при блокировке отписывать юзера от пакетов и потом подписывать по-новой. Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление. Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента. Share this post Link to post Share on other sites
himikrzn Posted July 11, 2016 · Report post Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление. Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента. денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов. клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились. Share this post Link to post Share on other sites
Andrei Posted July 12, 2016 · Report post денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов. клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились. Если в смотрешке клиент отписался от всех пакетов, то как они потом восстановятся? Смотрешка помнит что было подписано? ИМХО смотрешка не различает - отписался клиент от пакетов добровольно или его отписали принудительно из-за отсутствия денег Share this post Link to post Share on other sites
himikrzn Posted July 12, 2016 · Report post Если в смотрешке клиент отписался от всех пакетов, то как они потом восстановятся? Смотрешка помнит что было подписано? ИМХО смотрешка не различает - отписался клиент от пакетов добровольно или его отписали принудительно из-за отсутствия денег ну в биллинге же есть эти пакеты, они тупо заблокированы. при блокировки биллинг присылает отключение их в смотрёшку, но в биллинге они остаются. при оплате они разблокируются, и пакеты снова "прилетают" в смотрёшку. хз как у вас, но я такое проверял, у меня пакеты востанавливались. Share this post Link to post Share on other sites
mrlexus Posted July 12, 2016 · Report post Коллеги, кто-то делал отслеживание и обработку события отвязки оборудования от УЗ? Share this post Link to post Share on other sites
Negator Posted July 12, 2016 · Report post Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление. Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента. денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов. клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились. Да, мы так и делаем. Не очень удобно конечно, но работает. Вообще желательно коллективно допинать Смотрешку чтобы реализовали приостановку услуг. Share this post Link to post Share on other sites
himikrzn Posted July 12, 2016 · Report post Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление. Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента. денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов. клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились. Да, мы так и делаем. Не очень удобно конечно, но работает. Вообще желательно коллективно допинать Смотрешку чтобы реализовали приостановку услуг. связь односторонняя биллинг -> смотрешка если и сделают двухстороннюю связь, то очень не скоро в принципе, я проблем не вижу, биллинг занимается списаниями, балансом и прочим. такой односторонней связи более чем достаточно. Share this post Link to post Share on other sites
Gubanov Posted July 16, 2016 · Report post Коллеги, есть пример скрипта интеграции со смотрешкой? Share this post Link to post Share on other sites
Wingman Posted July 16, 2016 · Report post Коллеги, есть пример скрипта интеграции со смотрешкой? <?php declare(strict_types = 1); /** * Created by * User: wingman * Date: 14.03.2016 * Time: 16:50 * * Класс для взаимодействия с API Смотрёшки. * Синглтон (средствами фасадов). */ namespace Iphome\Smotreshka; use Illuminate\Support\MessageBag; use Monolog\Handler\StreamHandler; use Monolog\Logger; use Unirest\Request; class SmApi { private $url; const REQ_TYPE_GET = 1; const REQ_TYPE_POST = 2; const REQ_TYPE_HEAD = 3; const REQ_TYPE_DELETE = 4; private $log; function __construct() { $this->url = \Config::get('smotreshka.api_url'); $this->log = new Logger('SM_LOG'); $this->log->pushHandler(new StreamHandler(storage_path('/logs/smotreshka/api.log'), Logger::DEBUG)); } /** * Установка тестового окружения: API URL заменяется на test url */ public function setTestEnv() { $this->url = \Config::get('smotreshka.test_url'); } /** * Список юзеров в БД смотрешки * @return MessageBag|object */ public function users() { return $this->request(self::REQ_TYPE_GET, 'v1/user'); } /** * Подписка абонента на пакет каналов * @param $user_id * @param $packet_id * @return array|MessageBag|mixed */ public function subscribe( $user_id, $packet_id ) { $body = [ 'id' => $packet_id, 'valid' => true ]; return $this->request(self::REQ_TYPE_POST, 'v1/'.$user_id.'/subscriptions', $body ); } /** * Удаление ВСЕХ подписок * @param $user_id * @return MessageBag|object */ public function unsubscribeAll( $user_id ) { return $this->request(self::REQ_TYPE_DELETE, 'v1/'.$user_id.'/subscriptions'); } /** * Удаление юзера из смотрёшки * @param $user_id * @return MessageBag|object */ public function userdel( $user_id ) { return $this->request(self::REQ_TYPE_DELETE, 'v1/'.$user_id.'/user'); } /** * Отписка от пакета каналов * * @param $user_id * @param $packet_id * @return array|MessageBag|mixed */ public function unsubscribe( $user_id, $packet_id ) { $body = [ 'id' => $packet_id, 'valid' => false ]; return $this->request(self::REQ_TYPE_POST, 'v1/'.$user_id.'/subscriptions', $body ); } /** * Все пакеты * @return array|MessageBag|mixed */ public function getOffers() { return $this->request(self::REQ_TYPE_GET, 'v1/offers'); } /** * Получение подписок юзера * @param $user_id * @return array|MessageBag|mixed */ public function getSubscriptions( $user_id ) { return $this->request(self::REQ_TYPE_GET, 'v1/'.$user_id.'/subscriptions'); } /** * Установка пароля юзеру * * @param $user_id * @param $password * @return MessageBag|object */ public function setPassword( $user_id, $password ) { $body = [ 'password' => $password ]; return $this->request(self::REQ_TYPE_POST, 'v1/'.$user_id.'/reset-password', $body); } /** * Получение пользователя * @param $user_id * @return array|MessageBag|mixed */ public function getUser($user_id) { return $this->request(self::REQ_TYPE_GET, 'v1/'.$user_id.'/user'); } #public function addUser( string $username, string $email, string $password, array $purchases = [ 'type' => 'array', 'items' => [] ] ) public function addUser(string $username, string $password, string $email, $info = NULL, array $purchases = ['',]) { $body = [ 'email' => $email, 'password' => $password, 'username' => $username, 'info' => $info # 'purchases' => $purchases ]; return $this->request(self::REQ_TYPE_POST, 'v1/user', $body); } /** * Отправка запроса и обработка ошибок * * @param int $method * @param string $url * @param string|NULL $body * @return MessageBag|object */ private function request(int $method, string $url, array $body = []) { $body = json_encode($body); $result_url = $this->url . $url; $result = NULL; try { switch ($method) { case self::REQ_TYPE_GET: $result = Request::get($result_url); break; case self::REQ_TYPE_POST: $result = Request::post($result_url, NULL, $body); break; case self::REQ_TYPE_DELETE: $result = Request::delete($result_url, NULL, $body); break; } } catch (\Exception $e) { # Непредвиденная ошибка, не обработанная API смотрёшки: могут быть, например, сетевые проблемы и т.д. $this->log->addCritical('Critical error while processing: "' . $method . '": "' . $url . '": ' . ":\n" . $e->getMessage()); return new MessageBag([$e->getMessage()]); } # Должен быть объектом: if (!is_object($result)) { $this->log->addCritical('Returned result is not object: "' . $method . '": "' . $url . '": ' . ":\n" . print_r($result, true)); return new MessageBag(['Получен неверный ответ от сервера: ответ не является объектом.']); } # Должен быть код if (!isset($result->code)) { $this->log->addCritical('No return code in result: "' . $method . '": "' . $url . '": ' . ":\n" . print_r($result, true)); return new MessageBag(['Получен неверный ответ от сервера: отсутствует код ответа.']); } # Должно быть тело if (!isset($result->body)) { $this->log->addCritical('No body in result: "' . $method . '": "' . $url . '": ' . ":\n" . print_r($result, true)); return new MessageBag(['Получен неверный ответ от сервера: отсутствует тело ответа.']); } ######################### # Если код != 200 if ($result->code != 200) { $error = "Отсутствует описание ошибки в ответе сервера!\n" . 'Код ответа от сервиса: ' . $result->code . "\nТело ответа: " . $result->raw_body . "\n"; if (isset($result->body->error)) { $error = "Код ответа сервиса: " . $result->code . "\nОшибка: " . $result->body->error . "\n"; } $this->log->addError($result->code . ": " . $error); $this->log->addError("Method: ".$method."; url: ".$url."; body: ".print_r($body,true)); return new MessageBag([$result->code . ": " . $error]); } # body должно быть массивом либо объектом if (!is_array($result->body) && !is_object($result->body)) { $this->log->addCritical('getOffers result is not an array nor object.' . "\n" . print_r($result, true)); return new MessageBag(['В результате запроса получен не объект.']); } return $result->body; } } Share this post Link to post Share on other sites
himikrzn Posted July 18, 2016 · Report post Коллеги, есть пример скрипта интеграции со смотрешкой? тыц там за доработанный вариант 2,5к просили. заплатил, выслали, все работает(13я версия) Share this post Link to post Share on other sites
SyJet Posted July 18, 2016 · Report post Я за 10 тр внедрил Share this post Link to post Share on other sites
Domingo Posted August 31, 2016 (edited) · Report post Собрал скрипты по смотрешке и IP-тв тут PS Ссылка отобразилась криво ... Edited August 31, 2016 by Domingo Share this post Link to post Share on other sites
lidia Posted September 13, 2016 · Report post Выпущен официальный поддерживаемый модуль интеграции АСР LANBilling с сервисом Смотрёшка. Внедрение модуля очень простое. Необходимо лишь установить пакет, прописать параметры доступа к сервису Смотёшка и настроить тарифный план. Share this post Link to post Share on other sites
Dmitry P. Posted September 13, 2016 · Report post Собрал скрипты по смотрешке и IP-тв тут PS Ссылка отобразилась криво ... Это как раз оригинальный скрипт на python-е, который ранее и предлагали в Смотрёшке. Однако, разработчик данного скрипта его не поддерживает, и лично мне не удалось его завести в продакшн на самой первой интеграции. Поэтому было принято решение разрабатывать своё решение, которое удалось популяризовать. http://forum.nag.ru/forum/index.php?showtopic=112732&st=0&p=1234373entry1234373 Share this post Link to post Share on other sites