• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Решено Оплата после подтверждения заказа

svist63

Новичок
Всем привет! Только разбираюсь в работе вууком. И сталкиваюсь видимо не я один с такой ситуацией. Логика работы магазина - товар собирается по списку. Наличие выбранного товара клиентом пока не известно. Т.е. клиентом формируется заказ из большого ассортимента (более 10000), есть различные аналоги и прочее, возможно что-то потом уточняется, предлагается аналог, список редактируется админом. После сбора заказа предполагается оплата наличкой при получении, наложенный платеж, оплата банковскими картами через платежный шлюз "Тинькофф". Работаю по БСО (бланки строгой отчетности). Онлайн касса пока не требуется. Предполагается самовывоз, доставка по городу, доставка почтой России. Если стандартно ставить платежный шлюз Тинькофф, то после сбора заказа и перевода его в ожидание оплаты, оплатить его через платежный шлюз Тинькофф не получается , так как выдает сообщение, что корзина пуста. Оплата возможна только через шлюз PayPal. И со многими сторонними шлюзами так по видимому. Тут похоже постарались только разработчики вууком пока. Нашел некоторое решение. Хотелось бы что бы оценили, пнули в нужном направлении, посоветовали...
Активными сделал щлюзы "Безналичный перевод" (bacs) переименовав в "Оплата банковскими картами" и "Оплата при доставке"(cod) переименовав в "Оплата наличными".
Клиент выбирает товар, оформляет заказ, выбирает способ оплаты. На этой стадии заказ переходит в статус "Обработка". Хотя у меня он после плагина (YITH Pre-Order for WooCommerce) стал переходить с самого начала по умолчанию "На удержание", не смотря на то, что я его удалил. А это мне на руку )) Т.е. он находится на удержании. И если выбран "Безналичный перевод" (bacs) т.е. "Оплата банковскими картами" необходимо потом оплатить картой. Решение такое:

в functioms.php добавляем
function exec_php($matches){
eval('ob_start();'.$matches[1].'$inline_execute_output = ob_get_contents();ob_end_clean();');
return $inline_execute_output;
}
function inline_php($content){
$content = preg_replace_callback('/\[exec\]((.|\n)*?)\[\/exec\]/', 'exec_php', $content);
$content = preg_replace('/\[exec off\]((.|\n)*?)\[\/exec\]/', '$1', $content);
return $content;
}
add_filter('the_content', 'inline_php', 0);

После этого мы можем на странице WP вставлять исполняемый код PHP между [exec] и [/exec]. Создаем в WP страницу "Оплата", на которой можно описать условия оплаты, возврата и прочее. Сделаю небольшое отступление у Тинькофф есть виджет, который позволяет вызвать форму для оплаты картой, при этом клиенту придет письмо с подтверждением оплаты. Туда необходимо передать необходимые данные. Набросал пока так на странице "Оплата"

<script src="https://securepay.tinkoff.ru/html/payForm/js/tinkoff.js"></script>
<script type="text/javascript">
function makePayment(amount, orderId, description, name, email, phone) {
var params = {
//Код терминала (обязательный параметр), выдается банком.
TerminalKey: "12345674890",
//Сумма заказа в копейках (обязательный параметр)
Amount: amount,
//Номер заказа (если не передан, принудительно устанавливается timestamp)
OrderId: orderId,
//Описание заказа (не обязательный параметр)
Description: description,
//Дополнительные параметры платежа
DATA: "Email=" + email + "|Phone=" + phone + "|Name=" + name,
//Флаг открытия платежной формы во фрейме
Frame: true
};
doPay(params);
}
</script>

<style> .tinkoffPayRow { display: block; margin: 1%; width: 160px; } </style>
Оплата заказа
<form name="TinkoffPayForm">

