Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Платежный драйвер банковской картой- страница с сообщением об успешном заказе

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 13.04.17 17:39:39 #1



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Когда то давно на сайте настраивали платежный драйвер, но он долго не проработал, был косяк: после добавления товара и его оплаты через карту товары в корзину больше не добавлялись. Сейчас решили возобновить его работу эту проблему с корзиной решили но появилась другая: Не отображается сообщение об успешном заказе.

Я нашел в платежном драйвере настройку:
"Линк для возврата покупателя в магазин (на сайт) после успешного проведения оплаты"

Сейчас стоит на страницу: http://site.ru/members/cart?action=empty

я так понимаю "action=empty" это очистка корзины

и получается происходит возврат на страницу на которой просто написано что корзина пуста.

пытался еще так: http://site.ru/members/order?action=process&status=ok

возвращает на страницу с сообщением: Преведены неверные данные для проведения операции

какие параметры мне нужно передать чтоб появилось сообщение о успешном заказе?



Добавлено: 13.04.17 21:37:43 #2



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени

Наверное надо сообщение не об успешном заказе, а об успешной оплате? Ведь заказ оформляется еще до оплаты. Как насчет статической страницы с информацией "Оплата прошла успешно? Или может быть переадресовывать в историю заказов?



Добавлено: 14.04.17 09:25:38 #3



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Евгений Лапин, Здравствуйте. Да Вы верно заметили на счет успешной оплаты. Пока создал статичную страницу. Спасибо. В историю заказов не получится потому как на сайте нет регистрации, да это и не нужно я думаю.

Еще такой сопутствующий вопрос: как в сообщении администратору высылать выбранный Метод оплаты? В данный момент на сайте есть три способа: налом, распечатать счет и картой. Метод оплаты приходит только если выбрать метод Распечатать счет. А в приоритете чтоб писалось когда выбран способ оплаты картой.

UPD: при возвращении на статичную страницу после оплаты в корзине остается товар. Вроде решилось с помощью добавления к адресу страницы ?action=empty



Добавлено: 14.04.17 20:24:06 #4



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени

Обычным способом: в сете письма выводить переменные, смотреть, что туда приходит, и принимать решение о способе реализации.



Добавлено: 14.04.17 22:56:14 #5

Партнер


Регистрация: 22.02.09
Сообщений: 465


Обратиться по имени

Страница возврата при успешной оплате передается в параметре $aData['return'] и лучше в драйвере использовать ее, а не брать из настроек, как, собственно и не делать вообще этого параметра в настройках.
Значение он имеет примерно следующее:
http://site.ru/members/order?action=process&status=ok&item_number=85

И именно при переходе по этому адресу завершается оформление заказа - заказ переводится в статус "Принят", очищается корзина, выдается страница, содержимое которой настраивается в сете result_accepted шаблона eshop_purchase.tpl

На сколько я помню, завершение оформления заказа должно работать по такой ссылке и без номера заказа в параметрах и, если у вас это не так, то скорее всего нужно смотреть сам драйвер и кто и почему возвращает сообщение "Преведены неверные данные для проведения операции" вместо завершения заказа.



Добавлено: 18.04.17 10:52:22 #6



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Евгений Лапин, Вы имеете ввиду
##__P__##
???



Добавлено: 18.04.17 11:02:06 #7



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Evgeney S., я заменил ссылку на $aData['return']
ссылка получилась такая: http://site.ru/members/order?action=process&status=ok
и все равно получил то же сообщение и в корзине остался товар.

Evgeney S.:
кто и почему возвращает сообщение ...

в шаблоне eshop_purchase.tpl срабатывает сет:
<!--#set var="result_wrong_request" value="%%sorry_wrong_request%%"-->


который и возвращает это сообщение.

И еще в консоли выдает такое сообщение:
Failed to load resource: the server responded with a status of 403 (Forbidden) ami_strict.php
а там [0003] User allowed to edit at front auth required! (при заказе я авторизован как админ) и на сайте нет кабинета для пользователя т.е. заказывать могут все без регистрации хотя скрытая регистрация все таки присутствует при оформлении заказа.



