Я создаю сайт на 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, получать ответ в эту функцию, которая будет внутри папки с темой и уже там обрабатывать все?