Форма оплаты
        Добрый день!
Встала задача создать форму оплаты с последующей отсылкой данных в платежную систему (webpay)
Есть готовый модуль mspWebpay, но он не подходит по той причине, что нет интернет магазина и заказчик не хочет корзину.
1) Необходимо создать форму, которая по кнопке «заказать» загрузится и подхватит pagetitle товара и tv с ценой.
2) Далее покупатель вписывает в эту форму свои данные и нажимает продолжить
3) Когда нажимаем «продолжить» форма должна перекинуть все данные в форму #2 (форма в которой формируются данные для отправки данных в платежную систему)
код формы (дан поставщиком платежной системы)
4) Форма #2 должна наконец отсылать данные на сайт платежной системы
Помогите с чего начать )
Может есть возможность сразу 2 формы в одну объединить?
Заранее спасибо!
    
    
                                                                                
            Встала задача создать форму оплаты с последующей отсылкой данных в платежную систему (webpay)
Есть готовый модуль mspWebpay, но он не подходит по той причине, что нет интернет магазина и заказчик не хочет корзину.
1) Необходимо создать форму, которая по кнопке «заказать» загрузится и подхватит pagetitle товара и tv с ценой.
2) Далее покупатель вписывает в эту форму свои данные и нажимает продолжить
3) Когда нажимаем «продолжить» форма должна перекинуть все данные в форму #2 (форма в которой формируются данные для отправки данных в платежную систему)
код формы (дан поставщиком платежной системы)
form action="https://secure.sandbox.webpay.by:8843/" method="post">
<input type="hidden" name="*scart">
<input type="hidden" name="wsb_version" value="2">
<input type="hidden" name="wsb_language_id" value="russian">
<input type="hidden" name="wsb_storeid" value="11111111"  >
<input type="hidden" name="wsb_store" value="Название Вашего магазина"  >
<input type="hidden" name="wsb_order_num" value="ORDER-12345678" >
<input type="hidden" name="wsb_test" value="1"  >
<input type="hidden" name="wsb_currency_id" value="BYR"  >
<input type="hidden" name="wsb_seed" value="1242649174">
<input type="hidden" name="wsb_return_url" value=" http://your   site   url.com/success.php ">
<input type="hidden" name="wsb_cancel_return_url" value=" http://your   site   url.com/cancel.php "> <input type="hidden" name="wsb_notify_url" value=" http://your   site url.com/notify.php ">
<input type="hidden" name="wsb_email" value="no@body.tld"  >
<input type="hidden" name="wsb_phone" value="22-333-333"  >
<input type="hidden" name="wsb_invoice_item_name[]" value="Товар 1">
<input type="hidden" name="wsb_invoice_item_quantity[]" value="2">
<input type="hidden" name="wsb_invoice_item_price[]" value="10000">
<input type="hidden" name="wsb_invoice_item_name[]" value="Товар 2">
<input type="hidden" name="wsb_invoice_item_quantity[]" value="1">
<input type="hidden" name="wsb_invoice_item_price[]" value="500">
<input type="hidden" name="wsb_total" value="21950"  >
<input type="hidden" name="wsb_signature" value="40aa8af3ce7a1f7c3635ac2227475094a59d574c" >
<input type="hidden" name="wsb_tax" value="1050">
<input type="hidden" name="wsb_shipping_name" value="Стоимость доставки"  >
<input type="hidden" name="wsb_shipping_price" value="980"  >
<input type="hidden" name="wsb_discount_name" value="Скидка на товар"  >
<input type="hidden" name="wsb_discount_price" value="580"  >
<input type="submit" value="Купить">
</form>4) Форма #2 должна наконец отсылать данные на сайт платежной системы
Помогите с чего начать )
Может есть возможность сразу 2 формы в одну объединить?
Заранее спасибо!
Комментарии: 21
                1) Можно сделать кнопку «Заказать» ссылкой, в которую подставлять данные товара. Например, так:
2) На странице, куда ведет эта ссылка сделать форму для ввода пользователем своих данных с пустым параметром action (чтобы форма отправлялась на этот же адрес):
3) На этой же странице (например, прямо перед формой) вызываем сниппет [[!createOrder]]:
В чанке payForm должна быть форма. В ней будут доступны плейсхолдеры [[+num]] — номер заказа, [[+amount]] — сумма, ну и прочие.
4) После формы в чанке должен стоять какой-нибудь такой скриптик:
Единственное, что надо дописать — это генерация подписи (поле wsb_signature). Это тоже надо делать в сниппете createOrder, а затем передать в чанк payForm
                    <a href="[[~17]]?product=[[+id]]">Заказать</a>2) На странице, куда ведет эта ссылка сделать форму для ввода пользователем своих данных с пустым параметром action (чтобы форма отправлялась на этот же адрес):