Добавлено: 18.04.17 11:04:51 #8



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Платежный драйвер выглядит так:

<?php
/**
* @copyright chto to
* @version chto to
* @package   chto to
* @size chto to
* @since   chto to
*/
?>
<?php


/**
 * Example pay driver
 * 
 * How to create your own pay driver:
 * 
 * <ol>
 * <li>Copy the directory "_local/eshop/pay_drivers/example" to another, i.e. "_local/eshop/pay_drivers/my_driver"</li>
 * <li>Open driver.php in your path and:
 * <ul>
 * <li>Rename driver class name to your name (MyDriver_PaymentSystemDriver). Naming rule: all words delimeted by _ should be started from uppercase letter. Not _ allowed in driver name.</li>
 * <li>In some cases you should to check or add some fields when printing payment button on checkout page. You can manipulate with $aData array in getPayButton method for it. The same for pay system button with autoredirect but the method is getPayButtonParams</li>
 * <li>User will come back to the site from payment system by special URL and system already has the checks for setting correct order status. If you want to make your manual checking do it in payProcess method.</li>
 * <li>For payment system background requests for order approving there is payCallback method. You need to override this method with you own check of payment data.</li>
 * <li>If get or post field are differ from order_id, id or item_number you need to override getProcessOrder method that will return valid order id from POST and GET request.</li>
 * </ul>
 * </li>
 * <li>Open driver.tpl and modify sets:
 * <ul>
 * <li>settings_form - part of form that will be insertted to driver form when you open your driver for editing.</li>
 * <li>checkout_form - button that will be shown on checkout page after the list of items. ##hiddens## field is required.</li>
 * <li>pay_form - form that will be submitted to payment system. In most cases this form is made with autoredirect.</li>
 * <li>Also modify path to driver.lng.</li>
 * </ul>
 * </li>
 * <li>Captions for drivers you can set in driver.lng.</li>
 * <li>After all these steps install your driver in Settings/Pay drivers page of admin panel and edit parameters. Then include your diver for the payment in option "Allowed payment drivers" of Catalog : Orders setting.</li>
 * </ol>
 * 
 * @package Driver_PaymentSystem
 */
class Bankname_PaymentSystemDriver extends AMI_PaymentSystemDriver{

	protected $driverName = 'bankname';

