Карточная IVR система на базе Cisco
Материал из BiTel WiKi
Содержание |
Карточки
как это все работает...
У пользователя есть карточка на карточке напечатан номер карточки и пинкод. есть 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.