Не приходит Callback на server_url

9 сообщений / 0 новое
Последняя публикация
SayKos
Не приходит Callback на server_url

Добрый день!

У меня возникла проблема с "server_url".
Не приходит Post запрос на указанный адрес. При этом процесс оплаты проходит успешно (sandbox ставил и 1, и 0 с минимальной суммой - деньги списались). После успешной операции я перехожу на указанный мной "return_url" - тут все ок.

Но на "server_url" Callback с данными по операции не приходит. Примечательно еще то, что утилита для теста Liqpay Callback отрабатывает отлично (запрос приходит и я могу достать из Post Data все параметры).
Что я мог упустить?

Заранее благодарю за помощь.

WT George
Аватар пользователя WT George
Он приходит, просто Вы его не

Он приходит, просто Вы его не можете поймать.

  1. Раньше в старом API Liq&Buy 1.2 ответ сервера в виде $_POST приходил вместе с пользователем, когда он нажимал кнопку 'Вернуться на сайт' после оплаты на сервере Ликпэя.
  2. Сейчас этот робот (несущий $_POST) приходит независимо от действий пользователя (на сервере ликпэя) сразу после оплаты (успешной или не успешной).

В этом существенная разница. Мы также тыкались Dash 1 с одним сайтом который использует шифрование https:// и у которого нет сертификата. При каждом открытии страницы выдавалось popup-сообщение-предупреждение об отсутствии сертификата. Так вот,

  1. в случае если пользователь (в браузере) (п.1) приносил этот $_POST, то само-сабой, он (пользователь) нажимал это предупреджение и ответ Ликрэя обрабатывался.
  2. Во втором случае, $_POST приходит сам Dirol (никого не спрашивая и по принципу пришел-отметился-ушел), и ничего (само собой ясно) не нажимает. Ну... и никаких результатов от его прихода не будет. Unknw
SayKos
Благодарю, но ...

Благодарю, но ...

Он приходит, просто Вы его не можете поймать.

Странно, но даже Fiddler говорит, что запрос не приходит.

Хотя, повторюсь, на callback-test выполняется отлично (запрос мне приходит, и я могу вычитать, например, signature. В Fiddler этот запрос также виден).

Я решил написать максимально простой проект (на ASP.Net MVC) для теста. Вот такой вот код:

Controller:

        private string public_key = "XXXXXXXXXXXX";
        private string private_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
 
        // Тут пытаюсь отловить Callback
        public string PurchaseResult()
        {
            string sign = Request["signature"];
            return "Ok";
        }
 
        // Форма с кнопкой LiqPay (она же и result_url для простоты)
        public ActionResult Index()
        {
            var amount = "20";
            var description = "Test description";
            var order_id = Guid.NewGuid();
            var result_url = "http://localhost:58004/Home/Index";
            var server_url = "http://localhost:58004/Home/PurchaseResult";
            var currency = "USD";
            var type = "buy";
 
            var signature = private_key + amount + currency + public_key + 
                order_id + type + description + result_url + server_url;
 
            ViewBag.public_key = public_key;
            ViewBag.amount = amount;
            ViewBag.currency = currency;
            ViewBag.type = type;
            ViewBag.description = description;
            ViewBag.order_id = order_id;
            ViewBag.result_url = result_url;
            ViewBag.server_url = server_url;
            ViewBag.signature = Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(signature)));
 
            return View();
        }
 

View:

        <form method="POST" accept-charset="utf-8" action="https://www.liqpay.com/api/pay">
            <input type="hidden" name="public_key" value="@ViewBag.public_key" />
            <input type="hidden" name="amount" value="@ViewBag.amount" />
            <input type="hidden" name="currency" value="@ViewBag.currency" />
            <input type="hidden" name="description" value="@ViewBag.description" />
            <input type="hidden" name="order_id" value="@ViewBag.order_id" />
            <input type="hidden" name="result_url" value="@ViewBag.result_url" />
            <input type="hidden" name="server_url" value="@ViewBag.server_url" />
            <input type="hidden" name="type" value="@ViewBag.type" />
            <input type="hidden" name="signature" value="@ViewBag.signature"/>
            <input type="hidden" name="language" value="ru" />
            <input type="hidden" name="sandbox" value="1" />
            <input type="hidden" name="pay_way" value="card,delayed" />
            <input type="image" src="//static.liqpay.com/buttons/p1ru.radius.png" />
        </form>
 

Заполненная форма на странице

        <form method="POST" accept-charset="utf-8" action="https://www.liqpay.com/api/pay">
            <input type="hidden" name="public_key" value="XXXXXXXXXXXX">
            <input type="hidden" name="amount" value="20">
            <input type="hidden" name="currency" value="USD">
            <input type="hidden" name="description" value="Test description">
            <input type="hidden" name="order_id" value="79e17721-79e1-491b-9645-62ceed454e37">
            <input type="hidden" name="result_url" value="http://localhost:58004/Home/Index">
            <input type="hidden" name="server_url" value="http://localhost:58004/Home/PurchaseResult">
            <input type="hidden" name="type" value="buy">
            <input type="hidden" name="signature" value="HF9exx0wvmnWnS1yWW/UWO3em4U=">
            <input type="hidden" name="language" value="ru">
            <input type="hidden" name="sandbox" value="1">
            <input type="hidden" name="pay_way" value="card,delayed">
            <input type="image" src="//static.liqpay.com/buttons/p1ru.radius.png">
        </form>
 

