Терминалы Приватбанка, версия 2: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
м (Захистив «Терминалы Приватбанка, версия 2» ([Редагування=Дозволено тільки адміністраторам] (безстроково) [Перейменування=Дозволено тільки адміністраторам] (безстроково)))
мНемає опису редагування
 
(Не показано 5 проміжних версій цього користувача)
Рядок 11: Рядок 11:
<pre>
<pre>
rules => [
rules => [
{
    {
field_name => 'grp', # допполе (либо grp)
        field_name => 'grp',           # допполе (либо grp)
field_value => [1, 2, 13], # значения допполя (либо группы)
        field_value => [1, 2, 13],     # значения допполя (либо группы)
params => [
        params => [
{
            {
percent => 100,
                percent     => 100,
serviceCode => 10,
                serviceCode => 10,
CompanyCode => 12345,
                CompanyCode => 12345,
ServiceName => 'Доступ до мережі Інтернет',
                ServiceName => 'Доступ до мережі Інтернет',
}
            }
]
        ]
},
    },
{
    {
field_name => '_ip_tag', # допполе (либо grp)
        field_name => '_ip_tag',       # допполе (либо grp)
field_value => ['nas21'], # значения допполя (либо группы)
        field_value => ['nas21'],       # значения допполя (либо группы)
params => [
        params => [
{ # расщепление платежей
            {                           # расщепление платежей
percent => 10,
                percent     => 10,
serviceCode => 10,
                serviceCode => 10,
CompanyCode => 12345,
                CompanyCode => 12345,
ServiceName => 'Доступ до мережі Інтернет',
                ServiceName => 'Доступ до мережі Інтернет',
},{
            },{
percent => 20,
                percent     => 20,
serviceCode => 11,
                serviceCode => 11,
CompanyCode => 22222,
                CompanyCode => 22222,
ServiceName => 'Послуга техпідтримки',
                ServiceName => 'Послуга техпідтримки',
},{
            },{
percent => 70,
                percent     => 70,
serviceCode => 12,
                serviceCode => 12,
CompanyCode => 33333,
                CompanyCode => 33333,
ServiceName => 'Послуга відпочинку',
                ServiceName => 'Послуга відпочинку',
}
            }
],
        ],
},
    },
{ # правило для всех остальных, кто не попал в предыдущие
    {   # правило для всех остальных, кто не попал в предыдущие
params => [
        params => [
{
            {
percent => 100,
                percent     => 100,
serviceCode => 200,
                serviceCode => 200,
CompanyCode => 777777,
                CompanyCode => 777777,
ServiceName => 'Доступ до мережі Інтернет',
                ServiceName => 'Доступ до мережі Інтернет',
}
            }
]
        ]
},
    },
],
],
</pre>
</pre>
Правило - это блок {...} в котором находятся 3 параметра:
* field_name (необязательное)
* field_value (необязательное)
* params (обязательное) - параметры ответа платежной системе
Когда модуль получает запрос от платежной системы, он проверяет правила сверху вниз, и если правило совпадает - модуль формирует ответ согласно этому правилу и прекращает их (правил) обработку. Таким образом вы можете запрограммировать такую логику: у клиента есть допполе, указывающее к какому району обслуживания он относится. В зависимости от этого поля мы будем возвращать Приватбанку информацию какому мерчанту перечислять финансы. Однако, если по какой-либо причине поле не установлено, можно в следующем правиле проверить его группу и ответить соответствующе.
Правила задаются как perl-код - здесь он чем-то похож на json, тем не менее можно ошибиться в синтаксисе и он вообще не будет запускаться. Поэтому после изменения проверяем его так:
<pre>
cd /usr/local/nodeny/ && perl -c modules/p24/p24.pl
</pre>
<pre>
modules/p24/p24.pl syntax OK
</pre>
Поскольку кейсов ответов может оказаться много, проверяйте ответ curl для разных клиентов:
<pre>
curl --request POST https://your.site/cgi-bin/p24.pl -d @- <<EOF
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transfer action="Search" interface="Debt" xmlns="http://debt.privatbank.ua/Transfer">
  <Data xsi:type="Payer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Unit name="bill_identifier" value="123"/>
    <Unit name="summ" value="200"/>
  </Data>
</Transfer>
EOF
</pre>
И не забывайте про логи logs/privat24_err.log и logs/privat24_ok.log

Поточна версія на 10:05, 22 грудня 2024

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

  • Если группа клиента 1 или 5 или 10, то распределить платеж между мерчантами М1, M2, M3 в соотношении 20%-30%-50%
  • Если группа иная, но установлено поле ФОП, то разпределить платеж между мерчантами M2 и M4 в соотношении 50%-50%
  • Если не ФОП и при этом группа 7, то все финансы перечислить на M5
  • Если не ФОП и при этом группа 8, то все финансы перечислить на M6
  • Всех остальных делить между M5 и M6 в соотношении 10%-90%

Задается это правилами в файле p24.pl:

rules => [
    {
        field_name  => 'grp',           # допполе (либо grp)
        field_value => [1, 2, 13],      # значения допполя (либо группы)
        params => [
            {
                percent     => 100,
                serviceCode => 10,
                CompanyCode => 12345,
                ServiceName => 'Доступ до мережі Інтернет',
            }
        ]
    },
    {
        field_name  => '_ip_tag',       # допполе (либо grp)
        field_value => ['nas21'],       # значения допполя (либо группы)
        params => [
            {                           # расщепление платежей
                percent     => 10,
                serviceCode => 10,
                CompanyCode => 12345,
                ServiceName => 'Доступ до мережі Інтернет',
            },{
                percent     => 20,
                serviceCode => 11,
                CompanyCode => 22222,
                ServiceName => 'Послуга техпідтримки',
            },{
                percent     => 70,
                serviceCode => 12,
                CompanyCode => 33333,
                ServiceName => 'Послуга відпочинку',
            }
        ],
    },
    {   # правило для всех остальных, кто не попал в предыдущие
        params => [
            {
                percent     => 100,
                serviceCode => 200,
                CompanyCode => 777777,
                ServiceName => 'Доступ до мережі Інтернет',
            }
        ]
    },
],


Правило - это блок {...} в котором находятся 3 параметра:

  • field_name (необязательное)
  • field_value (необязательное)
  • params (обязательное) - параметры ответа платежной системе

Когда модуль получает запрос от платежной системы, он проверяет правила сверху вниз, и если правило совпадает - модуль формирует ответ согласно этому правилу и прекращает их (правил) обработку. Таким образом вы можете запрограммировать такую логику: у клиента есть допполе, указывающее к какому району обслуживания он относится. В зависимости от этого поля мы будем возвращать Приватбанку информацию какому мерчанту перечислять финансы. Однако, если по какой-либо причине поле не установлено, можно в следующем правиле проверить его группу и ответить соответствующе.


Правила задаются как perl-код - здесь он чем-то похож на json, тем не менее можно ошибиться в синтаксисе и он вообще не будет запускаться. Поэтому после изменения проверяем его так:

cd /usr/local/nodeny/ && perl -c modules/p24/p24.pl 
modules/p24/p24.pl syntax OK


Поскольку кейсов ответов может оказаться много, проверяйте ответ curl для разных клиентов:

curl --request POST https://your.site/cgi-bin/p24.pl -d @- <<EOF
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transfer action="Search" interface="Debt" xmlns="http://debt.privatbank.ua/Transfer">
  <Data xsi:type="Payer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Unit name="bill_identifier" value="123"/>
    <Unit name="summ" value="200"/>
  </Data>
</Transfer>
EOF

И не забывайте про логи logs/privat24_err.log и logs/privat24_ok.log