Перейти к содержимому
Калькуляторы

Интеграция LanBilling и smotreshka.tv через API

Ковыряю смотрёшкин 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Там один из способов - как раз тот, что я описал выше. И я так понимаю, что они равноценные.

Значит будем пинать саппорт смотрешки в понедельник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

метод не post а get будьте внимательны. Еще у них привязка по ip. отсюда access denied. завтра могу выложить рабочий php код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

метод не post а get будьте внимательны.

Да не, в API и GET, и POST - для разных операций разные методы, и вроде я нигде не промахнулся. :)

 

Еще у них привязка по ip. отсюда access denied.

Утверждается, что открыто для моего IP. Хотя надо будет еще раз у них уточнить, т.к. я поначалу получал от них "Bad Gateway" и не понимал почему. Потом выяснилось, что у них легла платформа.

Может и сейчас у них что-то "слетело"

 

завтра могу выложить рабочий php код.

Буду благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще у них привязка по ip. отсюда access denied.

В общем что-то они там опять накосячили, теперь с этой настройкой.

А скрипты вышеприведенные мной рабочие - проверил после того как в смотрешке поправили настройки платформы.

 

завтра могу выложить рабочий php код.

Интеграция с биллингом делалась?

Сама смотрешка быстро слилась со своего обещания в презентации "Мы проводим интеграцию платформы с вашим биллингом". Предоставил API, а все что дальше - наш головняк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ.

Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Опытом бега по граблям не поделитесь? Чтоб нам все заново не проходить пробегать. :)

Пока застрял на том, что при попытке создать/удалить пользователя у них через 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

Может опять они что-то не донастроили, например дали права только на чтение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ.

Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо.

А как вы приостановление сервиса реализовали?

Смотрешка предлагает каждый раз при блокировке отписывать юзера от пакетов и потом подписывать по-новой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То, что есть у Смотрешки - API сложно назвать, какая-то поделка, а не АПИ.

Мы просто кучу граблей при интеграции вставляли, чтобы все нормально работало и так, как нам надо.

А как вы приостановление сервиса реализовали?

Смотрешка предлагает каждый раз при блокировке отписывать юзера от пакетов и потом подписывать по-новой.

 

Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление.

Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление.

Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента.

 

 

денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов.

клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов.

клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились.

Если в смотрешке клиент отписался от всех пакетов, то как они потом восстановятся? Смотрешка помнит что было подписано? ИМХО смотрешка не различает - отписался клиент от пакетов добровольно или его отписали принудительно из-за отсутствия денег

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если в смотрешке клиент отписался от всех пакетов, то как они потом восстановятся? Смотрешка помнит что было подписано? ИМХО смотрешка не различает - отписался клиент от пакетов добровольно или его отписали принудительно из-за отсутствия денег

ну в биллинге же есть эти пакеты, они тупо заблокированы.

при блокировки биллинг присылает отключение их в смотрёшку, но в биллинге они остаются.

при оплате они разблокируются, и пакеты снова "прилетают" в смотрёшку.

хз как у вас, но я такое проверял, у меня пакеты востанавливались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, кто-то делал отслеживание и обработку события отвязки оборудования от УЗ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление.

Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента.

 

 

денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов.

клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились.

Да, мы так и делаем.

Не очень удобно конечно, но работает.

Вообще желательно коллективно допинать Смотрешку чтобы реализовали приостановку услуг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тоже интересует данный момент. Ибо в API не нашёл функционала по приостановлению услуг. Приостанавливать списание в биллинге Агента нет смысла - пока услуги висят на Абоненте, Агенту будут идти начисление.

Остаётся только реализовывать кнопку "Временно приостановить услугу" в личном кабинете, по которой производить реальную отписку от пакетов данного клиента, а себе куда-то в базу записывать эти пакеты. А по нажатию на кнопку "Возобновить" подключать ранее отключённые пакеты, делая т.о. видимость приостановки услуг для клиента.

 

 

денег на счету недостаточно - учетная запись заблокирована - в смотрёшку скрптом отправляется отписка от всех пакетов.

клиент денег положил - учетная запись разблокировалась - пакеты в смотрёшки восстановились.

Да, мы так и делаем.

Не очень удобно конечно, но работает.

Вообще желательно коллективно допинать Смотрешку чтобы реализовали приостановку услуг.

 

связь односторонняя

биллинг -> смотрешка

если и сделают двухстороннюю связь, то очень не скоро

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, есть пример скрипта интеграции со смотрешкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, есть пример скрипта интеграции со смотрешкой?

 

 

 

<?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;
   }
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, есть пример скрипта интеграции со смотрешкой?

 

тыц

 

там за доработанный вариант 2,5к просили.

заплатил, выслали, все работает(13я версия)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Собрал скрипты по смотрешке и IP-тв тут

 

PS Ссылка отобразилась криво ...

Изменено пользователем Domingo

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выпущен официальный поддерживаемый модуль интеграции АСР LANBilling с сервисом Смотрёшка.

 

Внедрение модуля очень простое. Необходимо лишь установить пакет, прописать параметры доступа к сервису Смотёшка и настроить тарифный план.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Собрал скрипты по смотрешке и IP-тв тут

 

PS Ссылка отобразилась криво ...

 

Это как раз оригинальный скрипт на python-е, который ранее и предлагали в Смотрёшке. Однако, разработчик данного скрипта его не поддерживает, и лично мне не удалось его завести в продакшн на самой первой интеграции. Поэтому было принято решение разрабатывать своё решение, которое удалось популяризовать.

 

http://forum.nag.ru/forum/index.php?showtopic=112732&st=0&p=1234373entry1234373

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.