Протестируйте работу интернет-магазина

1. Найдите тестовый товар с НДС (картинка снизу).

vent_600_2017172899

2. Нажмите кнопку "в корзину" - перейдите в корзину - нажмите кнопку "оформить заказ".

3. Выберите способ доставки и платежа.

4. На следующем этапе Вы можете зарегистрироваться как ГОСТЬ или КЛИЕНТ с указанием адреса доставки (предоставляется доступ в меню ИНТЕРНЕТ-МАГАЗИН --> УПРАВЛЕНИЕ ЗАКАЗАМИ)

5. Распечатать счет на оплату (после подтверждения заказа модератором) можно здесь --> ИНТЕРНЕТ-МАГАЗИН --> УПРАВЛЕНИЕ ЗАКАЗАМИ --> ЗАКАЗЫ --> ДЕЙСТВИЯ

6. Наличие товара на складе актуально

Как заказать товар, если его нет в наличии

1. Пройдите регистрацию (авторизацию)

2. Найдите тестовый товар с НДС (картинка снизу) или любой другой.

vent_600_2017172899

3. Нажмите кнопку "Под заказ" - перейдите в корзину "Товары под заказ" - убедитесь, что товар в корзине.

4. Перейдите в меню ИНТЕРНЕТ-МАГАЗИН --> УПРАВЛЕНИЕ ЗАКАЗАМИ (для зарегистр.).

5. На вкладке ТОВАРЫ ПОД ЗАКАЗ будет список товаров, которые Вы хотите приобрести - Вы можете задать ему название (только нажмите кнопку "сохранить")

6. Распечатайте заказ или нажмите кнопку @ ПОДЕЛИТЬСЯ и отправьте нам сообщение на электронную почту.

7. После Вам поступит сообщение - предзаказ по товару возможен или нет.

Четверг, 03 декабря

В первых двух  частях проекта  "Создаем плагин Hikashop" было рассказано, как создавать данные для запроса и отлаживать код php нашего скрипта. Не всё проходит гладко - в журнале отладки  с помощью встроенной в HIKASHOP функции writeToLog - при инициализации платежного плагина то появляются записи , то исчезают (сказывается конфликт между функцией writeToLog и простыми  функциями php - echo и echo print_r). Поэтому не забываем копировать промежуточные версии нашего плагина и устраняем ошибки.

Разговор далее пойдет о public function onPaymentNotification(&$statuses).   Для правильной работы любого платежного плагина  (выдача уведомления о прохождении оплаты и информирование об этом покупателя) значение параметра ' notification ' должно быть включено - "получать уведомления о статусе заказа (об оплате)".  Сам параметр ' notify_url '   по стандарту Hikashop представляет собой абстрактный URL адрес и должен иметь обязательные аттрибуты, о которых мы поговорим далее.

Нельзя забывать, что существует 2 разновидности ' notify_url '  : html-сущность в функции-конструкторе и php-сущность в теле плагина  - и они имеют разный код.     

  • html-сущность - с использованием  &  в определенном месте кода

[$notify_url] = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&tmpl=component&lang='.$this->locale .$this->url_itemid;

  • php-сущность - с использованием разделителя &

[$notify_url] = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&tmpl=component&lang='.$this->locale .$this->url_itemid;

Техподдержке Сбербанка для организации получения уведомлений о проведенных платежах надо передать именно  php-сущность URL адреса - только это обеспечит вас в дальнейшем нужной информацией об оплате клиентом  заказа  в интернет-магазина (платежный шлюз вызывает этот URL, чтобы уведомить ваш плагин о платеже) - но иногда техподдержка ошибается и тогда Вам надо поманипулировать самим  между сущностями $notify_url для получения callback от платежного шлюза.

Информация платежного шлюза обеспечивает вас тремя параметрами - ['status']  ,  ['mdOrder'] и ['orderNumber'] - этого достаточно для дальнейшей работы скрипта : загрузка базы данных  $dbOrder = $this->getOrder((int)$_REQUEST['orderNumber'])  по номеру заказа и  использования метода СбербанкаgetOrderStatus.do для получения дополнительных параметров для $email и  $history  для функции изменения статуса заказа - $this->modifyOrder($order_id,$order_status,$history,$email) внутри  public function onPaymentNotification(&$statuses). Хотя решать Вам, отправлять информацию клиенту магазина или нет.

СЕКРЕТ №1

Есть несколько вариантов написания кода php для работоспособности скрипта.

