Jump to content
Калькуляторы

Интеграция 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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

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

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

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

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

 

 

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

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

 

тыц

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Собрал скрипты по смотрешке и 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

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.