Версия, подходяща за принтиране
Кликни тук, за да видиш темата в оригиналният и вид
BG Development Форуми > PHP/Perl/Python/ASP > ePay интеграция


Публикувано от: index_master 19-01-2021, 21:49
Здравейте колеги,

налага ми се да направя интеграция на epay(dot)bg към един сайт който сега правя. Всичко хубаво, имат си някаква https://www.epay.bg/v3main/img/front/tech_wire.pdf обаче... нали когато се подготви някаква заявка трябва да ме пренасочи към demo.epay.bg и там да се логна с потребителя който съм създал за демо целта...да ама не :/ аз ли бъркам някъде или не става по този начин. Подготвям си checksum, encoded параметрите и после "Няма достъп до този сайт".

Дали трябва да направя истински профил и с него да си правя опити с плащания от по 1 ст. или има някаква друга врътка?

Публикувано от: akolevutd 20-01-2021, 09:46
Здравей, преди около година/две правих интеграция с ePay и не я помня на 100%, но си е дърво голямо. За тестове ти е достатъчна регистрация (като търговец и клиент) само в demo.epay.bg Бъркаш някъде параметрите, които генерираш/подаваш към ePay.

Публикувано от: index_master 20-01-2021, 22:12
Ами да прав беше. Имах грешка, че съм сложил хем min и mail параметъра. Промених и адреса на заявката да минава през https и стана пренасочва ме към демо версията

CODE

function hmac($algo,$data,$passwd){
                                                      /* md5 and sha1 only */
                                                      $algo=strtolower($algo);
                                                      $p=array('md5'=>'H32','sha1'=>'H40');
                                                      if(strlen($passwd)>64) $passwd=pack($p[$algo],$algo($passwd));
                                                      if(strlen($passwd)<64) $passwd=str_pad($passwd,64,chr(0));

                                                      $ipad=substr($passwd,0,64) ^ str_repeat(chr(0x36),64);
                                                      $opad=substr($passwd,0,64) ^ str_repeat(chr(0x5C),64);

                                                      return($algo($opad.pack($p[$algo],$algo($ipad.$data))));
                                          }
                                          

                                          $secret     = '64 cifren kod';
                                          $min        = '.....';
                                          $invoice    = substr(number_format(time() * rand(), 0, '', ''), 0, 10); # XXX Invoice
                                          $sum        = '1000';                            # XXX Ammount
                                          $exp_date   = '01.08.2021';                       # XXX Expiration date
                                          $descr      = 'Test';                             # XXX Description
                                          $mail = "*****@*****";

                                          $data = <<<DATA
MIN={$min}
INVOICE={$invoice}
AMOUNT={$sum}
EXP_TIME={$exp_date}
DESCR={$descr}
DATA;

                                                $ENCODED  = base64_encode($data);
                                                $CHECKSUM = hmac('sha1', $ENCODED, $secret); # XXX SHA-1 algorithm REQUIRE
                                          
                                          
                                           ?>
                                           <input type="button" id="paylogin" value="plashtane">
                                          
                                          
                                           <form action="https://demo.epay.bg/" method="post">
                                                 <input type=hidden name=PAGE value="paylogin">
                                                 <input type=hidden name=ENCODED value="<?=$ENCODED; ?>">
                                                 <input type=hidden name=CHECKSUM value="<?=$CHECKSUM; ?>">
                                                 <input type=hidden name=URL_OK value="http://...">
                                                 <input type=hidden name=URL_CANCEL value="http://...">
                                                 <input type=submit>
                                          </form>

Публикувано от: wqw 22-01-2021, 11:42
Btw, има си вградена https://www.php.net/manual/en/function.hash-hmac.php която би трябвало да работи със 'sha1' което ползваш.

И то като махнеш hmac функцията от този код остава едно нищо бих казал :-))

cheers,
</wqw>