<form action="" method="post">
<input name="phone" />
</form>3) На этой же странице (например, прямо перед формой) вызываем сниппет [[!createOrder]]:
if (!$_POST['phone']) return;
$properties = $modx->resource->get('properties');
$productRes = $modx->getObject('modResource', $_GET['product']);
$product = $productRes->pagetitle;
$amount = $productRes->getTVValue('price');
$orders = $properties['orders'];
if (!$orders) $orders = array();
$ordertId = count($orders) + 1;
$orders[$ordertId] = array(
        'num' => $ordertId,
        'amount' => $amount,
        'product' => $product,
        'phone' => $_POST['phone'],
        'paid' => 0
    );
$properties['orders'] = $orders;
$modx->resource->set('properties', $properties);
$modx->resource->save();
$form = $modx->getChunk('payForm', $orders[$ordertId]);
print $form;
die();В чанке payForm должна быть форма. В ней будут доступны плейсхолдеры [[+num]] — номер заказа, [[+amount]] — сумма, ну и прочие.
4) После формы в чанке должен стоять какой-нибудь такой скриптик:
<script>document.forms[0].submit();</script>Единственное, что надо дописать — это генерация подписи (поле wsb_signature). Это тоже надо делать в сниппете createOrder, а затем передать в чанк payForm
                Примерно так сделана форма у меня на сайте https://ilyaut.ru/pay/, только приправлено немножечко AJAX'ом.            
                    
                Илья, спасибо за ответ!
Вот здесь
[[~17]] — это id поля с ценой?
                    Вот здесь
<a href="[[~17]]?product=[[+id]]">Заказать</a>[[~17]] — это id поля с ценой?
                Нет, id страницы с формой            
                    
                В таком случае как передать цену и название товара?            
                    
                Так вот же, в сниппете
                    $productRes = $modx->getObject('modResource', $_GET['product']);
$product = $productRes->pagetitle;
$amount = $productRes->getTVValue('price');            
                Понял, прошу прощения )            
                    
                Илья, помогите разобраться с формой )
Не понимаю куда и как вставлять плейсхолдеры
Если можно пример.
Спасибо!
                    Не понимаю куда и как вставлять плейсхолдеры
Если можно пример.
Спасибо!
                Я не знаю, как еще объяснить… Тут проще будет самому настроить. У вас есть возможность выделить бюджет 3000 руб.? Если да, то скидывайте в личку доступы, я посмотрю.            
                    
                Выделить бюджет не могу (
Тружусь в веб студии… поэтому денег никто не даст )
Спасибо в любом случае… буду сам колупать
                    Тружусь в веб студии… поэтому денег никто не даст )
Спасибо в любом случае… буду сам колупать
                Илья, извините за назойливость…
Подскажите как мне сразу передать в форму заголок и цену товара (после нажатия на кнопку заказать)?
Вы мне написали пример сниппета, но в него передаются значения уже с формы
А как сразу в форму первично подставить заголовок и цену?
Заранее спасибо!
                    Подскажите как мне сразу передать в форму заголок и цену товара (после нажатия на кнопку заказать)?
Вы мне написали пример сниппета, но в него передаются значения уже с формы
А как сразу в форму первично подставить заголовок и цену?
Заранее спасибо!
                Скриптом, например:
                    //Проверяем на пустоту
if (!$("идентификатор_формы").val()) {
	$(this).val("Значение_по_умолчанию");
}            $productRes = $modx->getObject('modResource', $_GET['product']);
$product = $productRes->pagetitle;
$modx->setPlaceholder('product', $product); // Устанавливаем плейсхолдер с названием товара
$amount = $productRes->getTVValue('price');
$modx->setPlaceholder('amount', $amount); // Устанавливаем плейсхолдер с ценой
if (!$_POST['phone']) return;
$properties = $modx->resource->get('properties');
$orders = $properties['orders'];
if (!$orders) $orders = array();
$ordertId = count($orders) + 1;
$orders[$ordertId] = array(
        'num' => $ordertId,
        'amount' => $amount,
        'product' => $product,
        'phone' => $_POST['phone'],
        'paid' => 0
    );
$properties['orders'] = $orders;
$modx->resource->set('properties', $properties);
$modx->resource->save();
$form = $modx->getChunk('payForm', $orders[$ordertId]);
print $form;
die();И в форме эти поля будут доступны в соответствующих плейсхолдерах:
[[!createOrder]]
<h2>Вы собираетесь приобрести [[+product]]. Стоимость составляет [[+amount]] руб.</h2>
<form action="" method="post">
<input name="phone" />
</form>            
                Спасибо большое, буду пробовать!            
                    
                Илья, еще вопросик…
У меня TV поле цена считается со скидкой таким выражением
Если просто вставить то ничего не выводит.
Спасибо!
                    У меня TV поле цена считается со скидкой таким выражением
