Page tree
Skip to end of metadata
Go to start of metadata

Общее описание

Интеграция позволяет получить в момент авторизации пользователя WiFi его статус и в зависимости от этого назначить "обычный" или "привилегированный" тариф. Под "обычным" тарифом подразумевается тариф, имеющий небольшое ограничение по времени. Под "привилегированным" тарифом подразумевается тариф, имеющий большое ограничение по времени. Пользователь WiFi, получивший обычный тариф будет через небольшой промежуток времени повторно проходить мак-авторизацию и попадать на страницу с рекламными материалами, подталкивающими его выполнить действия, которые позволят получать при авторизации привилегированный тариф. Функционал работает только при портальной авторизации на ТД Элтекс.

Настройка тарифных планов в Личном кабинете

Выполнить вход в Личный кабинет, перейти к настройке тарифов в разделе "Сервисы и тарифы". Предполагается, что в зависимости от ответа API пользователю WiFi будет назначен либо обычный, либо привилегированный тариф.

Тариф настраивается для авторизации на ТД Eltex:

Нажать кнопку "Добавить" и настроить обычный тариф с портальной аутентификацией, продолжительностью 10 мин:

После окончания настройки нажать "Сохранить".

Нажать кнопку "Добавить" и настроить привилегированный тариф с портальной аутентификацией, продолжительностью 1 ч:

После окончания настройки нажать "Сохранить".

Настройка интеграции с API в Конструкторе порталов

Выполнить вход в конструктор портала, перейти в системные настройки, далее "Доступ к платформе SMART".

Включить, отметив галочкой соответствующую настройку:

После этого надо будет указать параметры подключения, введя:

  • "URL" - адрес хоста с API;
  • "Логин" - логин для доступа;
  • "Пароль" - пароль.

И нажать кнопку "Сохранить".

Настройка портала

1. Создать новый портал:

2. Перейти в раздел "Общие настройки" → "Общие" → "Основные":

И настроить "Время свободного входа" 1 час, "Время хранения MAC-адреса пользователя" 1 час.  Время "1 час" зависит от длительности привилегированного тарифа (Smart Application) и должно быть не меньше его длительности, что бы привилегированные пользователи в течение действия тарифа не попадали на портал. Непривилегированные пользователи после окончания действия их тарифа пройдут MAC-авторизацию и попадут на страницу "Мы вас узнали".

Также можно настроить отображение плейсхолдера выбором настройки "Отображать плейсхолдер номера телефона".

3. Перейти в раздел "Общие настройки" →  "Режим работы" → "Основные":

и отключить "Режим работы":  "ЕСИА" и "Авторизация".

4. Перейти в раздел "Общие настройки" → "Отправка SMS" → "Основные":

и включить настройку "Урезать SSID в SMS".

6. Перейти в раздел "Общие настройки" → "Отправка SMS" → "Выбор страны":

и включить настройку "Разрешить выбор кода страны".

Нажать на кнопку "Изменить":

и выбрать страну в начале списка "Россия (+7)". При необходимости добавить другие страны в начало списка.

2. Перейти в "Языковые настройки":

Указать для всех используемых языков "URL для перенаправления" необходимый URL.

Задать "Шаблон SMS-сообщения", проверить, что пароль стоит на первом месте, чтобы гарантированно был виден в уведомлении. Настроить для всех используемых языков на портале.

7. Перейти в раздел "Тарифы" → "Тарифы":

удалить тариф по умолчанию, добавить ранее созданные в личном кабинете привилегированный и непривилегированный тарифы, привилегированному поставить приоритет "1" и условие "smart", непривилегированный оставить без изменений.

Важно!

Настройка "Приоритет" определяет порядок проверки тарифов при наличии условия. В случае наличия нескольких тарифов с условием и возможности назначения их пользователю WiFi - будет назначен имеющий наименьший приоритет. В случае использования нескольких тарифов без условия - пользователю WiFi будет доступен выбор этих тарифов.

Работа функционала

При авторизации на портале с настроенными условиями и включенной интеграцией, будет выполнен запрос номера пользователя WiFi на адрес API, указанный в настройках URL, с указанным логином и паролем. В результате запроса ожидается ответ, который позволит определить является данный пользователь привилегированным или нет. В результате пользователю будет назначен соответствующий тарифный план.

Если пользователь WiFi перешел в категорию привилегированных, являясь уже авторизованным с обычным тарифом - новый тариф будет назначен только после истечения времени действия текущего тарифа.

Диагностика проблем с подключением к API

Для диагностики проблем связности с API,  следует обратиться к логам портала.

Хост недоступен:

ERROR org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:63). Error while check account 79123456789 status: Error to communicate with underlying api: I/O error on POST request for "http://api.example.org/api/": Connect to api.example.org:80 [example.org/192.0.2.1] connect timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to api.example.org:80 [example.org/192.0.2.1] failed: connect timed out

Подключение отклонено:

ERROR org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:63). Error while check account 79123456789 status: Error to communicate with underlying api: I/O error on POST request for "http://api.example.org/api/": Connect to api.example.org:80 [example.org/192.0.2.1] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to api.example.org:80 [example.org/192.0.2.1] failed: Connection refused (Connection refused)

Сеть недоступна:

ERROR org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:63). Error while check account 79123456789 status: Error to communicate with underlying api: I/O error on POST request for "http://api.example.org/api/": Connect to api.example.org:80 [example.org/192.0.2.1] failed: Network is unreachable (connect failed); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to api.example.org:80 [example.org/192.0.2.1] failed: Network is unreachable (connect failed)

DNS-имя неизвестно:

ERROR org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:63). Error while check account 79123456789 status: Error to communicate with underlying api: I/O error on POST request for "http://api.example.org/api/": http: Name or service not known; nested exception is java.net.UnknownHostException: http: Name or service not known

