@doctor__23

Как обработать POST запрос от платежной системы в WordPress?

Я создаю сайт на WordPress без WooCommerce, понадобилось подключить платежи на сайте. Клиентом была выбрана платежная система

ссылка удалена модератором.

Платежи принимаются на стороне самой платежной сисетмы, с помощью API продамуса, формируется ссылка на оплату и возвращается мне на фронт (обработчик для формирования ссылки я написал) и уже на JS я делаю редирект на эту ссылку, после успешной оплаты пользователя редиректит обратно на сайт, а дальше мне нужно, чтобы пользователю после успешной оплаты была выслана ссылка с доступом на обучающую платформу и далее он попал в CRM, то есть еще 2 ajax запроса.

Сначала я не подумал, что платежка может отдавать ответ мне на сервер и сделал очень костыльно:
Записывал на фронте перед формированием ссылки нужные данные в localStorage, а потом после успешной оплаты и редиректа на сайт проверял localStorage, брал оттуда данные и отправлял ajax запросы. Но это не очень удачное решение, так как, если у пользователя медленный интернет - это будет долго и пользователь решить перезагрузить страницу, то скрипты фронта и бека просо не отработают.

Поэтому я решил написать обработчик ответа от платежки (в любом случае это нужно, так как платежку нужно уведомить, что я получил её запрос и дать ей ответ 200). Я создал в коне сайта файл receive.php, написал там код и дальше почти ничего не работает. Вот код:

require './wp-load.php';


$file = __DIR__ . '/wp-content/themes/my_theme/inc/test/prod.log';
$fileOpen = fopen($file, 'a');
fwrite($fileOpen, "Начинаем в ".date('d.m.Y H:i',time())."\n");

$post_arr = null;
if (isset($_POST['_param_product_inf'])) $prod_arr =  var_export($_POST['_param_product_inf'], true);

$headers = array(
	'From: ТЕСТ <no-reply@test.ru>',
	'Content-type: text/html; charset=utf-8',
);

$message = 'какое-то сообщение';

if (!is_null($post_arr)) {
	$crm_send = my_theme_crm_send($post_arr);
	fwrite($fileOpen, 'отправлено в ЦРМ: ' . $crm_send);
} else {
	$is_sended = wp_mail('test@test.ru', 'тест продамус', $message, $headers) ? 'sended' : 'not sended';
	fwrite($fileOpen, 'отправлено в ЦРМ: ' . $is_sended);
}


$_POST у меня приходит, он не пустой, все отлично. Беру из $_POST нужный мне массив, проверив, есть ли он там, кладу его в переменную $prod_arr и записываю её в файл лога, если она не null, перед этим вызвав функцию отправки в CRM и передав в нее этот же массив. В файл лога массив записывается, а функция ничего не возвращает (хотя она работает, протестирована). Код функции:

add_action('wp_ajax_crm_send', 'my_site_crm_send');
add_action('wp_ajax_nopriv_crm_send', 'my_site_crm_send');

function my_site_crm_send($array = null)
{
    if (is_null($array)) {
       // объявляем нужные переменные, если $array === null, данные для переменных берем из $_POST
   else {
     // объявляем переменные и берем данные из $array
   }

  // рабочий код, который возвращаем массив $response

    if (is_null($array)) {
       // если $array === null, значит это ajax запрос и мы убиваем функцию в конце
        $response = json_encode($response);
        die($response);
    } else {
       // если $array !== null, значит это вызов из receive.php и нужно вернуть $response
        return $response;
    }
}


При чем, ни my_site_crm_send(), ни wp_mail() в receive.php не отрабатывают, wp_mail() возвращает false, my_site_crm_send() возвращает undefined.

Еще сразу скажу, что wp_mail отправляет на реальную почту и в заголовках прописана реальная почта - это здесь для примеров test. :)

Еще пару пояснений my_site_crm_send зацеплена на wp_ajax, потому что на нее падают ajax запросы без оплаты (то есть просто форма обратной связи, например), поэтому там переменные определяются по разному из $_POST или из массива, переданного из receive.php, соотвественно, и в конце, либо die(), либо return.

2 главных вопроса:
1. Как заставить работать, то что продемонстрировал выше.

2. Можно зацепить функцию, например my_func(), к wp_post или wp_ajax, указать для отправки ответа от платежка url - https://my-site.ru/wp-admin/admin-post?action=my_func, получать ответ в эту функцию, которая будет внутри папки с темой и уже там обрабатывать все?
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
$post_arr = null;
if (isset($_POST['_param_product_inf'])) $prod_arr =  var_export($_POST['_param_product_inf'], true);

Я вижу, как Вы пишете в $prod_arr строковое представление массива ( в $_POST['_param_product_inf'] массив, верно? ) - похоже, для лога. Но я не вижу, где Вы в $post_arr присваиваете какое-то полезное значение.

Кстати, если Вы в названии переменной указываете тип ( *_arr ) без веских причин - не надо так делать, это дурная практика.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы