Карточная IVR система на базе Cisco
Материал из BiTel WiKi
Blib (Обсуждение | вклад) (→dialup) |
Blib (Обсуждение | вклад) (→Голос) |
||
Строка 14: | Строка 14: | ||
==Голос== | ==Голос== | ||
+ | С голосом все много сложнее, так как обычно карточные платформу авторизуют пользователя только по пинкоду а не по паре логин-пароль. Стандартный сиськовский IVR скрипт http://www.cisco.com/cgi-bin/Software/Tablebuild/doftp.pl?ftpfile=/cisco/access/tclware/app-debitcard-nlp.2.0.1.7.zip разбивает введеный код на 2 части первую отправляет в радиус атрибуте User-Name а вторую в Password. Для работы в БГ это совсем не подходит. Мы вышли из положения поправив скрипт так, что бы он отправлял в поле Password весь набраный пинкод, затем в скрипте предобработки для НАС мы ищем соответствующию карточку и добавляем атрибут User-Name в радиус запрос с номером этой карточки. | ||
+ | |||
+ | <source lang="java"> | ||
+ | import java.sql.*; | ||
+ | import java.util.*; | ||
+ | |||
+ | if( "".equals(request.getStringAttribute(1)) || request.getStringAttribute(1)==null) { | ||
+ | try { | ||
+ | PreparedStatement ps = con.prepareStatement("select card_code from card_data_"+setup.getIntValue("card.module.id", 0)+ | ||
+ | " where card_pin_code = ? and status > 0 order by date1 desc"); | ||
+ | ps.setString(1, request.getStringAttribute(2)); | ||
+ | ResultSet rs = ps.executeQuery(); | ||
+ | if(rs.next()) { | ||
+ | request.setStringAttribute(1, String.valueOf(rs.getInt(1))); | ||
+ | } | ||
+ | } catch(Exception e) { | ||
+ | throw new RuntimeException(e); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | если поле User-Name (код радиус атрибута = 1) пустое или если атрибута User-Name нет в запросе, то мы ищем все карточки которые в продаже или активированы (status>0) и пинкод совпадает с переданым в поле Password (код радиус атрибута = 2). Если карточек несколько то мы берем карточку с наиболее поздней датой начала действия (order by date1 desc). | ||
+ | Так как в продаже и активированых карточек довольно мало то вероятность пересечения пинкодов крайне мала и ее можно полностью устранить при генерации карточек если использовать для нее не BGCardGen. | ||
===Конфигурация IVR на Cisco=== | ===Конфигурация IVR на Cisco=== | ||
- | === | + | ===Дополнительные функции=== |
==Пополнение баланса== | ==Пополнение баланса== | ||
==Генерация карточек== | ==Генерация карточек== |
Версия 14:05, 15 июня 2008
Содержание |
Карточки
как это все работает...
У пользователя есть карточка на карточке напечатан номер карточки и пинкод. есть 3 основных сервиса
- dialup (тут все просто)
- голос
- пополнение баланса
Dialup
с диалапом все тривиально и довольно подробно описано в инструкции, ни какх сложностей возникнуть не должно.
В качестве логина пользователь использует номер карточки и в качестве пароля пин-код.
Голос
С голосом все много сложнее, так как обычно карточные платформу авторизуют пользователя только по пинкоду а не по паре логин-пароль. Стандартный сиськовский IVR скрипт http://www.cisco.com/cgi-bin/Software/Tablebuild/doftp.pl?ftpfile=/cisco/access/tclware/app-debitcard-nlp.2.0.1.7.zip разбивает введеный код на 2 части первую отправляет в радиус атрибуте User-Name а вторую в Password. Для работы в БГ это совсем не подходит. Мы вышли из положения поправив скрипт так, что бы он отправлял в поле Password весь набраный пинкод, затем в скрипте предобработки для НАС мы ищем соответствующию карточку и добавляем атрибут User-Name в радиус запрос с номером этой карточки.
import java.sql.*; import java.util.*; if( "".equals(request.getStringAttribute(1)) || request.getStringAttribute(1)==null) { try { PreparedStatement ps = con.prepareStatement("select card_code from card_data_"+setup.getIntValue("card.module.id", 0)+ " where card_pin_code = ? and status > 0 order by date1 desc"); ps.setString(1, request.getStringAttribute(2)); ResultSet rs = ps.executeQuery(); if(rs.next()) { request.setStringAttribute(1, String.valueOf(rs.getInt(1))); } } catch(Exception e) { throw new RuntimeException(e); } }
если поле User-Name (код радиус атрибута = 1) пустое или если атрибута User-Name нет в запросе, то мы ищем все карточки которые в продаже или активированы (status>0) и пинкод совпадает с переданым в поле Password (код радиус атрибута = 2). Если карточек несколько то мы берем карточку с наиболее поздней датой начала действия (order by date1 desc). Так как в продаже и активированых карточек довольно мало то вероятность пересечения пинкодов крайне мала и ее можно полностью устранить при генерации карточек если использовать для нее не BGCardGen.