Публикувано от: index_master 22-01-2021, 23:42
да така е icon_smile.gif а някой има ли си представа защо при пръщане в сайт $_POST e празен и не мога да подпиша плащането...

Публикувано от: thrawn 23-01-2021, 07:46
В кодът който си дал никъде не използваш $_POST, нито показваш изпращане на данни към сайтът ти.


Публикувано от: wqw 23-01-2021, 09:43
Пробвай да потърсиш в google за това: site:bgdev.org demo.epay.bg

cheers,
</wqw>

Публикувано от: akolevutd 24-01-2021, 12:51
Плащането се 'подписва' чрез Webhook и по спомен ePay пращат стринг (вместо стандартен JSON или XML), който го парсваш с Regex след като валидираш хеша.

Публикувано от: index_master 25-01-2021, 19:08
Добре, но нали след като се направи плащането и ме препрати към 'URL_OK" тогава имам
CODE

$ENCODED  = $_POST['encoded'];
$CHECKSUM = $_POST['checksum'];

# XXX Secret word with which merchant make CHECKSUM on the ENCODED packet
$secret = 'кода';
$hmac   = hmac('sha1', $ENCODED, $secret); # XXX SHA-1 algorithm REQUIRED

if ($hmac == $CHECKSUM) { # XXX Check if the received CHECKSUM is OK
   
   $data = base64_decode($ENCODED);
   $lines_arr = split("\n", $data);
   $info_data = '';
   
   foreach ($lines_arr as $line) {
       if (preg_match("/^INVOICE=(\d+):STATUS=(PAID|DENIED|EXPIRED)(:PAY_TIME=(\d+):STAN=(\d+):BCODE=([0-9a-zA-Z]+))?$/", $line, $regs)) {
..........................


Ей тук тези $_POST са ми празни и съответно нищо не става...чувствам се като човек за 1ви път използващ технологии

https://ibb.co/CV6qrsT
https://imgbb.com/ това има ли нещо общо?

Публикувано от: akolevutd 26-01-2021, 09:15
Никога при Payments не разчитай на URL_OK, нямаш гаранция потребителя след като си плати къде ще отиде. За тази цел хората са измислили Webhook, IPN и т.н.

Публикувано от: thrawn 26-01-2021, 09:27
Прочети я тая документация де.
URL_OK и URL_CANCEL не са callback (webhook) адреси на които се получава потвърждение за плащане. Това са просто адреси, част от UI-а на които се препраща потребителя след като потвърди, че ЩЕ плаща или след като откаже да плати.
С други думи, както си пише и в документацията препращането на потребителя на URL_OK НЕ ГАРАНТИРА че е извършено плащане.

Трябва да имаш друг адрес на който ще получаваш обратните извиквания за статус на плащането на който вече ще имаш достъп и до съответната информация.

Публикувано от: index_master 26-01-2021, 12:35
QUOTE (thrawn @ 26-01-2021, 09:27)
Прочети я тая документация де.
URL_OK и URL_CANCEL не са callback (webhook) адреси на които се получава потвърждение за плащане. Това са просто адреси, част от UI-а на които се препраща потребителя след като потвърди, че ЩЕ плаща или след като откаже да плати.
С други думи, както си пише и в документацията препращането на потребителя на URL_OK НЕ ГАРАНТИРА че е извършено плащане.

Трябва да имаш друг адрес на който ще получаваш обратните извиквания за статус на плащането на който вече ще имаш достъп и до съответната информация.

Добре де, това го разбрах. Въпроса ми този код, който е за подписването
CODE

<?php
function hmac($algo,$data,$passwd){
       /* md5 and sha1 only */
       $algo=strtolower($algo);
       $p=array('md5'=>'H32','sha1'=>'H40');
       if(strlen($passwd)>64) $passwd=pack($p[$algo],$algo($passwd));
       if(strlen($passwd)<64) $passwd=str_pad($passwd,64,chr(0));

       $ipad=substr($passwd,0,64) ^ str_repeat(chr(0x36),64);
       $opad=substr($passwd,0,64) ^ str_repeat(chr(0x5C),64);

       return($algo($opad.pack($p[$algo],$algo($ipad.$data))));
}

$ENCODED  = $_POST['encoded'];
$CHECKSUM = $_POST['checksum'];

# XXX Secret word with which merchant make CHECKSUM on the ENCODED packet
$secret = '**************';
$hmac   = hmac('sha1', $ENCODED, $secret); # XXX SHA-1 algorithm REQUIRED

if ($hmac == $CHECKSUM) { # XXX Check if the received CHECKSUM is OK
   
   $data = base64_decode($ENCODED);
   $lines_arr = split("\n", $data);
   $info_data = '';
   
   foreach ($lines_arr as $line) {
       if (preg_match("/^INVOICE=(\d+):STATUS=(PAID|DENIED|EXPIRED)(:PAY_TIME=(\d+):STAN=(\d+):BCODE=([0-9a-zA-Z]+))?$/", $line, $regs)) {
           $invoice  = $regs[1];
           $status   = $regs[2];
           $pay_date = $regs[4]; # XXX if PAID
           $stan     = $regs[5]; # XXX if PAID
           $bcode    = $regs[6]; # XXX if PAID

           # XXX process $invoice, $status, $pay_date, $stan, $bcode here

           # XXX if OK for this invoice
           $info_data .= "INVOICE=$invoice:STATUS=OK\n";

           # XXX if error for this invoice
           # XXX $info_data .= "INVOICE=$invoice:STATUS=ERR\n";

           # XXX if not recognise this invoice
           # XXX $info_data .= "INVOICE=$invoice:STATUS=NO\n";
       }
   }

   echo $info_data, "\n";
}
else {
   echo "ERR=Not valid CHECKSUM\n"; # XXX The description of error is REQUIRED
      var_dump($_POST);
}

Дори това да го слажа в отделен файл(извикан чрез include, отворен ръчно), пак нищо не става, или аз бъркам цялата концепция на нещата. Този webhook как въобще да го хвана и да го прочета?
Пробвам с
CODE
echo file_get_contents("php://input");
- пак нищо няма

Нали идеята е когато ме върне от сайта на epay, това е все едно POST заявка, чиито данни се намират в $_POST глобалната променлива? Извинявам се за невежеството си...

Публикувано от: thrawn 26-01-2021, 14:07
Нещо ти се губят основни моменти от схемата.

Първо, това няма нищо общо с подписване. Това е генериране на хеш сума, защитена с парола. Като цяло, идеята на тая операция е да се провери дали пакетът не е променен по пътя от epay.bg до теб. До колко това е удачно решение (не е!!!) е съвсем друга тема.

Значи, процедурата по плащане е в две фази.
В първата фаза (при която имаш контрол) клиентът си избира стока, ти подготвяш данните за плащане и препращаш клиентът на сайта на epay.bg, от където той се връща пак при теб или на адрес URL_OK или на URL_CANCEL (в зависимост от това какви ги е свършил в epay.bg).

Втората фаза е РЕАЛНОТО ПЛАЩАНЕ. То може да се случи в произволен момент във времето а може и изобщо да не се случи. Тук нямаш никакъв контрол. Когато има събитие в тая фаза (клиентът плати, откаже да плати или заявката експиряса) epay.bg използват callback адресът (webhook е модерния лаф) за да те нотифицират за събитието, като там вече ти изпращат данните за които питаш.
Когато получиш тия данни и статусът там е, че заявката е платена, това е "гаранция" че стоката е платена и можеш да я пращаш на получателя. При всяко положение обаче, трябва да отговориш на тая заявка (с какво, пише в документацията). Ако пропуснеш да отговориш (сървърът ти е offline да речем) epay.bg ще пробват да ти изпратят данните отново (кога, пише пак в документацията.).

Реално, отговор на твоя въпрос не виждам там. Никъде няма смислена информация как се посочва callback адресът (може би, като си влезеш в акаунтът има опции за настройка).
Също така, можеш да работиш и без да обработваш callback нотификации. Просто трябва периодично да проверяваш в сайтът на epay.bg какъв е статусът на заявката за плащане.

Публикувано от: index_master 26-01-2021, 17:17
Така обяснено има логика. Аз виждам, че това не е кода за подписването, по-скоро някаква информация за статуса на заявката. Според мен след като ме препратят към моя сайт, трябва да има някаква инфорамция, някъде.

В демото има едно "Известия за WEB плащания"=>"URL за известяване", което съм посочил към ето този код, който е по-горе и нищо.
Въвел съм го като "https://domain.com/recv.php"
Пробвах този код да го сложа и в "URL_OK", с проверка
CODE
if($_POST){....
- нищо не става. Би трябвало това е callback адреса. Другото кеото ми прави впечатление, е че в самият сайт като преминавам през плащането в една от страниците статуса се променя от 200(OK) на 302(FOUND), и като се върне при мен пак е 200. След няколко рефреша 'recv.php' пак няма нищо - обичайното съобщение=ERR=Not valid CHECKSUM

Публикувано от: thrawn 26-01-2021, 19:07
URL_OK и URL_CANCEL не би трябвало да съдържат никакви данни (освен тези които сам си поставил там). Това се потвърждава и от това, че препращане е с код 302 (301/302 не предполагат препращане на данни. Ако имаше нещо подобно щеяха да ползват 307/308).

Кодът за обработка трябва да е именно в "Известия за WEB плащания" като извикването е без нотификация към потребител. Демек, това е заявка която се пуска от машина (сървърът на epay) и отговорът се о работа пак от нея.
Няма как ти ръчно да пуснеш заявка до този адрес с коректни данни.

Публикувано от: relax4o 26-01-2021, 19:41
Само не ни казвай, че тестваш от локалната машина и караш epay да достъпи невалиден адрес?

Колкото до това:
QUOTE

След няколко рефреша 'recv.php' пак няма нищо - обичайното съобщение=ERR=Not valid CHECKSUM


Това не е нещо, което ти трябва да достъпваш. На теб естествено, че винаги ще ти дава грешка.
Този адрес (webhook) ще бъде достъпен от epay след като заявката бъде обработена. Следователно ти нямаш идея дали epay се опитва да те извести, освен ако не провериш apache логовете.

В акаунта в epay имаш ли история, където да следиш какво се е случило със заявката?

Публикувано от: index_master 26-01-2021, 20:47
Не, всички файлове се намират на хостинг. Ами има лог в сайта на epay = всичко е наред там (имам предвид статус е DONE на всички платени поръчки).

Добре де, май се въртя в кръг. Реално плащането е минало, epay праща уж някаква информация на този webhook щом статуса е DONE, така ли? Освен от демо версията да мина на платената и да правя някакви тестове дори с минимално заплащане.

Публикувано от: relax4o 27-01-2021, 00:36
Ами натам отиват нещата. Ти просто не си разбрал цялостната идея как това чудо работи.

По принцип това не ти е нужно (според документацията). Идеята на тази нотификация според мен е просто да я обработиш по някакъв начин в твоя апп. Можеш да записваш invoices и да я направиш цялата информация по-лесно достъпна за този, който управлява системата.

QUOTE

If the merchant has not announced URL, at which he can receive notifications about the payments, does
not want or does not have the possibility to process these notifications, the merchant can see the status of
his payment orders in the ePay.bg system.


QUOTE

Ако търговецът не е заявил URL, на което да получава известия за статуса на извършените към него
плащания или няма възможност да обработва тези известия, той може да следи статуса на
изпратените от него искания за плащане, в своя потребителски профил в ePay.bg.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)