P.S. А может проблема в localhost?

WT George
Аватар пользователя WT George
Ну зачем так усложнять?

Ну зачем так усложнять? Scratch one-s head Просто в скрипте вызовите mail который маякнет вам, когда кто-то зайдет на эту страницу (будь то ответ Ликпэя или робот гугла или юзер).
Хотя... может быть действительно ваш хостер блокирует робот Ликпэя. Он у Вас случайно не российский? В России закрыли доступы к сайтам 'пожирателя младенцев'. Fool

WT George
Аватар пользователя WT George
Liqpay Callback test в общем

Liqpay Callback test в общем к вашей теме не имеет отношения. Эта утилита помогает организовать ваш скрипт-страницу, что принимает ответ Ликпэя. Т.е. на нем Вы вручную формируете-имитируете $_POST который и есть (типа) ответ Ликпэя.
А реально что ответ отсылается Вы можете проверить на Тестовый платеж LiqPay. Только

  1. перед оплатой укажите реальный E-mail
  2. после оплаты, даже не уходя с Ликпэя, проверьте почту

Вам придет ответ, который формирует скрипт что я привел в примере здесь. Он отсылает <?php mail(); ?> и админу и клиенту.

SayKos
Забыл отписаться.

Забыл отписаться.

P.S. А может проблема в localhost?

Да, очевидно, что проблема была именно в этом. Как же мне придет запрос от вас на мой локальный сайт!? Smile
Я с вебом только знакомлюсь, потому сразу и не подумал об этом.
Спасибо!

WT George
Аватар пользователя WT George
Так это вы про сайт на

Так это вы про сайт на винчестере говорили? А я и не понял сразу. Unknw Ну конечно на 127.0.0.1 никакие ответы приходить не будут.
Да откройте тэстовый хостинг и тэстируйте в сети. Good

WT George
Аватар пользователя WT George
<?php

<?php
$return_url 
'http://example.com/liqpay-4.php';     //страница на которую вернется клиент
$server_url 'http://example.com/liqpay-responce.php'//страница на которую придет ответ от сервера
?>

Попробуйте потестировать. В liqpay-responce.php напишите.


<?php
mail
('SayKos@example.com''subject''ответ без условий');
if (!empty(
$_POST)) {
    
mail('SayKos@example.com''subject''yes_POST');
} elseif (empty(
$_POST)) {
    
mail('SayKos@example.com''subject''no_POST');
}
?>

http://php.net/manual/ru/function.mail.php

WT George
Аватар пользователя WT George
Ну а далее можете усложнять.

Ну а далее можете усложнять. Я приведу пример кода, что мы используем, с учетом префикса языка, поскольку у нас мультиязычный сайт.
Служебные данные Ликпэя массива $_POST приходят в $_POST['transaction_id'], $_POST['description'], $_POST['amount'], $_POST['currency'], $_POST['type'], $_POST['sender_phone'].
Мы отсылаем данные себе (админу магазина) и клиенту, но... Ликпэй не требует у плательщика маил (только телефон). Поэтому, маил плательщика мы предварительно требуем у него перед оплатой (чтоб потом отослать ему данные о статусе его пратежа).
На днях постараемся это расписать.


<?php
$lang 
'ru'//temporarily

$pay_status = array(
            
'success' => array(
                            
'en' => 'success',
                            
'uk' => 'успішний',
                            
'ru' => 'успешный'
                            
),
            
'failure' => array(
                            
'en' => 'failure',
                            
'uk' => 'помилка',
                            
'ru' => 'ошибка'
                            
),
            
'wait_secure' => array(
                            
'en' => 'wait_secure',
                            
'uk' => 'на перевірці',
                            
'ru' => 'на проверке'
                            
),
            
'sandbox' => array(
                            
'en' => 'test',
                            
'uk' => 'тестовий',
                            
'ru' => 'тестовый'
                            
)
                );

$subject "LiqPay payment (" $_POST['status'] . ")";
$mail_from 'site@example.com';
$mail_to_admin 'SayKos@example.com'//sto1k@yandex.com
# To send HTML mail, the Content-type header must be set
    
$headers  'MIME-Version: 1.0' "\r\n";
    
//$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; //HTML-format
    
$headers .= 'Content-type: text/plain; charset=UTF-8' "\r\n"//TEXT-format
    //$headers .= 'Content-type: text\plain; charset=UTF-8' . "\r\n";
# Additional headers
    //$headers .= 'To: ' . $mail_to_admin . "\r\n";
    