    /**
     * Get checkout button HTML form
     *
     * @param array $aRes Will contain "error" (error description, 'Success by default') and "errno" (error code, 0 by default). "forms" will contain a created form
     * @param array $aData The data list for button generation
     * @param bool $bAutoRedirect If form autosubmit required (directly from checkout page)
     * @return bool true if form is generated, false otherwise
     */
    public function getPayButton(&$aRes, $aData, $bAutoRedirect = false){
		//$aRes['error'] = "Success";
		//$aRes['errno'] = 0;
        // Format fields
        foreach(Array("return", "description") as $fldName){
            $aData[$fldName] = htmlspecialchars($aData[$fldName]);
        }
		$aData['amount'] = str_replace(',', '.', floatval($aData['amount']));
        // Disable to process order using example button
        //$aData["disabled"] = "disabled";
        // Set your fields of $aData here
		#$aData['token'] = md5($aData['merchant_id'].$aData['product_id'].$aData['amount'].$aData['order'].$aData['sw']);
		//$bAutoRedirect = true;
		#$post = $_POST;
		#unset($post['get_type']);
		#$post['action'] = 'askparams';
		
		$aData['hiddens'] = '';
		
		$path_www=dirname(__FILE__).'/';
		$order=sprintf("%06u",$aData['order']);
		// Константы test
		//define("MERCHANT_CERT_ID",	"***");	// Серийный номер сертификата 
		//define("MERCHANT_NAME",		"test shop");	// Название магазина (продавца)
		//define("MERCHANT_ID",		"****");			// ID продавца в системе 
		// Константы web
		define("MERCHANT_CERT_ID",	"****");	// Серийный номер сертификата 
		define("MERCHANT_NAME",		"****");	// Название магазина (продавца)
		define("MERCHANT_ID",		"*****");			// ID продавца в системе 
		
		define("ORDER_ID",			$order);		// Уникальный номер заказа
		define("CURRENCY",			"777");			// ID валюты. 840 - USD
		define("AMOUNT", 			$aData['amount']);			// сумма заказа
		
		require_once($path_www."kkb.utils.php");
		$kkb = new KKBSign();
		$kkb->invert();
		//$kkb->load_private_key($path_www."test_prv.pem", "nissan");	// test
		$kkb->load_private_key($path_www."bab.prv", "****");	// web
		// Шаблон заказа
		$merchant = '<merchant cert_id="%certificate%" name="%merchant_name%"><order order_id="%order_id%" amount="%amount%" currency="%currency%"><department merchant_id="%merchant_id%" amount="%amount%" /></order></merchant>';
		$merchant = preg_replace('/\%certificate\%/', 		MERCHANT_CERT_ID , 	$merchant);
		$merchant = preg_replace('/\%merchant_name\%/', 	MERCHANT_NAME , 	$merchant);
		$merchant = preg_replace('/\%order_id\%/', 			ORDER_ID, 			$merchant);
		$merchant = preg_replace('/\%currency\%/', 			CURRENCY, 			$merchant);
		$merchant = preg_replace('/\%merchant_id\%/', 		MERCHANT_ID, 		$merchant);
		$merchant = preg_replace('/\%amount\%/', 			AMOUNT,				$merchant);

		$merchant_sign = '<merchant_sign type="RSA">'.$kkb->sign64($merchant).'</merchant_sign>';
		$xml = "<document>".$merchant.$merchant_sign."</document>";
		$Base64Content= base64_encode($xml);
		$aData['hiddens'] .= '<input type="hidden" name="Signed_Order_B64" value="'.$Base64Content.'">';
		$aData['hiddens'] .= '<input type="hidden" name="Language" value="rus">';
		$aData['hiddens'] .= '<input type="hidden" name="email" value="'.$aData['email'].'">';
		//$aData['hiddens'] .= '<input type="hidden" name="BackLink" value="http://site.ru/zakaz-ok?action=empty">';//http://site.ru/members/order?action=process&status=ok //http://site.ru/zakaz-ok?action=empty //'.$aData['return'].'
		$aData['hiddens'] .= '<input type="hidden" name="BackLink" value="'.$aData['return'].'">';
		$aData['hiddens'] .= '<input type="hidden" name="PostLink" value="http://site.ru/_local/eshop/pay_drivers/bankname/answer.php">';

        return parent::getPayButton($aRes, $aData, $bAutoRedirect);
    }
    
    /**
     * Get the form that will be autosubmitted to payment system. This step is required for some shooping cart actions.
     *
     * @param array $aData The data list for button generation
     * @param array $aRes Will contain "error" (error description, 'Success by default') and "errno" (error code, 0 by default). "forms" will contain a created form
     * @return bool true if form is generated, false otherwise
     */
    public function getPayButtonParams($aData, &$aRes){
        // Check parameters and set your fields here
		//$aRes['error'] = "Success";
		//$aRes['errno'] = 0;
		//$aData['amount'] = str_replace(',', '.', floatval($aData['amount']));
        return parent::getPayButtonParams($aData, $aRes);
    }

    /**
     * Verify the order from user back link. In success case 'accepted' status will be setup for order.
     *
     * @param array $aGet $_GET data
     * @param array $aPost $_POST data
     * @param array $aRes reserved array reference
     * @param array $aCheckData Data that provided in driver configuration
     * @return bool true if order is correct and false otherwise
     * @see AMI_PaymentSystemDriver::payProcess(...)
     */
    public function payProcess($aGet, $aPost, &$aRes, $aCheckData, $aOrderData){
        // See implplementation of this method in parent class

		#$amount = str_replace(',', '.', floatval($aOrderData['total']));
		#if($aGet['token']!=md5($aCheckData['merchant_id'].$aCheckData['product_id'].$amount.$aGet['order_id'].$aCheckData['sw'])) return false;

		return parent::payProcess($aGet, $aPost, $aRes, $aCheckData, $aOrderData);
    }

