Отложенный платеж
Материал из Umicms
Версия от 13:59, 30 марта 2014; Stexe (обсуждение | вклад) (Новая страница: « category:Написание кастомных макросовcategory:Вопросы и уроки разработки сайтов на UMI.CMS '''За…»)
Задача: Реализовать функционал отложенного платежа заказа, то есть возможность оплаты заказа после прохождения шагов оформления заказа
Реализация:
После оформления заказа в его поле будет записываться ссылка, при переходе на которую, будет отображаться форма для оплаты заказа, в выбранной платежной системе. В модуле "Шаблоны данных" в тип данных "Заказ" добавим поле типа "Строка" с именем "Ссылка на оплату заказа" и идентификатором "pay_order_link".
В файл classes\modules\emarket\__custom.php добавим определения метода формирования данных для платежной системы и обработчик события для записи ссылки в поле "Ссылка на оплату заказа".
/* Возращает данные для формирования формы оплаты заказа покупателем
* $order_id - id заказа
* $template - название шаблона для обработки данных
*/
public function payOrder($order_id = false, $template = 'default')
{
if ( !$order_id )
{
$order_id = getRequest('order_id');
}
if ( !$template )
{
$template = getRequest('template');
}
//Получить объект заказа
$order = order::get($order_id);
if ( !($order instanceof order) )
{
throw new publicException("Заказ с id - '{$order_id}' не существует");
}
//Из объекта заказа получить id способа оплаты
$payment_id = $order->getValue('payment_id');
//По id способа оплаты получить объект способа оплаты
$payment = payment::get($payment_id, $order);
if( !($payment instanceof payment) )
{
throw new publicException("В заказе c id - '{$order_id}' не выбран способ оплаты");
}
//Если статус оплаты не "Подтвердена" или не "Принята"
//Вернуть данные для формирования формы оплаты заказа
$payment_status_id = $order->getPaymentStatus();
$payment_status_acc = order::getStatusByCode('accepted', 'order_payment_status');
$payment_status_val = order::getStatusByCode('validated', 'order_payment_status');
if ( $payment_status_id === NULL ||
($payment_status_id != $payment_status_acc &&
$payment_status_id != $payment_status_val) )
{
$result_arr = $payment->process($template);
$result_arr['payment_name'] = $payment->getCodeName();
return $result_arr;
}else
{
throw new publicException("Оплата заказа с id - '{$order_id}' уже произведена");
}
}
public function onGotNewOrder($event)
{
if( $event->getMode() == "after" &&
$event->getParam("old-status-id") == false &&
$event->getParam("new-status-id") == order::getStatusByCode('waiting') )
{
$order = $event->getRef("order");
$domain = $order->getDomain();
if ( !$domain )
{
$domain = cmsController::getInstance()->getCurrentDomain();
}
$domain_host = $domain->getHost();
$link = "http://{$domain_host}/emarket/payOrder/?order_id={$order->getId()}";
$order->setValue('pay_order_link', $link);
}
}
В файл \classes\modules\emarket\permissions.custom.php добавим следующий код:
<?php
$permissions = array(
'purchasing' => array(
'payOrder', 'onGotNewOrder'));