Форма оплаты

Добрый день!

Встала задача создать форму оплаты с последующей отсылкой данных в платежную систему (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 формы в одну объединить?

Заранее спасибо!
Алексей
25 ноября 2015, 11:03
modx.pro
5
3 449
0

Комментарии: 21

Илья Уткин
25 ноября 2015, 19:57
+1
1) Можно сделать кнопку «Заказать» ссылкой, в которую подставлять данные товара. Например, так:
<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
    Илья Уткин
    25 ноября 2015, 20:01
    0
    Примерно так сделана форма у меня на сайте https://ilyaut.ru/pay/, только приправлено немножечко AJAX'ом.
    Алексей
    25 ноября 2015, 20:22
    0
    Илья, спасибо за ответ!

    Вот здесь
    <a href="[[~17]]?product=[[+id]]">Заказать</a>

    [[~17]] — это id поля с ценой?
      Илья Уткин
      25 ноября 2015, 21:09
      0
      Нет, id страницы с формой
        Алексей
        25 ноября 2015, 21:11
        0
        В таком случае как передать цену и название товара?
          Илья Уткин
          25 ноября 2015, 21:13
          0
          Так вот же, в сниппете
          $productRes = $modx->getObject('modResource', $_GET['product']);
          $product = $productRes->pagetitle;
          $amount = $productRes->getTVValue('price');
            Алексей
            25 ноября 2015, 21:17
            0
            Понял, прошу прощения )
      Алексей
      27 ноября 2015, 10:08
      0
      Илья, помогите разобраться с формой )

      Не понимаю куда и как вставлять плейсхолдеры

      Если можно пример.

      Спасибо!
        Илья Уткин
        27 ноября 2015, 11:58
        0
        Я не знаю, как еще объяснить… Тут проще будет самому настроить. У вас есть возможность выделить бюджет 3000 руб.? Если да, то скидывайте в личку доступы, я посмотрю.
          Алексей
          27 ноября 2015, 12:11
          0
          Выделить бюджет не могу (

          Тружусь в веб студии… поэтому денег никто не даст )

          Спасибо в любом случае… буду сам колупать
            Алексей
            01 декабря 2015, 10:20
            0
            Илья, извините за назойливость…

            Подскажите как мне сразу передать в форму заголок и цену товара (после нажатия на кнопку заказать)?

            Вы мне написали пример сниппета, но в него передаются значения уже с формы

            А как сразу в форму первично подставить заголовок и цену?

            Заранее спасибо!
              Максим Кузнецов
              01 декабря 2015, 14:21
              0
              Скриптом, например:

              //Проверяем на пустоту
              if (!$("идентификатор_формы").val()) {
              	$(this).val("Значение_по_умолчанию");
              }
                Илья Уткин
                01 декабря 2015, 15:37
                0
                $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>
                  Алексей
                  01 декабря 2015, 15:43
                  0
                  Спасибо большое, буду пробовать!
                    Алексей
                    02 декабря 2015, 11:19
                    0
                    Илья, еще вопросик…

                    У меня TV поле цена считается со скидкой таким выражением

                    [[+num:decr=`[[*cena_proekta_doma]]`:mpy=`[[*sale_sticker]]`:div=`100`:add=`[[*cena_proekta_doma]]`]]
                    как мне подставить в сниппет это выражение, чтобы скидка тоже учитывалась в форме?

                    Если просто вставить то ничего не выводит.

                    Спасибо!
                      Илья Уткин
                      02 декабря 2015, 13:18
                      0
                      Вот эти ТВ, видимо, относятся не к товару, а к категории.
                      Надо в начале сниппета получить этот ресурс (категорию) через getObject, получить значения соответствующих ТВ-шек через getTVValue, присвоить эти значения переменным.

                      А потом при присвоении $amount производить соответствующие вычисления.

                      Вот справочный материал: ilyaut.ru/xpdo/xpdo-for-dummies-part-4/
                        Алексей
                        02 декабря 2015, 13:27
                        0
                        Спасибо большое!
              Алексей
              27 ноября 2015, 10:50
              0
              И еще не до конца понятно…

              Я вешаю ссылку на форму для ввода данных и потом эта форма должна передать POST запросом данные для формы в чанке payForm?

              В чанке payForm мне вставить код платежной системы?
                Володя
                27 ноября 2015, 12:08
                0
                Ставите MiniShop2, ставите mspWebpay.
                Создаете свою форму покупки и плагин например на OnWebPageInit. В плагине ловите $_POST
                инициализируете MiniShop2 и создаете заказ. Затем берете ссылку на оплату и отдаете пользователю.
                На сайте будет выглядеть все прозрачно и без корзины — то что вам нужно, плюс вы практически ничего не модифицируете и пользуете стандартные компоненты и не теряете возможность обновления.
                  Алексей
                  27 ноября 2015, 12:14
                  0
                  Спасибо за совет!

                  Но если бы все так просто было...)

                  Не силен я еще в апи modx
                    Володя
                    27 ноября 2015, 12:18
                    +1
                    разбирайтесь.
                    пример плагина с подобным функционалом 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;
                    }
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  21