[[+num:decr=`[[*cena_proekta_doma]]`:mpy=`[[*sale_sticker]]`:div=`100`:add=`[[*cena_proekta_doma]]`]]как мне подставить в сниппет это выражение, чтобы скидка тоже учитывалась в форме?Если просто вставить то ничего не выводит.
Спасибо!
                Вот эти ТВ, видимо, относятся не к товару, а к категории.
Надо в начале сниппета получить этот ресурс (категорию) через getObject, получить значения соответствующих ТВ-шек через getTVValue, присвоить эти значения переменным.
А потом при присвоении $amount производить соответствующие вычисления.
Вот справочный материал: ilyaut.ru/xpdo/xpdo-for-dummies-part-4/
                    Надо в начале сниппета получить этот ресурс (категорию) через getObject, получить значения соответствующих ТВ-шек через getTVValue, присвоить эти значения переменным.
А потом при присвоении $amount производить соответствующие вычисления.
Вот справочный материал: ilyaut.ru/xpdo/xpdo-for-dummies-part-4/
                Спасибо большое!            
                    
                И еще не до конца понятно…
Я вешаю ссылку на форму для ввода данных и потом эта форма должна передать POST запросом данные для формы в чанке payForm?
В чанке payForm мне вставить код платежной системы?
                    Я вешаю ссылку на форму для ввода данных и потом эта форма должна передать POST запросом данные для формы в чанке payForm?
В чанке payForm мне вставить код платежной системы?
                Ставите MiniShop2, ставите mspWebpay.
Создаете свою форму покупки и плагин например на OnWebPageInit. В плагине ловите $_POST
инициализируете MiniShop2 и создаете заказ. Затем берете ссылку на оплату и отдаете пользователю.
На сайте будет выглядеть все прозрачно и без корзины — то что вам нужно, плюс вы практически ничего не модифицируете и пользуете стандартные компоненты и не теряете возможность обновления.
                    Создаете свою форму покупки и плагин например на OnWebPageInit. В плагине ловите $_POST
инициализируете MiniShop2 и создаете заказ. Затем берете ссылку на оплату и отдаете пользователю.
На сайте будет выглядеть все прозрачно и без корзины — то что вам нужно, плюс вы практически ничего не модифицируете и пользуете стандартные компоненты и не теряете возможность обновления.
                Спасибо за совет!
Но если бы все так просто было...)
Не силен я еще в апи modx
                    Но если бы все так просто было...)
Не силен я еще в апи modx
                разбирайтесь.
пример плагина с подобным функционалом gist.github.com/vgrish/e89d4ad2b708bafeae3b
                    пример плагина с подобным функционалом gist.github.com/vgrish/e89d4ad2b708bafeae3b
<?php
switch ($modx->event->name) {
	case 'OnWebPageInit':
		$isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) AND $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
		if (empty($_REQUEST['magic_action'])) {
			return;
		}
		$ctx = !empty($_REQUEST['ctx']) ? (string)$_REQUEST['ctx'] : 'web';
		if ($ctx != 'web') {
			$modx->switchContext($ctx);
		}
		/* @var miniShop2 $miniShop2 */
		$miniShop2 = $modx->getService('minishop2');
		$miniShop2->initialize($ctx, array('json_response' => $isAjax));
		if (!($miniShop2 instanceof miniShop2)) {
			@session_write_close();
			exit('Could not initialize miniShop2');
		}
		$cart = $miniShop2->cart;
		$order = $miniShop2->order;
		foreach ($_POST as $field => $value) {
			$value = $order->validate($field, $value);
			if (empty($value) OR (!$value)) {
				$response = $miniShop2->error('Вы должны заполнить требуемые поля', array($field => $value));
				@session_write_close();
		    exit($response);
			}
			$comment .= $field.": ".$value."\r\n";
			$properties[$field] = $value;
		}
		// set
		$id = $_POST['id'];
		$receiver = $_POST['receiver'];
		$email = $_POST['email'];
		$class = $_POST['class'];
		$count = $_POST['count'];
		if (!$modx->getCount('modResource', array('id' => $id, 'published' => 1, 'deleted' => 0))) {
			$response = $miniShop2->error('Данный билет нельзя приобрести!');
			@session_write_close();
		  exit($response);
		}
		// cart
		$cart->clean();
		$cart->add($id, $count, array(
			'receiver' => $receiver,
			'class' => $class,
		));
		$status = $cart->status();
		if (empty($status['total_count'])) {
			$response = $miniShop2->error('Ошибка инициализации покупки!');
			@session_write_close();
		  exit($response);
		}
		// order
		$order->clean();
		$order->set(array(
				'email' => $email,
				'receiver' => $receiver,
				'phone' => '',
				'delivery' => 1,
				'payment' => 3, // msMerchant
				'index' => ' ',
				'address' => ' ',
				'comment' => $comment,
				'properties' => $modx->toJSON($properties)
			)
		);
		$response = $miniShop2->order->submit(array(
			''
		));
		@session_write_close();
		exit($response);
		break;
}            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.