Callback для liqpay

126
17 декабря 2020, 01:30

Пытаюсь работать с платёжной системой liqpay, в апи настраиваются два url: result_url и server_url. Первый отправляет пользователя на эту страницу, если он перейдёт по ссылке "вернуться на сайт" после оплаты, второй url обрабатывает данные, если пользователь после оплаты решил не переходить назад на сайт.
С сервера liqpay ответ возвращается в $_POST.
Создал такой callback:

add_action('the_content', function($content){
    if(is_page('checkout')) { //проверим чтобы код не срабатывал на всех страницах
        if (isset($_POST['data'])) {
            $result = json_decode(base64_decode($_POST['data']));
            // данные вернуться в base64 формат JSON
            if ($result->status == 'success') {
                ob_start();
                echo '<div class="test1"><pre>';
                var_export($result);
                echo '</pre></div>';
                $body = ob_get_clean();
                wp_mail('mail@gmail.com', 'from checkout', 'Какое-то сообщение checkout . body = ' . $body);
            }
        }
    }
    return $content;
});

Правильный ли я использую хук? И почему этот callback не срабатывает на хук init? the_content правильно принимает данные и обрабатывает $_POST

Answer 1

Код не работает на хуке init, потому что ещё рано. На этом этапе главный цикл WordPress не установлен. И хотя функция is_page() уже существует, но возвращает она всегда false.

Ваш код сможет работать, например, на хуке wp:

<?php
add_action(
    'wp',
    function () {
        if ( is_page( 'checkout' ) ) { // Проверим, чтобы код не срабатывал на всех страницах.
            if ( isset( $_POST['data'] ) ) {
                $result = json_decode( base64_decode( $_POST['data'] ) ); // Данные вернутся в base64 формат JSON.
                if ( 'success' === $result->status ) {
                    ob_start();
                    echo '<div class="test1"><pre>';
                    var_export( $result );
                    echo '</pre></div>';
                    $body = ob_get_clean();
                    wp_mail( 'mail@gmail.com', 'from checkout', 'Какое-то сообщение checkout . body = ' . $body );
                }
            }
        }
    }
);

Подробнее о порядке загрузки WordPress здесь.

Answer 2

Если надо обработать ответ на отдельной странице создайте её, подгрузите часть ядра например создаём странице для получения ответа request_liqpay.php

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
wp_mail(***);
// если нужен доступ к базе
global $wpdb;
$wpdb->insert/update/get_result и прочие действия
die();
Answer 3

Вот пару дней назад реализовал прослушку callback. Через функцию register_rest_route() регистрируем URL по которому будет срабатывать код для обработки callback. То есть не вздумайте создавать из админки пустые страницы.

Пример кода для проверки подлинности подписи (в файле который указали в параметре server_url):

if ( isset( $_POST['data'] ) ) {
  $data = $_POST['data']; 
} else {
  wp_die();
}
if ( isset( $_POST['signature'] ) ) {
  $signature = $_POST['signature'];
} else {
  wp_die();
}
$private_key = 'Ваш ключ';
//формируем нашу подпись
$my_signature = base64_encode( sha1(
  $private_key .
  $data .
  $private_key
  , 1 ));
if ( $my_signature === $signature ) {
  // делаем проверку на каждый статус ответа по платежу
} else {
  wp_die();
} 
READ ALSO
Алгоритм сохранения любого файла

Алгоритм сохранения любого файла

Мне нужно дать пользователю делиться абсолютно любым файлом, при этом при загрузке на сервер использовать минимум проверок

136
Возможна ли передача файла через websocket?

Возможна ли передача файла через websocket?

Использую Ratchet php, я пытался считать файл по байтам и отправить их, но что-то не очень это ворк, есть ли другие способы ?

128
Составление Mysql запроса

Составление Mysql запроса

Как можно перенести определенные(поле статус которых 1) записи из 2ой таблицы в первую и при этом вставить в 1 дополнительные значения, которых...

112