//переменная vars абстрактная и не привязана к переданным ранее шлюзу данным
    $vars = array();	
	$filter = JFilterInput::getInstance();
	foreach($_REQUEST as $key => $value) {
		$key = $filter->clean($key);
		if(preg_match('#^[0-9a-z_-]{1,30}$#i', $key) && !preg_match('#^cmd$#i', $key)) {
			$value = hikaInput::get()->getString($key);
			$vars[$key] = $value;
		}
	}
        
	$dbOrder = $this->getOrder((int)$vars['orderNumber']);
	$this->loadPaymentParams($dbOrder);
	if(empty($this->payment_params))
		return false;
	$this->loadOrderData($dbOrder);
		
	if($this->payment_params->debug) // Режим отладки активирован 
	{
		$this->writeToLog('получена переменная $vars ' .$vars['orderNumber']. ' из $_REQUEST')."\n\n";
		echo print_r($vars,true)."\n\n\n"; //запись появится где-то внизу файла журнала платежей  		
		//echo print_r($dbOrder,true)."\n\n\n"; //приготовьтесь к получению -большой массив
	}

	if(!$this->payment_params->notification)
		return false;
	if(empty($dbOrder)) {
		$this->writeToLog('Не удалось загрузить заказ по уведомлению с платежного шлюза ' . @$vars['orderNumber']);
		return false;
	}
   
	$order_id = $dbOrder->order_id;

	$url = HIKASHOP_LIVE.'administrator/index.php?option=com_hikashop&ctrl=order&task=edit&order_id=' . $order_id;
	$this->writeToLog('адрес url : '.$url)."\r\n";
	$order_text = "\r\n" . JText::sprintf('NOTIFICATION_OF_ORDER_ON_WEBSITE', $dbOrder->order_number, HIKASHOP_LIVE);		
	$order_text .= "\r\n" . str_replace(' ', "\r\n", JText::sprintf('ACCESS_ORDER_WITH_LINK', $url, $url )); //2 url
	$this->writeToLog('order_text : '.$order_text);
	//дальнейшие шаги 
 /////////////////////////////////////////////////////////////////////////////
	$arg = array(
            'userName' =>$this->payment_params->merchant_login,
             'password' =>$this->payment_params->merchant_password,
             'orderId' => @$vars['mdOrder'],                 
             );          
        $this->writeToLog($arg,true)."\n\n";        
        $callback = $this->gateway('getOrderStatus.do', $arg);
	$result = $callback;

        $this->writeToLog($result,true)."\n\n";    	
 //////////////////////////////////////////////////////////////////////////////////
	

 Результат :

 

Для новичка надо понять, что функция onPaymentNotification(&$statuses)    начинает работать только после перехода пользователя на платежный шлюз и попытки оплаты заказа (успешно или неудачно).  Но до этого Вам надо  передать службе техподдержки Сбербанка для активации так называемых "колбэков" об оплате параметр    [notify_url]   с php-сущностью. 

$notify_url = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&tmpl=component&lang='.$this->locale .$this->url_itemid;

СЕКРЕТ №2

Дальнейшее управление на основе ответа шлюза

 

// $callback - результат использования метода getOrderStatus.do 
if(empty($callback)){ $email = new stdClass(); $email->subject = JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER','Example').' '.JText::sprintf('PAYPAL_CONNECTION_FAILED',$dbOrder->order_number); $email->body = str_replace(' ',"\r\n",JText::sprintf('NOTIFICATION_REFUSED_NO_CONNECTION','Example'))."\r\n\r\n".JText::sprintf('CHECK_DOCUMENTATION',HIKASHOP_HELPURL.'payment-example-error#connection') . $order_text; $action = false; $this->modifyOrder($action, null, null, $email); JError::raiseError( 403, JText::_( 'Access Forbidden' )); return false; }
$orderStatus = $result['OrderStatus']; if ($orderStatus == '1' || $orderStatus == '2') { $history = new stdClass(); $history->notified=1; $history->amount=$callback['Amount']; $order_status = $this->payment_params->verified_status; $mail_status=$statuses[$order_status]; $email->subject = JText::sprintf('УВЕДОМЛЕНИЕ ОБ ОПЛАТЕ ЗАКАЗА','Example',$_POST['order_status'],$dbOrder->order_number); $email->body = str_replace(' ',"\r\n",JText::sprintf('PAYMENT_NOTIFICATION_STATUS','Example',$_POST['order_status'])).' '.JText::sprintf('ORDER_STATUS_CHANGED',$mail_status)."\r\n\r\n".$order_text; $this->modifyOrder($order_id,$order_status,$history,$email); return true; }else{ $emailData = new stdClass(); $emailData->subject = JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER','Example').'invalid response'; $emailData->body = JText::sprintf("Hello,\r\n An Payza notification was refused because the notification from the Payza server was invalid")."\r\n\r\n".$order_text; $this->modifyOrder($order_id, $this->payment_params->invalid_status, true, $emailData); return false; }

 

СЕКРЕТ №3

Есть еще несколько вариантов получения callback - уведомлений.

Так в найденном плагине HIKASHOP-BECOPAY-GATEWAY упоминается, что не все платежные шлюзы используют параметр $notify_url - а используют для слива информации о статусе платежа все тот же  $return_url

$notify_url - это URL-адрес "уведомления" HikaShop, который следует передать платежному шлюзу, чтобы он мог отправить запрос по этому URL-адресу, чтобы сообщить HikaShop, что платеж был произведен (иногда платежный шлюз этого не делает и передает информацию на URL-адрес возврата - $return_url  , и в этом случае вам необходимо использовать этот URL-адрес уведомления в качестве URL-адреса возврата и перенаправить пользователя на URL-адрес возврата HikaShop в конце функции onPaymentNotification)

Как это сделать правильно, я пока не понимаю... но возможно этот шаг позволит обойтись без обращения в техподдержку для передачи и использования специального адреса Hikashop - $notify_url  .

статья в редактировании ...

телефоны
+7 (902) 327-81-10 (Мегафон)
адрес
Чебоксары, Гражданская ул., д. 78, к. 149
часы работы
с 8:00 до 18:00 (сб, вс - с 9:00 до 15:00)