Алекс
Registered
Здравейте!
Опитвам се да създам система, която да генерира код за плащане на каса в EasyPay. Писах си със съпорта, но те не могат да ми помогнат до толкова, колкото искам аз, тъй като на всеки въпрос ми изпращат някакви предварително изготвени (отговори) шаблони. Ето какво ми изпратиха като документация
Някой да даде някаква насока? Нямам точен проблем, за сега съм стигнал до тук (Laravel), но генерално нищо не разбирам от документацията им:
Благодаря предварително!
Опитвам се да създам система, която да генерира код за плащане на каса в EasyPay. Писах си със съпорта, но те не могат да ми помогнат до толкова, колкото искам аз, тъй като на всеки въпрос ми изпращат някакви предварително изготвени (отговори) шаблони. Ето какво ми изпратиха като документация
Код:
ePay.bg комуникационен пакет за търговци
ePay.bg <office@epay.bg>, <epay2_demo@epay.bg>
______________________________________________________________________
V. Подаване на задължение за плащане през Easypay от WEB търговец
______________________________________________________________________
Схема:
1. Клиент на WEB търговец прави поръчка в електронния му магазин
2. След като е готов с поръчката, клиентът формира искане да плати в
офис на Easypay
3. Търговецът изготвя пакет /заявка за плащане/, който изпраща към
дадено URL като HTTP GET заявка скрито от клиента. В същата HTTP
сесия, ако всичко със заявката е коректно, ePay.bg ще върне на
търговеца "Код за плащане в Easypay". Търговецът показва на своя
сайт този код, с който клиента да отиде в офис на Easypay и да
извърши плащането
4. ePay.bg системата следи за статуса на регистрираните/записаните
чакащи задължения и при плащане, отказване или изтичане се изпраща
известие на търговеца за тях
5. При получаване на известие от ePay.bg, търговецът трябва да формира
съответен отговор
Търговец --[ЗАЯВКА ЗА ПЛАЩАНЕ]--> ePay.bg
ePay.bg --[КОД ЗА ПЛАЩАНЕ]--> Търговец
Клиент --[ПЛАЩАНЕ]--> Easypay
ePay.bg --[ИЗВЕСТИЕ]--> Търговец
Търговец --[ОТГОВОР НА ИЗВЕСТИЕ]--> ePay.bg
Всеки регистриран в системата търговец има генерирани буквено-цифрена
секретна дума с дължина 64 и идентификационен номер (КИН). Търговецът
може да ги види в личните си данни без да може да ги променя.
A. Заявката за плащане се изпраща като HTTP GET заявка към
https://www.epay.bg/ezp/reg_bill.cgi * за тестове:
https://demo.epay.bg/ezp/reg_bill.cgi
Подавани параметри:
ENCODED - кодирана с base64 (RFC 3548) заявка за плащане, EOL=''
CHECKSUM - контролна сума върху ENCODED, генерирана като HMAC с
алгоритъм SHA-1 и секретната дума на търговеца.
Perl примерен код: {
# Кодиране на заявката
$ENCODED = encode_base64('DATA', ''); # '' за EOL (def. е "\n")
# Генериране на контролна сума
$CHECKSUM = hmac_hex($ENCODED, $secret, \&sha1);
}
PHP примерен код: {
# Кодиране на заявката
$ENCODED = base64_encode('DATA');
# Генериране на контролна сума
$CHECKSUM = hmac('sha1', $ENCODED, $secret);
# кода на функцията hmac може да видите в demo.php
}
Примерна заявка:
MIN=1000000000 (зад. MIN или EMAIL Идентификационен номер на търговеца)
EMAIL=a@merch.bg (зад. MIN или EMAIL E-mail на търговеца в системата)
INVOICE=123456 (задължително Номер фактура)
AMOUNT=22.80 (задължително Сума)
EXP_TIME=01.08.2020 (задължително Крайна дата/час за плащане)
DESCR=Test (опционално Описание до 100 символа)
Не е задължитено да са подредени точно в този ред.
MIN - съответсва на КИН в личните данни на търговеца
EMAIL - e-mail на търговеца, с който той е регистриран
(*) в заявката се подава MIN или EMAIL за идентифициране на търговеца
INVOICE - само цифри
AMOUNT - валидна сума > 0.01 ( например: 22, 22.8, 22.80 )
За полето EXP_TIME е валиден следния формат:
EXP_TIME=DD.MM.YYYY[ hh:mm[:ss]]
EXP_TIME=01.08.2020
EXP_TIME=01.08.2020 23:15 (може да се подаде и с час:мин)
EXP_TIME=01.08.2020 23:15:30 (може да се подаде и с час:мин:сек)
Примерен отговор на заявка:
IDN=1234567890 (Код за плащане - десет цифри)
или
ERR=Описание на грешка
След като заявката за плащане е регистрирана, то системата ще извести
търговеца за състоянието на плащането: 'Платено', 'Отказано' или
'Изтекло'.Ако клиентът не потвърди или откаже искането преди подадената
крайна дата, то ще се маркира като изтекло.
Заявка с даден INVOICE може да влезе в системата ЕДИН единствен път.
* За имитиране извършване на плащане в офис на Easypay правите следната
HTTP GET заявка:
https://demo.epay.bg/ezp/pay_bill.cgi?ACTION=PAY&IDN=получения_код_за_плащане
B. Известието на системата се изпраща на зададено от търговеца URL като
HTTP POST заявка, на която търговеца връща отговор в същата HTTP сесия.
Подписване на известието за плащане
ENCODED - кодирано с base64 (RFC 3548) известие, EOL=''
CHECKSUM - контролна сума върху ENCODED, генерирана като HMAC с
алгоритъм SHA-1 и секретната дума на търговеца.
Perl примерен код: {
$data = decode_base64($ENCODED);
# Калкулиране на контролната сума
# Трябва $CHECKSUM_CALC == $CHECKSUM
$CHECKSUM_CALC = hmac_hex($ENCODED, $secret, \&sha1);
}
PHP примерен код: {
$data = base64_decode($ENCODED);
# Калкулиране на контролната сума
# Трябва $CHECKSUM_CALC == $CHECKSUM
$CHECKSUM_CALC = hmac('sha1', $ENCODED, $secret);
# кода на функцията hmac може да видите в demo.php
}
Примерно известие от ePay.bg:
INVOICE=123456:STATUS=PAID:PAY_TIME=YYYYMMDDhhmmss:STAN=[6 числа]:BCODE=[6 числа/букви]
INVOICE=123457:STATUS=DENIED
INVOICE=123457:STATUS=EXPIRED
STATUS=[PAID | DENIED | EXPIRED] - Платено | Отказано | Изтекло
PAY_TIME - Дата/час/сек на плащането
STAN - Номер транзакция
BCODE - Авторизационен код на БОРИКА
STAN и BCODE ще са 000000, ако плащането не е извършено от карта
За всеки номер на фактура в известието, търговеца трябва да върне
статус: OK (ако всичко е наред), ERR (за грешка) или NO (ако не знае за
тази фактура). При връщане на OK или NO системета спира да изпраща
известие за съответната фактура.
Примерен отговор на търговеца:
INVOICE=123456:STATUS=OK
INVOICE=123457:STATUS=ERR
INVOICE=123458:STATUS=NO
Ако нещо не е коректно в известието изпратено от ePay.bg системата
търговецът връща ERR=описание.
Пример:
ERR=описание за глобалната грешка (примерно невярна CHECKSUM)
Ако търговецът не е заявил URL, на което да получава известия за
плащанията, не иска или няма възможност да обработва тези известия, то
търговецът може да си вижда статуса на исканията за плащане в ePay.bg
системата.
Ако ePay.bg не маркира дадена фактура като получена от търговеца
(примерно върнат статус ERR или пропаднала комуникация) системата ще се
опита да изпрати пропадналите известия отново.
Схема за изпращане на известия по дадена фактура:
1) 5 опита през < 1 минута
2) 4 опита през 15 минути
3) 5 опита през 1 час
4) 6 опита през 3 часа
5) 4 опита през 6 часа
6) 1 опит на ден
Системата спира да изпраща известие за дадена фактура, ако то не бъде
получено от търговеца в продължение на 30 дена.
______________________________________________________________________
КРАЙ
Някой да даде някаква насока? Нямам точен проблем, за сега съм стигнал до тук (Laravel), но генерално нищо не разбирам от документацията им:
Код:
$secret_seller = 'TUK SE POSTAVQ ID NA TURGOVECA';
$data = base64_encode('MIN=1000000000&INVOICE=123456&AMOUNT=19.99&EXP_TIME=' . now()->addHours(24)->format("d.m.Y H:i:s") . '&DESCR=description&MERCHANT=' . config("app.name") . '&IBAN=BGFIVN943&BIC=BIC391&PSTATEMENT=34342&STATEMENT=buy cr&OBLIG_PERSON=' . auth()->user()->name . '&EGN=' . auth()->user()->egn . '&DOC_NO=340294985&DATE_BEGIN=21.03.2020&DATE_END=21.03.2030');
$response = Http::get('https://demo.epay.bg/ezp/reg_bill.cgi?ENCODED=' . $data);
dd('https://demo.epay.bg/ezp/reg_bill.cgi?ENCODED=' . $data, $response);
Благодаря предварително!