Форма оплаты
Добрый день!
Встала задача создать форму оплаты с последующей отсылкой данных в платежную систему (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;
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.