Биллинговая система NoDeny. Платежные терминалы ОСМП.

Модуль платежных терминалов работает независимо от ядра биллинговой системы. Это скрипт, который располагается на сервере с админкой NoDeny и доступен на выполнение по https-запросу.

Вам необходимо создать папку вне админки NoDeny, например,
mkdir /usr/local/www/apache22/cgi-bin/osmp
и скопировать в нее скрипт osmp.pl, после чего выдать такие права:
chown www:wheel /usr/local/www/apache22/cgi-bin/osmp/osmp.pl
chmod 500 /usr/local/www/apache22/cgi-bin/osmp/osmp.pl
Перед тем как настроить веб-сервер на доступ к скрипту по паролю и только от определенных ip-адресов (не забудьте обязательно это сделать!), оттестируем его. Для этого в админке NoDeny создадим учетную запись тестового клиента, после чего зайдем в его клиентскую статистику и на титульной странице выясним его т.н «персональный платежный код». Если на титульной странице этого кода нет - необходимо включить его отображение в «Операции» → «Настройки» → «Клиентская статистика».
Справка.

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

В системе NoDeny идентификатор формируется таким образом: берется id клиента по биллингу, все цифры этого id складываются, после чего последняя цифра от полученной суммы приписывается к первоначальному id. (Технически эта операция называется «сложение по модулю 10»)

Например. У клиента id=5907. Складываем все цифры его идентификатора: 5 + 9 + 0 + 7 = 21. Берем последнюю цифру полученной суммы: 1, приписываем к id и получаем персональный платежный код клиента: 59071.

Если при вводе клиент ошибется в одной из цифр, например, введет 58071, то при проверке 5 + 8 + 0 + 7 = 20, 0 не равен 1, поэтому клиенту будет сообщено об ошибке. Так же, если клиент ошибется и вместо номера платежного кода попытается ввести сумму пополнения, то она с большой вероятностью не попадет под описанный шаблон, например, 100, 50, 25, 120 и т.д. сформируют ошибку. А 550 грн - нет. Тем не менее, данный алгоритм позволяет отсеять подавляющее большинство ошибок.

Если возникнет необходимость выяснить идентификатор клиента по платежному коду, то это не составит труда - достаточно отбросить последнюю цифру, так если ППК = 1236, то id клиента = 123.


Введем в браузере: http://10.0.0.1/cgi-bin/osmp/osmp.pl

В результате в нем должен отобразиться подобный текст:
<?xml version="1.0" encoding="UTF-8"?>
<response><osmp_txn_id></osmp_txn_id>
<result>1</result>
<comment>nod3</comment>
</response>
Для некоторых браузеров, что бы увидеть этот текст необходимо просмотреть исходный текст полученной страницы. В любом случае скрипт должен отработать и вернуть result-код равный единице, а coment = nod3, что будет означать «не указан аккаунт клиента».

Если же coment возвращается равным nod1 или nod2 - это указывает на некорректную настройку скрипта osmp.pl. Вам необходимо отредактировать в его начале строку, начинающуюся с «$Main_config=».

Теперь смоделируем выполнение транзакции пополнения счета. Введем в браузере:

http://10.0.0.1/cgi-bin/osmp/osmp.pl?command=pay&sql=1&txn_id=666&txn_date=now&sum=10.25&account=33

В этом url необходимо изменить лишь персональный платежный код, необходимо взять ППК тестового клиента, который мы создали ранее. В примере ППК = 33 (account=33).


Комментарий. В url-e параметр txn_date установлен в значение now - этим мы указываем проводить платеж-пополнение именно в момент совершения транзакции. Внимание! В механизме ОСМП время платежа соответствует времени оплаты в платежном терминале, а не времени проведения транзакции. В этом случае в txn_date должно быть закодировано время, это описано в документации к ОСМП. Значение now реализовано автором NoDeny только для упрощения тестирования скрипта, в реальности время платежа будет установлено по времени, указанному терминалом.

Также в скрипте предусмотрен страховочный механизм, если разница с текущим временем и временем, которым терминал указывает провести платеж, составляет больше суток, то терминалу будет возвращен код nod12 и транзакция отклонена. Это защита от ошибочного проведения платежей задними числами. Дело в том, что ни одна программа не застрахована от ошибок, они есть (по крайней мере были) в терминалах ОСМП, например, игнорирование проверки соответствия аккаунта шаблону.

txn_id=666 - это идентификатор платежа в системе ОСМП. Для каждого, состоявшегося в системе ОСМП платежа, он должен быть уникальным. Поэтому не забывайте его менять при тестировании.

При успешности транзакции скрипт должен вернуть в браузер поле result = 0. В противном случае поля result и coment вы можете расшифровать просмотрев содержимое файла osmp.pl. Например, если вы получили comment=nod13 - это означает "не удалось провести платеж в БД", т.е проблема с нашей стороны.

Чтобы диагностировать проблему с нашей стороны, мы вставили в url: sql=1 - это указывает sql запросы записывать в лог-админки. ОСМП не использует этот параметр, он введен автором NoDeny для тестирования.

После тестирования не забудьте отредактировать конфиг веб-сервера так, чтобы он давал доступ к папке osmp только по паролю (см. как это сделано для админки), а также разрешал доступ только с ip-адресов терминалов, которые должны быть указаны в договоре с ОСМП.