Суть: В биллинг добавляем доп. параметры lfstrm_id и lfstrm_suspend - в первый падает id от смотрешки, во второй будут сохраняться подписки абонента со стороны смотрешки, которые удаляются на время блокировки абонента (что бы он не уходил в минус).
В биллинге создаются периодические услуги на каждый пакет с нужной вам стоимостью.
При заходе абонента в личный кабинет проверяем lfstrm_id, если пуста - выкидывается запрос email, регистрируемся, записываем его id в доп параметр
Абоненту назначается логин ПРОВАЙДЕРЛИЦЕВОЙСЧЕТ (els1175 для примера) и он кидается в заранее созданную группу смотрёшки.
В конфигах есть сравнение ваших услуг от смотрешки и от биллинга. Оно и используется при построении списка пакетов абоненту в ЛК.
При блокировке (отключение интернета) используем систему utm5_rfw если пользователь в группе, то запрашиваем со смотрёшки номера подписок, сохраняем в доп параметр, а когда разблокируется - поочереди подключаем.
в /application/modules/billing/controllers/IndexController.php добавляем (не забудьте поменять строчку $login = 'ВАШПРОВАЙДЕР'.$account_id; !)
Код: Выделить всё
// added 2016-03-15
public function smotreshkaAction()
{
$this->setTitle('«Смотрёшка»: совершенно новое телевидение');
$lfstrm = new Lfstrm_Smotreshka();
// Zend_Debug::dump($lfstrm->test());
$urfa = $this->reconnect();
$userInfo = $urfa->getUserInfo();
// echo '$urfa->getUserInfo()';
// Zend_Debug::dump($userInfo);
$user_id = $userInfo['id'];
$account_id = $userInfo['basic_account'];
$urfa_admin = new Urfaphp_URFAClientAdmin(
$this->config->urfaphp->login ,
$this->config->urfaphp->password,
$this->config->urfaphp->host,
$this->config->urfaphp->port, true, true);
// Zend_Debug::dump($urfa_admin);
$user = $urfa_admin->rpcf_get_userinfo($user_id);
// echo '$urfa_admin->rpcf_get_userinfo($user_id)';
// Zend_Debug::dump($user);
$parameters = $user['parameters'];
$lfstrm_param_id = $lfstrm->getBillingParamId();
$param_key = FALSE;
foreach ($parameters as $key=>$param) {
if ($param['id'] == $lfstrm_param_id) {
$param_key = $key;
break;
}
}
if ($param_key === FALSE) {
$this->_helper->flashMessenger->addMessage(
array('danger' => 'Неверно указан ID параметра')
);
$this->redirect('/user/');
}
$lfstrm_id = $parameters[$param_key]['value'];
$account_info = $urfa_admin->rpcf_get_accountinfo($account_id);
if ($account_info['int_status'] == 0){
echo "Подключение и редактирование подписок \"Cмотрешки\" доступно только при активной услуге доступа в Интернет";
return;
}
if ($lfstrm_id == FALSE) { // еще не зарегистрирован в Смотрешке и/или не привязан к биллингу
$this->view->form = new Billing_Form_SmotreshkaUser($user['email']);
if ($this->getRequest()->isPost() and $this->view->form->isValid($this->getRequest()->getPost())) { // сабмит, все валидно
$values = $this->view->form->getValues();
$email = $values['email'];
$login = 'ВАШПРОВАЙДЕР'.$account_id;
$result = $lfstrm->addUser($login,$email);
if ($result['status'] == 200) { // смотрешка ответила корректно
$lfstrm_id = $result['response']['id'];
$parameters[$param_key]['value'] = $lfstrm_id;
$urfa_result = $urfa_admin->rpcf_edit_user_new($user,$parameters);
if ($urfa_result['user_id']) { // корректно записалось в доппараметры
$urfa_admin->rpcf_add_group_to_user($user_id,$lfstrm->getBillingGroupId());
$this->_helper->flashMessenger->addMessage(
array('success' => 'Регистрация прошла успешно')
);
$this->redirect('/user/smotreshka');
} else { // ошибка в биллинге
$this->_helper->flashMessenger->addMessage(
array('danger' => $urfa_result['error_msg'])
);
$this->redirect('/user');
}
} else { // ошибка на стороне смотрешки
$this->view->error = 'Ошибка регистрации: '.$result['response']['error'];
}
}
return;
}
$result = $lfstrm->getUser($lfstrm_id);
//Zend_Debug::dump($result);
if ($result['status'] != 200) {
$this->_helper->flashMessenger->addMessage(
array('danger' => 'Неверно указан lfstrm_id')
);
$this->redirect('/user/');
}
// корректный lfstrm_id в доппараметрах
$this->view->lfstrmInfo = $result['response'];
$all_services = $urfa_admin->rpcf_get_services_list(); //все, что есть в биллинге
$active_services = $urfa_admin->rpcf_get_all_services_for_user($account_id); // уже подключенные
$lfstrm_services = $lfstrm->getBillingServices(); // наш список из конфига
$services = $active = array();
foreach ($all_services['services'] as $service) {
$service_id = $service['service_id'];
if (isset($lfstrm_services[$service_id])) { // and $lfstrm_services[$service_id]
$services[$service_id] = $service['service_name'] . ', ' . $service['service_comment'];
foreach ($active_services['services'] as $active_service) {
if ($active_service['id'] == $service_id) {
$active[$service_id] = $active_service['slink_id'];
}
}
}
}
$this->view->form = new Billing_Form_SmotreshkaServices($services,array_keys($active));
if ($this->getRequest()->isPost() and $this->view->form->isValid($this->getRequest()->getPost())) { // сабмит, все валидно
$values = $this->view->form->getValues();
foreach ($lfstrm_services as $service_id=>$offer_id) {
$from = in_array($service_id,array_keys($active));
$to = in_array($service_id,$values['services']);
if ($from != $to) { // подключение или отключение
$result = $lfstrm->setSubscription($lfstrm_id,$offer_id,$to);
// $result = array('status'=>200);
if ($result['status'] == 200) { // смена подписки в смотрешке прошла корректно
if ($to) { // подключение
$periods = $urfa_admin->rpcf_get_discount_periods();
$period_static_id = $lfstrm->getBillingPeriodStaticId();
$discount_period_id = FALSE;
foreach ($periods['discount_periods'] as $period) {
if ($period['static_id']==$period_static_id) {
$discount_period_id = $period['discount_period_id'];
break;
}
}
if ($discount_period_id) { // нашли РП по static_id из конфига
$service = $lfstrm->getBillingPeriodicDefault();
$service['user_id'] = $user_id;
$service['account_id'] = $account_id;
$service['service_id'] = $service_id;
$service['start_date'] = time();
$service['expire_date'] = 2000000000;
$service['discount_period_id'] = $discount_period_id;
$urfa_result = $urfa_admin->rpcf_add_periodic_slink_ex($service);
//Zend_Debug::dump($service);
//return;
} else {
$this->_helper->flashMessenger->addMessage(
array('danger' => 'Не найден РП')
);
}
} else { // отключение
$urfa_result = $urfa_admin->rpcf_delete_slink($active[$service_id]);
//$urfa_result = $urfa_admin->rpcf_edit_periodic_slink_ex($service);
}
if ((is_array($urfa_result) and $urfa_result['slink_id']==-1) or $urfa_result==-1) {
$this->_helper->flashMessenger->addMessage(
array('danger' => 'Ошибка услуги')
);
}
} else {
$this->_helper->flashMessenger->addMessage(
array('danger' => 'Ошибка подписки: '.$result['response']['error'])
);
}
}
}
if (!count($this->_helper->flashMessenger->getMessages())) {
$this->_helper->flashMessenger->addMessage(
array('success' => 'Подписки обновлены успешно')
);
}
$this->redirect('/user/smotreshka');
}
unset($urfa);
unset($urfa_admin);
unset($user);
unset($parameters);
}
Код: Выделить всё
<?php
/**
* @author Ruslan Yamaletdinov <dime@vne.ru>
* @link http://els-net.ru/
* @copyright Copyright © 2016
* @license GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
class Billing_Form_SmotreshkaServices extends Zend_Form
{
public function __construct($services,$value)
{
parent::__construct();
$this->setName('form_smotreshka_services');
//$this->removeDecorator('HtmlTag');
$this->addElement(
'multiCheckbox', 'services', array(
'label' => 'Подписка на каналы',
'value' => $value,
'multiOptions' => $services
)
);
$submit = new Zend_Form_Element_Submit('submit', array('class' => 'btn btn-primary'));
$submit->setLabel('Сохранить изменения');//->removeDecorator('DtDdWrapper');
$this->addElement($submit);
}
public function init()
{
$this->addAttribs(array('class' => 'well col-md-6'));
}
}
Код: Выделить всё
<?php
/**
* @author Ruslan Yamaletdinov <dime@vne.ru>
* @link http://els-net.ru/
* @copyright Copyright © 2016
* @license GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
class Billing_Form_SmotreshkaUser extends Zend_Form
{
public function __construct($email='')
{
parent::__construct();
$this->setName('form_smotreshka_user');
//$this->removeDecorator('HtmlTag');
$this->addElement(
'text', 'email', array(
'label' => 'E-mail:',
'required' => TRUE,
'value' => $email,
'filters' => array('StringTrim', 'StringToLower'),
'validators' => array(
array('EmailAddress', TRUE)
),
'ErrorMessages' => array('Некорректный адрес электронной почты'),
)
);
$submit = new Zend_Form_Element_Submit('submit', array('class' => 'btn btn-primary'));
$submit->setLabel('Зарегистрироваться');//->removeDecorator('DtDdWrapper');
$this->addElement($submit);
}
public function init()
{
$this->addAttribs(array('class' => 'well col-md-6'));
}
}
Код: Выделить всё
<?php
if (isset($this->error)) {
echo $this->bootAlert(array('danger'=>$this->error));
}
if (isset($this->info)) {
echo $this->bootAlert(array('info'=>$this->info));
}
?>
<?php if ($this->lfstrmInfo) : ?>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th colspan="2">Параметры аккаунта</th>
</tr>
</thead>
<tbody>
<tr>
<td class="span5">Логин:</td>
<td><?= $this->lfstrmInfo['username']?></td>
</tr>
<tr>
<td>E-mail:</td>
<td><?= $this->lfstrmInfo['email']?></td>
</tr>
<tr>
<td class="span5">Личный кабинет:</td>
<td><a href="http://smotreshka.tv/#tv/personal" target="_blank">http://smotreshka.tv/#tv/personal</a></td>
</tr>
</table>
<?php endif; ?>
<?= $this->form ?>
Код: Выделить всё
<?php
/**
* @author Ruslan Yamaletdinov <dime@vne.ru>
* @link http://els-net.ru/
* @copyright Copyright © 2016
* @license GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
class Default_IndexController extends Zend_Controller_Action
{
public function init()
{
$this->config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/billing.ini', 'app');
}
public function indexAction()
{
$this->view->title = "Test CLI action: index";
$user_id = $this->_getParam('user_id');
$this->view->message = "user_id={$user_id}";
}
}
Код: Выделить всё
<?php echo $this->message; ?>
Код: Выделить всё
autoloadernamespaces[] = "Lfstrm_"
/application/configs/cli.ini
Код: Выделить всё
[cli]
phpSettings.date.timezone = "Europe/Moscow"
;resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.params.prefixDefaultModule = "1"
resources.modules[] =
resources.view.helperPath.App_View_Helper = APPLICATION_PATH "/views/helpers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
resources.layout.layout = "default"
;default.resources.layout.layout = "login"
;Прописываем префиксы файлов для автозагрузки в папке library.
autoloadernamespaces[] = "Urfaphp_"
autoloadernamespaces[] = "Lfstrm_"
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream = APPLICATION_PATH "/logs/cli.log"
resources.log.stream.writerParams.mode = "a"
;resources.log.stream.filterName = "Priority"
;resources.log.stream.filterParams.priority = 4
;Прописываем роуты
resources.router.routes.default.route = ":user_id"
resources.router.routes.default.defaults.module= "cli"
resources.router.routes.default.defaults.controller= "index"
resources.router.routes.default.defaults.action= "index"
/application/configs/smotreshka.ini
Код: Выделить всё
[lfstrm]
;подключение
prefix = "http://ПУТЬДОСЕРВЕРАlfstrm.tv/v1/"
;услуги, формат «id_биллинга => id_смотрешки» (false для устаревших услуг)
service[210] = 110 ;25 за 25
service[202] = 102 ;Промо
service[203] = 103 ;Базовый
service[204] = 104 ;Супербазовый
service[205] = 107 ;Дождь
service[206] = 106 ;Amedia Premium HD
service[207] = 105 ;Наш футбол HD
service[208] = 111 ;Матч футбол
service[209] = 115 ;Плюс кино
;ID доппараметра в биллинге для хранения lfstrm_id
lfstrm_param_id = 1
lfstrm_suspend_id = 3
;ID группы в биллинге для абонентов смотрешки
lfstrm_group_id = 201
;static_id расчетного периода в биллинге
period_static_id = 6
;параметры периодической услуги в биллинге
periodic.tariff_link_id = 0
periodic.start_date = 0 ;"now()"
periodic.expire_date = 0 ;"max_time()"
periodic.policy_id = 2
periodic.unabon = 0
periodic.cost_coef = 1
Код: Выделить всё
<li>
<a href="/user/smotreshka">Смотрешка</a>
</li>
api смотрёшки /library/Lfstrm/Smotreshka.php
Код: Выделить всё
<?php
class Lfstrm_Smotreshka {
protected $config;
public function __construct() {
$this->config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/smotreshka.ini', 'lfstrm');
}
public function getUserlist() {
return $this->request('user');
}
public function getUser($lfstrm_id) {
return $this->request($lfstrm_id.'/user');
}
public function deleteUser($lfstrm_id) {
return $this->request($lfstrm_id.'/user','DELETE');
}
public function addUser($login,$email) {
$data = array(
'email' => $email,
'username' => $login,
);
return $this->request('user','POST',$data);
}
public function setSubscription($lfstrm_id,$offer_id,$action) {
$data = array(
'id' => $offer_id,
'valid' => (bool)$action,
);
return $this->request($lfstrm_id.'/subscriptions','POST',$data);
}
public function deleteSubscriptions($lfstrm_id) {
return $this->request($lfstrm_id.'/subscriptions','DELETE');
}
public function getSubscriptions($lfstrm_id) {
return $this->request($lfstrm_id.'/subscriptions');
}
public function getOffers() {
return $this->request('offers');
}
private function request($path,$method='GET',$data=FALSE) {
$ch = curl_init($this->config->prefix . $path);
$params = array(
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array('Content-Type: application/vnd.api+json'), // или 'application/json', если не понимает?
);
if ($method=='POST' and is_array($data)) {
$params[CURLOPT_POSTFIELDS] = json_encode($data);
}
curl_setopt_array($ch, $params);
$response = curl_exec($ch);
if (curl_errno($ch)) { // системная ошибка самого CURL
die(curl_error($ch)); // если в биллинг подключать, то может, exception выкидывать какой-нибудь
}
$result = array(
'status' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
'response' => json_decode($response, TRUE),
);
curl_close($ch);
return $result;
}
public function getBillingParamId(){
return $this->config->lfstrm_param_id;
}
public function getBillingParamSuspendId(){
return $this->config->lfstrm_suspend_id;
}
public function getBillingGroupId(){
return $this->config->lfstrm_group_id;
}
public function getBillingPeriodStaticId(){
return $this->config->period_static_id;
}
public function getBillingServices(){
return $this->config->service->toArray();
}
public function getBillingPeriodicDefault(){
return $this->config->periodic->toArray();
}
public function test() {
return $this->config->toArray();
}
}
Сюда не влазит, берем из архива снизую
Скрипты включения и выключения при выключении инета
/netup/utm5/bin/lfstrm_on.php
Код: Выделить всё
<?php
define('APPLICATION_PATH', '/var/www/html/my/application');
define('APPLICATION_ENV', 'cli');
// Ensure library/ is on include_path
set_include_path(
implode(
PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)
)
);
require_once 'Zend/Application.php';
// Create application
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/cli.ini'
);
// а запускать MVC нафиг не надо, обойдемся пока обычным скриптом)
//$application->bootstrap()->run();
$user_id = $argv[1]; // аргумент из консоли
//$user_id = 1515;
$lfstrm = new Lfstrm_Smotreshka();
//Zend_Debug::dump($lfstrm->test());
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/billing.ini', 'app');
$urfa_admin = new Urfaphp_URFAClientAdmin(
$config->urfaphp->login ,
$config->urfaphp->password,
$config->urfaphp->host,
$config->urfaphp->port, true, true);
//Zend_Debug::dump($urfa_admin);
$user = $urfa_admin->rpcf_get_userinfo($user_id);
$account_id = $user['basic_account'];
//Zend_Debug::dump($user);
$parameters = $user['parameters']; //читаем параметры
$lfstrm_param_id = $lfstrm->getBillingParamId(); //получаем ID lfstrm из биллинга
$lfstrm_suspend_id = $lfstrm->getBillingParamSuspendId(); //получаем ID lfstrm suspended из биллинга
$param_key = FALSE;
$param_key_susp = FALSE;
foreach ($parameters as $key=>$param) { //ищем ключ массива для lfstrm ID
if ($param['id'] == $lfstrm_param_id) {
$param_key = $key;
break;
}
}
foreach ($parameters as $key=>$param) { //ищем ключ массива для susp ID
if ($param['id'] == $lfstrm_suspend_id) {
$param_key_susp = $key;
break;
}
}
if ($param_key === FALSE) {
die('Неверно указан ID параметра');
}
$lfstrm_subs_susp = $parameters[$param_key_susp]['value'];//получаем список приостановленных подписок
$lfstrm_id = $parameters[$param_key]['value'];
$lfstrm_subs_susp_arr = explode(',', $lfstrm_subs_susp); //преобразовываем в массив
foreach ($lfstrm_subs_susp_arr as $sups_subs){ //подписываем их поочереди
$lfstrm->setSubscription($lfstrm_id,$sups_subs,true);
}
$parameters[$param_key_susp]['value'] = ""; //сбрасываем значение suspended подписок в биллинге
$urfa_result = $urfa_admin->rpcf_edit_user_new($user,$parameters);
Код: Выделить всё
<?php
define('APPLICATION_PATH', '/var/www/html/my/application');
define('APPLICATION_ENV', 'cli');
// Ensure library/ is on include_path
set_include_path(
implode(
PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)
)
);
require_once 'Zend/Application.php';
// Create application
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/cli.ini'
);
// а запускать MVC нафиг не надо, обойдемся пока обычным скриптом)
//$application->bootstrap()->run();
$user_id = $argv[1]; // аргумент из консоли
//$user_id = 1515;
$lfstrm = new Lfstrm_Smotreshka();
//Zend_Debug::dump($lfstrm->test());
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/billing.ini', 'app');
$urfa_admin = new Urfaphp_URFAClientAdmin(
$config->urfaphp->login ,
$config->urfaphp->password,
$config->urfaphp->host,
$config->urfaphp->port, true, true);
//Zend_Debug::dump($urfa_admin);
$user = $urfa_admin->rpcf_get_userinfo($user_id);
$account_id = $user['basic_account'];
//Zend_Debug::dump($user);
$parameters = $user['parameters']; //читаем параметры
$lfstrm_param_id = $lfstrm->getBillingParamId(); //получаем ID lfstrm из биллинга
$lfstrm_suspend_id = $lfstrm->getBillingParamSuspendId(); //получаем ID lfstrm suspended из биллинга
$param_key = FALSE;
$param_key_susp = FALSE;
foreach ($parameters as $key=>$param) { //ищем ключ массива для lfstrm ID
if ($param['id'] == $lfstrm_param_id) {
$param_key = $key;
break;
}
}
foreach ($parameters as $key=>$param) { //ищем ключ массива для susp ID
if ($param['id'] == $lfstrm_suspend_id) {
$param_key_susp = $key;
break;
}
}
if ($param_key === FALSE) {
die('Неверно указан ID параметра');
}
$lfstrm_id = $parameters[$param_key]['value'];
$lfstrm_subs = $lfstrm->getSubscriptions($lfstrm_id); //получаем подписки из смотрешки
if ($lfstrm_subs['status'] == 200) {
foreach ($lfstrm_subs['response'] as $offer){ //преобразования в строку
$lfstrm_subs_cut[]=$offer['id'];
}
$lfstrm_susp_comm=implode(',', $lfstrm_subs_cut);
$parameters[$param_key_susp]['value'] = $lfstrm_susp_comm;
$urfa_result = $urfa_admin->rpcf_edit_user_new($user,$parameters); //добавляем в susp
}
$lfstrm->deleteSubscriptions($lfstrm_id); //удаляем подписки
Cвоими руками внес пару изменений, возможно они косячны
Может что-то плохо скопировал или что-то забыл. Полный ЛК с данным функционалом: https://yadi.sk/d/Lr9D1rhoqvf79