$headers .= 'From: ' $mail_from "\r\n";
    
$headers .= 'Return-Path: '$mail_from "\r\n";
    
//$headers .= 'Subject: '.$subject. "\r\n";
//echo $headers;
$headers .= 'Subject: ' $subject"\r\n";
//$message_mail=implode(", ", $_POST); //echo "$message_mail";


/**
* Массив переводов (для мультиязычного сайта) для текста письма
*/
$text_mail_payment_status = array('en'=>'Payment status','uk'=>'Стан платежу','ru'=>'Состояние платежа');
$text_mail_payment_IDpayment = array('en'=>'ID payment in system','uk'=>'ID платежу в системі','ru'=>'ID платежа в системе');
$text_mail_payment_description = array('en'=>'Payment purpose','uk'=>'Призначення платежу','ru'=>'Назначение платежа');
$text_mail_payment_type = array('en'=>'Payment type','uk'=>'Тип платежу','ru'=>'Тип платежа');
$text_mail_payment_amount = array('en'=>'Payment amount','uk'=>'Сума платежу','ru'=>'Сумма платежа');
$text_mail_payment_email = array('en'=>'E-mail payer','uk'=>'E-mail платника','ru'=>'E-mail плательщика');
$text_mail_payment_phone = array('en'=>'Phone payer','uk'=>'Телефон платника','ru'=>'Телефон плательщика');
$text_mail_payment_PS_wait_secure = array( //текст письма клиенту, в случае статуса 'wait_secure'
                                
'en'=>"Dear customer.
This is an international payment. Our payment system uses payment verification to protect against unauthorized transfers (breakups) payment cards. 
Your payment has the status '" 
$_POST['status'] . "' (" $pay_status[$_POST['status']][$lang] . "). Your card will be charged the funds and they will be accepted by our bank, but payment will be frozen and put to test (5 days). In this case, your bank (from our) will be sent a request for confirmation of your payment (in this case you are not required to do anything). 
• If the response (from your bank) in the 5-day period does not come, the funds will be returned to you. 
• If a positive response will your bank, the payment will be credited to our account. "
,
                                
'uk'=>"Шановний клієнт.
Даний платіж є міжнародним. Наша платіжна система, для захисту від несанкціонованих перекладів (зломів) платіжних карт платників, використовує верифікацію платежу. 
Ваш платіж має статус '" 
$_POST['status'] . "' (" $pay_status[$_POST['status']][$lang] . "). З вашої картки будуть зняті кошти, і вони будуть прийняті нашим банком, але, платіж буде заморожений і поставлений на перевірку (5 днів). При цьому, в ваш банк (від нашого), буде висланий запит про підтвердження вашого платежу (при цьому від вас не потрібно ніяких дій).
• Якщо відповіді (від вашого банку) в 5-денний термін, не прийде, грошові кошти будуть вам повернені. 
• Якщо прийде позитивну відповідь вашого банку, платіж буде зарахований на наш рахунок."
,
                                
'ru'=>"Уважаемый клиент.
Данный платеж является международным. Наша платежная система, для защиты от несанкционированных переводов (взломов) пл./карт плательщиков, использует верификацию платежа.
Ваш платеж имеет статус '" 
$_POST['status'] . "' (" $pay_status[$_POST['status']][$lang] . "). С вашей карты будут сняты средства, и они будут приняты нашим банком, но, платеж будет заморожен и поставлен на проверку (5 дней). При этом, в ваш банк (от нашего), будет выслан запрос о подтверждении вашего платежа (при этом от вас не требуется никаких действий).
• Если ответа (от вашего банка) в 5-дневный срок, не придет, ден./средства будут вам возвращены.
• Если придет положительный ответ вашего банка, платеж будет зачислен на наш счет."
                            
);

$message_mail "\r\n"
        
$text_mail_payment_status[$lang] . ": " $_POST['status'] . " (" $pay_status[$_POST['status']][$lang] . ")" //Состояние платежа
        
"\r\n" $text_mail_payment_IDpayment[$lang] . ": " $_POST['transaction_id']
        . 
"\r\n" $text_mail_payment_description[$lang] . ": " $_POST['description']
        . 
"\r\n" $text_mail_payment_amount[$lang] . ": " $_POST['amount'] . " " $_POST['currency']
        . 
"\r\n" $text_mail_payment_type[$lang] . ": " $_POST['type']
        
//. "\r\n" . $text_mail_payment_email[$lang] . ": " . $mail_to_client
        
"\r\n" $text_mail_payment_phone[$lang] . ": +" $_POST['sender_phone']
        ;
        if (
$_POST['status'] == 'wait_secure') { // предупреждение о проверке платежа, в случае статуса 'wait_secure'
            
$message_mail .= "\r\n\r\n" $text_mail_payment_PS_wait_secure[$lang];
        }

//mail($mail_to_client, $subject, $message_mail, $headers); //маил плательщику
mail($mail_to_admin$subject$message_mail$headers); //админу магазина
?>
Тема заблокирована