[exec]
$nm_payOrder = $_GET['payOrder'];
/* проверяю, передаются ли параметры, если да, то отображаю кнопку ну и прочую инфу для опалты, если нет, то блока этого не будет на странице */
{
Код страницы написан кратко, без украшательств, описания и прочего, для понимания логической части и самой реализации. В двух словах - вставляется скрипт по обработке отправляемых параметров в Тинькофф. Эти параметры передаются в эту форму из письма, которое отправляется из админки по данному заказу. А именно в правом верхнем углу "Заказ действий" - "Отправить эд.почтой детали счета/заказа клиенту". Сам шаблон в админке находится "Настройки"-Емайлы-Детали счета/заказа клиенту, которое копируется в "название_темы/woocommerce/emails/customer-invoice.php". В самом шаблоне вставляем след код перед * Hook for the woocommerce_email_order_details.
<?php
$buffer.= '<a href="';
$buffer.= 'http://site/oplata/?paySum='.esc_html( $order->calculate_totals() );
$buffer.= '&payOrder='.esc_html( $order->get_order_number() );
$buffer.= '&payName='.esc_html( $order->get_formatted_billing_full_name() );
$buffer.= '&payEmail='.esc_html( $order->get_billing_email() );
$buffer.= '&payPhone='.esc_html( $order->get_billing_phone() );
$buffer.= '">site/oplata</a>';
echo $buffer;
?>

В итоге после того, как заказ готов, мы отправляем эл.почтой счет на оплату клиенту. В письме перед таблицей в самом начале есть ссылка на сайт на страницу оплаты. Получается что-то типа http://site/oplata/?paySum=700.00&payOrder=69&payName=Саша\tПупкин&payEmail=user@mail.ru&payPhone=79000000000 А так как параметры мы передаем, то на странице оплату проводим через виджет Тинькофф. При отправке письма на оплату следует заметить, что в письме будут разные заголовки будут, если разные статусы заказа "На удержании" и "Обработка".
В идеале мне хотелось сохранить шаблон исполняего кода в название_темы/woocommerce/..... в котором бы бы код из письма по формировании строки с параметрами автоматом прописывать туда, где в админке в правом нижнем углу "Добавить заметку" - заметка для клиента, при смене статуса заказа. Т.е. меняем статус допустим с "На удержании" на "Обработка" и для клиента добавляется заметка, где ссылка на страницу оплаты с параметрами. Но пока я чет туплю. Если кто осилил мое написание, может подскажет куда мне копать? Давно занимался программированием, сча вспоминаю ))


Протупил, а точнее не до конца все почитал.
Скопировал шаблон письма "Настройки"-Емайлы-Заказ в обработке в "название_темы/woocommerce/emails/customer-invoice.php
в этом шаблоне добавил код

<?php
$buffer.= '<a href="';
$buffer.= 'http://site/oplata/?paySum='.esc_html( $order->calculate_totals() );
$buffer.= '&payOrder='.esc_html( $order->get_order_number() );
$buffer.= '&payName='.esc_html( $order->get_billing_first_name()).' '.esc_html( $order->get_billing_last_name() );
$buffer.= '&payEmail='.esc_html( $order->get_billing_email() );
$buffer.= '&payPhone='.esc_html( $order->get_billing_phone() );
$buffer.= '">site/oplata</a>';
$buffer.= '<br><input type="button" value="Оплатить"><br>';
echo $buffer;
$order->add_order_note($buffer,1,false);
$order->save();
?>
перед <p><?php _e( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

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


Короч, седня уделил много воспоминнаний, стараний и прочего... вылилось в то что что на страницу оплаты передается номер заказа 'http://site/oplata/?payOrder=62 или 60 или 15. Просто передать странице оплата число. На странице этот номер проверяется. Существует заказ? Его стоит оплачивать? Оплачиваем. Думал о строках заказа, но у меня онлайн кассы нет. Мне чек не нужен. Я БСО высылаю в ПДФ + бумажный.
В самом конце можно просто вставить обычный код. Все немного так себе, есть возможно им блаблблбва будет работать примерно так вашсайт/страницаоплаты?payOrder=62
________________________________________________________________________________________________________________________
[exec]
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$nm_payOrder = $_GET['payOrder'];
if (trim($nm_payOrder)<>"") {
try {
$order = new WC_Order($nm_payOrder); // пытаемся создать объект за номером, который передаем в браузере
} catch (Exception $e) {
echo "Заказ №".$nm_payOrder.' не найден.';
exit;
}
$status = $order->get_status();
if (! strcasecmp($status, 'processing')){ //проверяем статус заказа - если он в обработке, то видимо ждем оплты, иначе не нужно оплачивать
echo 'Заказ №'.$nm_payOrder.' не нужно оплачивать';
exit;
}else{
$nm_paySum = $order->calculate_totals(); // общая сумма заказа, кста, совсем забыл про доставку и скидку..... тут ее нет
$nm_payName = esc_html( $order->get_billing_first_name() ).' '.esc_html( $order->get_billing_last_name() );
$nm_payEmail = esc_html( $order->get_billing_email() );
$nm_payPhone= esc_html( $order->get_billing_phone() );
// ниже обычная форма виджета, привел к стандарту, что уних на сайте
$bufer = '<style>.tinkoffPayRow{display:block;margin:1%;width:160px;}</style>';
$bufer .= '<script src="https://securepay.tinkoff.ru/html/payForm/js/tinkoff_v2.js"></script>';
$bufer .= '<form name="TinkoffPayForm" onsubmit="pay(this); return false;">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="terminalkey" value="TinkoffBankTest">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="frame" value="true">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="language" value="ru">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="amount" value="'.$nm_paySum.'">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="order" value="'.$nm_payOrder.'">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="description" value="Электронные компоненты по заказу">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="name" value="'.$nm_payName.'">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="email" value="'.$nm_payEmail.'">';
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="phone" value="'.$nm_payPhone.'">';

/* вот тут я бы уделил внимание и много... хрень полная. я так и не понял... жуть..... апперкейс проверяйие!! без блока работает. с блоком хромает жутко
$bufer .= '<input class="tinkoffPayRow" type="hidden" name="receipt" value='{"Email": "'.$nm_payEmail.
'","Phone":"'.$nm_payPhone.'","Taxation":"usn_income","Items":[';
foreach( $order->get_items() as $item_id => $item_product ){
$product = $item_product['name'];
$quantity = $item_product['quantity'];
$subtotal = $item_product['subtotal'];
$price = $subtotal / $quantity;
$bufer .= '{"Name":"'.$product.'",';
$bufer .= ' "Price":'.$price.'",';
$bufer .= ' "Quantity":'.$quantity.'",';
$bufer .= ' "Amount":'.$subtotal.'","Tax": "none"},';
}
$bufer = substr ($bufer,0,-1).']}'>';
*/
$bufer .= '<input class="tinkoffPayRow" type="submit" value="Оплатить">';
$bufer .= '</form>';

echo $bufer ;
}
}
[/exec]
"А туту можно просто писать что либо. Да пусть что угодно. Скопируйте и вставьте на страницу оплаты, форматируйте и блаблабла. " можно и перед. Пох.
конечный код
если чистый код и без параметров, то пустая страница, если передать номер заказа, что в состоянии обработки, то оплачивать, остальное либо есть, но не надо либо нет такого. остальное сами )))
тестирование платежей и параметры тут https://oplata.tinkoff.ru/landing/develop/test
я юзер, к тинкофф не имею отношения ))