Стандартные коды ответа сервера HTTP/HTTPS, за исключением кода 200:

ERROR org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:66). Error while check account: 79123456789; API: 404; Message: <?xml version="1.0" encoding="iso-8859-1"?>

Логирование ответов API

Для того, что бы получить логи корректного ответа API (они находятся на уровне DEBUG) надо файле /etc/eltex-portal/log4j2.xml в раздел <Loggers> добавить информацию:

<Logger name="org.eltex.portal.app.condition" level="DEBUG"/>

В этом случае информация о проверке категории пользователя WiFi будет отражена в файле /var/log/eltex-portal/portal.log с уровнем DEBUG.

 Пример настройки /etc/eltex-portal/log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="10">

    <Properties>
        <Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</Property>

        <Property name="baseDir">/var/log/eltex-portal</Property>
        <Property name="maxFileSize">20 MB</Property>
        <Property name="accumulatedFileSize">10 GB</Property>
        <Property name="lastModified">4d</Property>
        <Property name="maxCount">20</Property>
        <Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{12} %C{1}.%M(line:%L). %m%n</Property>
        <Property name="dateSuffix">%d{yyyyMMdd}</Property>

        <Property name="consoleLevel">${env:CONSOLE_LEVEL:-OFF}</Property>

        <Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property>
        <Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property>
        <Property name="gelfPort">${env:GELF_PORT:-12201}</Property>
    </Properties>

    <Appenders>

        <Console name="STDERR" target="System.err">
            <PatternLayout pattern="${logPattern}"/>
        </Console>

        <RollingFile name="RollingFile"
                     fileName="${baseDir}/portal.log"
                     filePattern="${baseDir}/log/portal-%i.log.gz">
            <PatternLayout pattern="${logPattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${maxFileSize}"/>
                <OnStartupTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/portal-*.log.gz">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AccessRollingFile"
                     fileName="${baseDir}/access.log"
                     filePattern="${baseDir}/access/access_${dateSuffix}.log">
            <PatternLayout pattern="%m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/access_*.log">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AuthRollingFile"
                     fileName="${baseDir}/auth.log"
                     filePattern="${baseDir}/auth/auth_${dateSuffix}.log">
            <PatternLayout pattern="%d{ISO8601} %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/auth_*.log">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-portal"
              extractStackTrace="true" originHost="%host{fqdn}" maximumMessageSize="8192" >
            <Field name="thread" pattern="%t"/>
            <Field name="level" pattern="%level"/>
            <Field name="severity" pattern="%-5level"/>
            <Field name="logger" pattern="%logger{12}"/>
            <Field name="location" pattern="%C{1}.%M(line:%L)"/>
        </Gelf>

    </Appenders>

    <Loggers>
        <Root level="${rootLevel}">
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="STDERR" level="${consoleLevel}"/>
            <AppenderRef ref="Gelf" level="${gelfLevel}"/>
        </Root>

        <Logger name="AccessLogger" additivity="false">
            <AppenderRef ref="AccessRollingFile"/>

            <!--"custom" for custom format with BRAS parameters and AP headers-->
            <!--"default" for NCSA format-->
            <Property name="format">default</Property>

            <!--Customizable parts of the access log-->
            <Property name="cookies">true</Property>
            <Property name="headers">true</Property>
            <Property name="bras">true</Property>
        </Logger>

        <Logger name="AuthLogger" additivity="false" level="INFO">
            <AppenderRef ref="AuthRollingFile"/>
            <AppenderRef ref="Gelf" level="${gelfLevel}"/>
        </Logger>

        <Logger name="org.springframework" level="ERROR"/>
        <Logger name="org.eclipse.jetty"   level="ERROR"/>
        <Logger name="org.apache.tomcat"   level="ERROR"/>
        <logger name="io.grpc.netty"       level="ERROR"/>
        <Logger name="io.netty"            level="ERROR"/>

        <!--SQL logging-->
        <Logger name="org.jooq.tools.LoggerListener" level="OFF"/>

        <Logger name="jndi"       level="OFF"/>
        <Logger name="org.quartz" level="OFF"/>
        <Logger name="com.zaxxer" level="OFF"/>
        <Logger name="org.apache" level="OFF"/>

        <Logger name="org.jooq.impl.DefaultConnectionProvider"              level="OFF"/>
        <Logger name="org.springframework.boot.SpringApplication"           level="INFO"/>
        <Logger name="org.eltex.portal.commons.ApplicationStartupListener"  level="INFO"/>
	
	<Logger name="org.eltex.portal.app.condition" level="DEBUG"/>

    </Loggers>

</Configuration>

От API получен ответ о том, что пользователь привелигированный:

2021-10-21T17:25:38,164 [qtp252553541-31] DEBUG org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:46). Check out account 79123456789
2021-10-21T17:25:38,510 [qtp252553541-31] DEBUG org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:48). SmartAccountStatusResponse{status=true, smartErrorBody=SmartErrorBody{message='', code=''}}

От API получен ответ о том, что пользователь непривелигированный:

2021-10-21T17:31:35,258 [qtp252553541-70] DEBUG org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:46). Check out account 79123456789
2021-10-21T17:31:35,588 [qtp252553541-70] DEBUG org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:48). SmartAccountStatusResponse{status=false, smartErrorBody=SmartErrorBody{message='В базе не найден контрагент по номеру телефона', code='error004'}}
2021-10-21T17:31:35,588 [qtp252553541-70] DEBUG org.eltex.portal.app.condition.SmartAppCondition SmartAppCondition.check(line:52). Account: 79132062837; Message: В базе не найден контрагент по номеру телефона; Code: error004
  • No labels