Подключаем к интернет-магазину сервис электронной оплаты PayKeeper. У данного сервиса есть специальный модуль для Woocommerce — WooCommerce PayKeeper Plugin. Сам модуль и инструкция по подключению есть на официальном сайте. В данной статье приведу тезисно порядок подключения и проблемы с которыми пришлось столкнуться.
Интеграция PayKeeper
Изначально при заключении Договора получаем доступ (данные) к личному кабинету PayKeeper. Далее заводим выделенный сервер (либо на FastVPS, либо на REG.ru, либо на хостинге PayKeeper), сообщаем необходимые данные менеджеру сервиса.
Установка и настройка плагина
После этого устанавливаем плагин на сайт. Настройки PayKeeper находятся в разделе Платежи.
Прописываем в первом поле
https://site.server.paykeeper.ru/order/inline/ — !site прописываем без зоны
Во втором поле — придумываем и пишем секретное слово (лучше латиницей). Далее оно нам пригодиться.
Следующие 3 поля Наименование, Описание, Icon заполнены автоматически — это то что выводиться на странице оформления заказа.
Следующая группа полей также заполнена по умолчанию. В первых двух полях Адрес уведомления и Успешный переход — одинаковое значение: https://site.ru/?wc-api=wc_pk_gateway
В следующем Переход при ошибке: https://site.ru/?wc-api=wc_pk_gateway&failed
После внесения изменений не забываем сохранить настройки.
Синхронизация
Далее идем в личный кабинет PayKeeper, и в разделе Получение информации о платежах выбираем Способ получения уведомления о платежах» — POST-оповещения.
В поле Секретное слово вставляем слово которое мы придумывали настраивая плагин. А в поле URL, на который будут отправляться POST-запросы вставляем значение из плагина: https://site.ru/?wc-api=wc_pk_gateway
Идем в раздел Адреса перенаправления клиент и заполняем 2 поля, скопировав значения из плагина:
https://site.ru/?wc-api=wc_pk_gateway
https://site.ru/?wc-api=wc_pk_gateway&failed
Собственно ВСЕ! Модуль должен работать. Но у меня не заработал.
Ошибки
Выбирая оплату картами Visa/MasterCard онлайн (PayKeeper) после нажатия кнопки Оформить заказ мы попадаем на экран успешного завершения заказа, а должны попасть на сервис для оплаты. Более того возвращаясь к заказу в личном кабинете и попытавшись оплатить, снова попадаем на экран успешного завершения заказа — но заказ по прежнему не оплачен.
Проблему удалось решить следующим образом:
1. Создал А-запись на домене pay.site.ru A 888.888.88.888
2. Операторы установили на этот поддомен сертификат
3. Заменил адрес Платежной формы PayKeeper на https://pay.site.ru/form/inline
И все заработало! Только немного странно, что форма оплаты появляется фактически после создания заказа.
Не обновляется статус заказа
При внесении платежа статус заказа онлайн не обновлялся. Это происходило из-за плагина Bad Behavior. После отключения плагина, все стало работать как надо.
Автозаполнение полей формы PayKeeper
При выборе способа оплаты через PayKeeper система перебрасывает на страницу в формой оплаты PayKeeper и пользователю приходиться заново вводить некоторые данные. Облегчим жизнь посетителю — заполнил некоторые поля за него, тем более, если например неправильно заполнить поле сумма (вместо точки например поставить запятую в разряде), то заказ вовсе может не пройти.
Скрипт заполнения формы PayKeeper:
$(document).ready(function() {
if($("body").is(".woocommerce-order-pay")) {
var orderNumber = $(".order_details .order strong").text();
$("#tmg_payment_credits #orderid").val(orderNumber);
var orderTotal = $(".order_details .total .woocommerce-Price-amount").text();
var orderTotal2 = orderTotal.substring(0, orderTotal.length - 3);
orderTotal2 = orderTotal2.replace(/\s+/g,''); //убираем пробелы если они есть (например после тысяч)
$("#tmg_payment_credits #sum").val(orderTotal2);
}
});
orderTotal.substring(0, orderTotal.length — 3); — обрезание последних символов строки.
Также можно вывести а впоследствии автозаполнить поля имя, e-mail, phone.
Для начала выведем необходимые данные, где нибудь в footer (причем чтобы их не было видно #user-data {display: none;})
Если выводить через функцию WordPress, то мы получим только часть данных:
<?php $current_user = wp_get_current_user();
echo '<div id="user-email">'.$current_user->user_email.'</div>';
echo '<div id="user-name">'.$current_user->user_firstname.'</div>'; ?>
Чтобы получить поля Woocommerce, нужно делать так:
<?php $current_user_id = get_current_user_id();
$billing_first_name = get_user_meta($current_user_id,'billing_first_name',true);
echo '<div id="user-name">'.$billing_first_name.'</div>';
$billing_phone = get_user_meta($current_user_id,'billing_phone',true);
echo '<div id="user-phone">'.$billing_phone.'</div>'; ?>
Чтобы узнать название полей нужно пойти в форму заказа и посмотреть id соответствующих input.
Итак готовый вывод необходимых данных:
<div id="user-data">
<?php $current_user_id = get_current_user_id();
$billing_first_name = get_user_meta($current_user_id,'billing_first_name',true);
echo '<div id="user-name">'.$billing_first_name.'</div>';
$billing_phone = get_user_meta($current_user_id,'billing_phone',true);
echo '<div id="user-phone">'.$billing_phone.'</div>';
$billing_email = get_user_meta($current_user_id,'billing_email',true);
echo '<div id="user-email">'.$billing_email.'</div>'; ?>
</div>
А в скрипт добавим автоподстановку полей
var orderemail = $("#user-data #user-email").text();
$("#tmg_payment_credits #client_email").val(orderemail);
var ordername = $("#user-data #user-name").text();
$("#tmg_payment_credits #clientid").val(ordername);
Загвоздка будет только с полем телефон, т.к. в форме PayKeeper у этого поля установлена маска, и есть вероятность подставить не правильно, поэтому это поле я не трогаю.
Возможность оплаты не сразу
Если специфика интернет-магазина такова, что мы должны сначала принять заказ, проверить наличие товара и после этого принимать оплату.
Дорабатываем функцию process_payment в файле woocommerce-paykeeper/paykeeper-gateway-class.php (строка 135):
public function process_payment($order_id) {
$order = new WC_Order($order_id);
global $woocommerce;
$endpoint = $woocommerce->query->get_current_endpoint();
if ($endpoint == 'order-pay') {
return array(
'result' => 'success',
'redirect' => add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, $order->get_checkout_payment_url(true)))
);
} else {
$order->update_status('on-hold'); //изначально присваиваем статус На удержании
return array(
'result' => 'success',
'redirect' => $order->get_checkout_order_received_url()
);
}
}
Добавляем проверку на endpoint, т.е. откуда идет запрос в данный момент.
Теперь новый заказ (при выборе оплаты Paykeeper’ом) будет создаваться со статусом «На удержании», при этом отправляются письма и клиенту и администратору. При создании заказа клиент переводится в шаблон успешного заказа. Оплатить заказ он не может и из личного кабинета (При статусе «На удержании» нет кнопки Оплатить). Если с заказом все в порядке, администратор меняет статус заказа на «В ожидании оплаты» и теперь клиент может оплатить его из личного кабинета. После поступления оплаты, если с Paykeeper все настроено как надо, статус заказа меняется на «Выполнен».
Отправка ссылки для оплаты на почту
Я хотел еще доработать таким образом, чтобы при изменении статуса заказа на «В ожидании оплаты» приходило письмо с ссылкой для оплаты. Но сделать этого не удалось, т.к. хука
woocommerce_order_status_on-hold_to_pending_notification
в системе WC не существует.
Нашел способ как это сделать, описано в этой статье.
[site-socialshare]