В этой статье разберёмся, как в WordPress реализовать автоматическую проверку платежей через CRON задачи. Это решение поможет вам своевременно получать статус платежей, уменьшить вероятность ошибок и улучшить пользовательский опыт. Мы подробно рассмотрим настройку WP-Cron, взаимодействие с API платежных систем, а также приведём примеры кода для создания собственной функции проверки.
Что такое WP-Cron и почему он нужен для проверки платежей
WP-Cron — это встроенный механизм WordPress для запуска запланированных задач. В отличие от системного cron, WP-Cron запускается при посещении сайта, что удобно, если вы не имеете доступа к серверному cron. Автоматическая проверка платежей — это задача, которая должна выполняться регулярно (например, каждые 5 минут), чтобы обновлять статусы транзакций.
Если не настроить автоматическую проверку, то статусы платежей будут обновляться только при ручных действиях или при переходе пользователя по ссылкам. Это может привести к устаревшим данным и ошибкам в учёте.
WP-Cron позволяет запускать проверку в фоновом режиме, автоматически обновляя информацию по платежам с минимальными задержками.
Подключение к API платежной системы
Чтобы проверять статусы платежей, нужно обращаться к API используемой платежной системы (например, Stripe, PayPal, Яндекс.Касса). Каждый провайдер предоставляет методы для получения статусов транзакций по ID платежа или номеру заказа.
Важно внимательно изучить документацию API и обеспечить безопасность запросов. Часто для этого используют авторизационные ключи или токены, которые нужно хранить в wp-config.php или в настройках плагина.
Пример функции запроса статуса платежа к API (на примере гипотетического API):
function wppay_get_payment_status($payment_id) {
$api_key = get_option('wppay_api_key');
$response = wp_remote_get("https://api.paymentprovider.com/status/" . $payment_id, [
'headers' => [
'Authorization' => 'Bearer ' . $api_key,
'Accept' => 'application/json'
]
]);
if (is_wp_error($response)) {
return false;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (isset($data['status'])) {
return $data['status'];
}
return false;
}Настройка WP-Cron для автоматизации проверки платежей
Для запуска проверки по расписанию создадим новую задачу WP-Cron. Пример добавления задачи с интервалом в 5 минут:
add_filter('cron_schedules', 'wppay_add_cron_interval');
function wppay_add_cron_interval($schedules) {
if (!isset($schedules['five_minutes'])) {
$schedules['five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Every 5 Minutes')
];
}
return $schedules;
}
if (!wp_next_scheduled('wppay_check_payments_hook')) {
wp_schedule_event(time(), 'five_minutes', 'wppay_check_payments_hook');
}
add_action('wppay_check_payments_hook', 'wppay_check_payments_function');Теперь создадим основную функцию, которая будет запускаться по расписанию, проверять статусы платежей и обновлять базу данных.
Основная функция проверки платежей и обновления статусов
Предположим, что у вас есть таблица или тип записей с информацией о платежах. Мы будем получать список новых или незавершённых платежей и проверять их статус через API.
function wppay_check_payments_function() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppay_payments';
// Получаем платежи со статусом "ожидает"
$payments = $wpdb->get_results("SELECT id, payment_id FROM {$table_name} WHERE status = 'pending'");
if (empty($payments)) {
return;
}
foreach ($payments as $payment) {
$status = wppay_get_payment_status($payment->payment_id);
if ($status === false) {
// Ошибка запроса, можно добавить логирование
continue;
}
if ($status !== 'pending') {
// Обновляем статус в базе
$wpdb->update(
$table_name,
['status' => $status],
['id' => $payment->id]
);
}
}
}Данная функция перебирает все платежи в статусе "pending", запрашивает их текущий статус и обновляет запись в базе, если статус изменился. Это классический пример интеграции с внешним API для синхронизации данных.
Рекомендации по улучшению и отладке
1. Логирование: Добавьте запись логов для отладки ошибок API и обновлений статусов. Можно использовать плагины типа Clearfy Pro с функцией логирования.
2. Безопасность: Никогда не храните ключи API в открытом виде в коде. Используйте защищённые настройки или переменные окружения.
3. Обработка ошибок: Реализуйте повторные попытки запроса и уведомления администратора при критических сбоях.
4. Оптимизация: Если платежей много, разбивайте запросы на партии и используйте кэширование результатов, например, с помощью Redis (Clearfy Pro поддерживает интеграцию).
Пример интеграции с плагином для платежей
Если вы используете готовый платежный плагин, например WPCommunity или WPGPT, нужно адаптировать функцию проверки под их структуру данных. Обычно у плагинов есть собственные классы и методы для работы с платежами, которые можно расширить или переопределить, добавив проверку через CRON.
Например, у плагина может быть метод get_pending_payments() и update_payment_status($id, $status). Тогда функция проверки будет выглядеть так:
function wppay_check_payments_function() {
$payments = MyPluginPayments::get_pending_payments();
foreach ($payments as $payment) {
$status = wppay_get_payment_status($payment->external_id);
if ($status && $status !== $payment->status) {
MyPluginPayments::update_payment_status($payment->id, $status);
}
}
}