Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

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

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

Настройка интеграции

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

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

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

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

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

Настройка тарифных планов

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

Настроить обычный тариф продолжительностью 10 мин:

Настроить привилегированный тариф продолжительностью 1 ч:

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

Создать портал:

Перейти в раздел "Тарифы", удалить тариф "Hotspot Default", добавить ранее созданные тарифы "exclusive" и "regular" и нажать кнопку "Сохранить".

После нажатия кнопки "Сохранить" появится возможность выбрать условия назначения привилегированного тарифа.

В настройках ставим приоритет "1" для тарифа "regular" и выбираем условие "spar" для тарифа "exclusive":

Нажимаем кнопку "Сохранить".

Важно!

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

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

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

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

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

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

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

2021-08-05T16:42:54,519 [qtp547201549-26] ERROR org.eltex.portal.app.condition.SparAppCondition SparAppCondition.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

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

2021-08-05T16:44:39,500 [qtp547201549-319] ERROR org.eltex.portal.app.condition.SparAppCondition SparAppCondition.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)

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

2021-08-05T16:47:42,507 [qtp547201549-594] ERROR org.eltex.portal.app.condition.SparAppCondition SparAppCondition.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-имя неизвестно:

2021-08-05T16:40:15,832 [qtp547201549-320] ERROR org.eltex.portal.app.condition.SparAppCondition SparAppCondition.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:

2021-08-05T16:47:06,397 [qtp547201549-594] ERROR org.eltex.portal.app.condition.SparAppCondition SparAppCondition.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>
  • Нет меток