гы- обнаружил интересный факт, если номер заказа 0 или меньше типа -1 , -2 )))
сц..к , где же мои финансовые потоки... )))
кстати, еслим кто юзает код, тинькофф, что в самом начале в явескрипт и далее, то после обнов вордпресса это все слетает и даже рушится код на странице. Сам с этим столкнулся. Поэтому на всякий пожарный привел все к знаменателю текущему. Хотя на сайте у меня все по старому. http://www.master-svist.ru/?page_id=425
На самом деле инет эквайринг помогает сэкономить. Я приезжаю к клиенту и без терминала, без торгового эквайринга выписываю бсо, который заказываю на фабрике БСО http://fabso.ru/http://fabso.ru/ , там самые низкие цены по России. Я пробил, где они находятся. Нормально все там. А клиенту без онлайн кассы можно отправлять Каитанцию, если ты на БСО. Мне налоговая так и ответила - клиенту необходимо выдать электронный или бумажный вариант. Т.е. я могу согласно их письма выслать сам в электронке БСО. Пока так. Вряд ли подтянут ИПэшников на покопуку онлайн касс. Им столько трудов стоило вынуть из тени ... Нагрузить еще - 70-80% потеряют. А сформировать ипешнику можно хоть из бизнеспак... там есть редактор, где можно и печать вставить и подпись... и форму редактировать.. и номер квитанции БСО. У меня чисто случайно оказалось в деятельности продажа через инет или почтой.. )) Я готов делится тем, что имею. мой сайт 0000053.ru или master-svist.ru.На нем я обхожу торговый эквайринг. Я приезжаю к клиенту со смартфоном, он оплачивает картой со смартфона, с компьютера, не важно... мои услуги. Выписываю квитанцию и все. Хочу подсказать, что если вы ИП и у вас договор, то стоимость наложенного платежа снижается с 250 до 50 р. Пока не протестил. Но обещают.
Кстати, подскажу вещь, которую пока не видел ни где. тестировал сам. понравилось. Смысл
есть строка поиска, которая передается и все, что ищут записывать в базе. Я для теста раз создал каталог в 16000 наименований. Была структура и прочее. И помимо всего была строка поиска, в которой человек мог ввести свои необходимые данные или параметры. А ниже было два списка. Один наполнен топ-100 последних запросов, второй топ-100 самых популярных запросов. Т.е. чел мог просто кликнуть по списку и не вводить свои данные. Все вываливалось из базы. И при каждом клике все так же записывалось в базу. Некий рейтинг запросов. Для продавца удобно - знаешь, что хотят люди. Людям удобно - в топе то, что ищут другие. Для вас открыл страницу - каталог. Все сформировано , структуировно и обработано по чужому прайсу. Т.е.моей редакции в названиях, и группах товара нет абсолютно. Все как есть из таблицы. Просто потом доработаны запросы, фильтры и прочее... Каждый клик по списку + к карме запроса.... ) Т..е. абсолютно все чужой прайс на базе access. http://www.master-svist.ru/?page_id=689 По сути я торгую этим же товаром этой конторы по их же ценам. Мои терки с ними дело пятое. 16000 наименований с базой... пока думаю. + своя отчетность. Пока в воздухе все короче. Но мал по малу двигаюсь ))
не ради хвастать, ради , что бы двигать
 
Последнее редактирование:
Сверху Снизу