    /**
     * Verify the order by payment system background responce. In success case 'confirmed' status will be setup for order.
     *
     * @param array $aGet $_GET data
     * @param array $aPost $_POST data
     * @param array $aRes reserved array reference
     * @param array $aCheckData Data that provided in driver configuration
     * @return int -1 - ignore post, 0 - reject(cancel) order, 1 - confirm order
     * @see AMI_PaymentSystemDriver::payCallback(...)
     */
    public function payCallback($aGet, $aPost, &$aRes, $aCheckData, $aOrderData){
        // See implplementation of this method in parent class
		return parent::payCallback($aGet, $aPost, $aRes, $aCheckData, $aOrderData);
    }

    /**
     * Return real system order id from data that provided by payment system.
     *
     * @param array $aGet $_GET data
     * @param array $aPost $_POST data
     * @param array $aRes reserved array reference
     * @param array $aAdditionalParams reserved array
     * @return int order Id
     * @see AMI_PaymentSystemDriver::getProcessOrder(...)
     */
    public function getProcessOrder($aGet, $aPost, &$aRes, $aAdditionalParams){
        // See implplementation of this method in parent class

        return parent::getProcessOrder($aGet, $aPost, $aRes, $aAdditionalParams);
    }
}





Добавлено: 18.04.17 11:30:35 #9



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени

В коде родительского класса AMI_PaymentSystemDriver я вижу свойство $clearCartOnPayProcess. Попробуйте выставить ее в true, вдруг прокатит.

Если нет, еще покопаем.



Добавлено: 18.04.17 17:01:01 #10



Регистрация: 19.01.15
Сообщений: 102


Обратиться по имени

Евгений Лапин, вставил строку:
$clearCartOnPayProcess = true;

перед
return parent::getPayButton($aRes, $aData, $bAutoRedirect);
не сработало



Добавлено: 19.04.17 19:21:00 #11



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени

В драйвере яндекс.кассы я увидел вот такой код:

protected function cleanupCart($orderId){
        // Clean up user cart
        global $cms, $oSession;

        $sessionCookieName = $oSession->CookieName;
        $oOrder =
            AMI::getResourceModel('eshop_order/table')
            ->find($orderId, array('id', 'id_user'));
        if($oOrder->id_user){
            $oSessions =
                AMI::getResourceModel('env/session/table')
                ->getList()
                ->addColumns(array('id', 'ip', 'data'))
                ->addWhereDef("AND `id_member` = " . $oOrder->id_user)
                ->load();
            foreach($oSessions as $oItem){
                $this->log($oItem->id . ' session found');
                $aData = unserialize($oItem->data);
                $noMarker = TRUE;
                foreach(array_keys($aData) as $key){
                    if(0 === mb_strpos($key, 'yandex_ups')){
                        if($orderId != unserialize($aData[$key])){
                            $this->log('Invalid order id (' . unserialize($aData[$key]) . ' instead of ' . $orderId . ')');
                            continue 2;
                        }
                        $noMarker = FALSE;
                        AMI::setOption('eshop_cart', 'store_cart_after_logout', '');
                        // AMI::setOption('session', 'force_store', TRUE);
                        $cms->VarsCookie[$sessionCookieName] = $oItem->id;
                        $ip = $_SERVER['REMOTE_ADDR'];
                        $_SERVER['REMOTE_ADDR'] = $oItem->ip;
                        $oSession = new CMS_Session(
                            $cms,
                            AMI::getOption('core', 'allow_multi_lang')
                                ? AMI_Registry::get('lang_data')
                                : ''
                        );
                        $oSession->Start();
                        AMI::getSingleton('eshop/cart')->clear();
                        $oSession->UnsetVar('yandex_ups');
                        $oSession->Store();
                        $_SERVER['REMOTE_ADDR'] = $ip;
                        $this->log('Cart cleaned up');
                        break;
                    }
                }
                if($noMarker){
                    $this->log('Missing marker, skipped');
                }
            }
        }
    }


Видимо стоит дополнить метод payProcess драйвера, добавив туда код очистки корзины.





Создать новую тему

Всего тем: 6587
Всего сообщений: 27632
Всего зарегистрированных пользователей: 47857
Последний зарегистрированный пользователь: ConstantineStone