Jump to content

Recommended Posts

Posted

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

Posted

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

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

Posted

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

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

 

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

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

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

 

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

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

Posted

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

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

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

 

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

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

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

Posted

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

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

Posted

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

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

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

  • 4 months later...
Posted

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

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

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

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

  • 3 months later...
Posted

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

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

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

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

 

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

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

Posted

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

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

 

 

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

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

Posted

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

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

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

Posted

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

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

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

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

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

Posted

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

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

 

 

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

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

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

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

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

Posted

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

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

 

 

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

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

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

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

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

 

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

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

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

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

Posted

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

 

 

 

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

 

 

  • 1 month later...
  • 2 weeks later...
Posted

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

 

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

Posted

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

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.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.