Перейти к содержимому


Отложенная оплата из личного аккаунта


  • Вы не можете ответить в тему
Сообщений в теме: 23

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 September 2012 - 07:25 PM

Дополнение Отложенная оплата из личного аккаунта. Позволяет оплатить оформленный заказ из личного кабинета заново выбрав способ оплаты.

Внимание! При отложенной оплате способ доставки не меняется, а остается тот же, который был выбран изначально при оформлении заказа.
Возможно, когда-то я сделаю и это, но пока не вижу надобности.


1. копируем файл

order_confirm.php -> core/includes/


2. в файле order_history.tpl.html в самое начало вставляем


{* BEGIN Отложенная оплата из личного аккаунта *}
{php}
$data = db_query("SELECT PID, name FROM ".PAYMENT_TYPES_TABLE." WHERE enabled=1 AND module_id>0 ORDER BY sort_order");
while ($row = db_fetch_assoc($data)) $pay[] = $row;
$this->assign("pay",$pay);
{/php}
{* END Отложенная оплата из личного аккаунта *}


а строчку


<td class="pad" align="left" valign="middle">{$user_orders[i].OrderStatus}</td>


заменяем на


{* BEGIN Отложенная оплата из личного аккаунта *}
{*<td class="pad" align="left" valign="middle">{$user_orders[i].OrderStatus}</td>*}
<td class="pad" align="left" valign="middle">
{$user_orders[i].OrderStatus}
{if $user_orders[i].statusID == $smarty.const.CONF_ORDER_CONFIRM_YES}
<select onchange="eval(this.value);">
<option>Оплатить</option>
{section name=p loop=$pay}
<option value="location.href='index.php?order_confirm=yes&paymentMethodID={$pay[p].PID}&orderID={$user_orders[i].orderID}'">{$pay[p].name}</option>
{/section}
</select>
{/if}
</td>
{* BEGIN Отложенная оплата из личного аккаунта *}



3. в файле order4_confirmation.php вместо строк


if ( isset ( $_GET["orderID"] ) && isset ( $_SESSION["newoid"] ) && ( int ) $_SESSION["newoid"] == ( int ) $_GET["orderID"] ) {
$paymentMethod = payGetPaymentMethodById($_GET["paymentMethodID"]);


вставляем


# BEGIN Отложенная оплата из личного аккаунта
#if ( isset ( $_GET["orderID"] ) && isset ( $_SESSION["newoid"] ) && ( int ) $_SESSION["newoid"] == ( int ) $_GET["orderID"] ) {
#$paymentMethod = payGetPaymentMethodById($_GET["paymentMethodID"]);
$data = db_query("SELECT orderID FROM ".ORDERS_TABLE." WHERE customerID=".regGetIdByLogin($_SESSION["log"]));
while ($row = db_fetch_assoc($data)) $orders[] = $row['orderID'];
if ( isset ( $_GET["orderID"] ) && (isset ( $_SESSION["newoid"] ) && ( int ) $_SESSION["newoid"] == ( int ) $_GET["orderID"] || in_array((int)$_GET["orderID"],$orders))) {
$paymentMethod = payGetPaymentMethodById($_GET["paymentMethodID"]);
db_query("UPDATE ".ORDERS_TABLE." SET payment_type='".$paymentMethod['name']."', paymethod=".$paymentMethod['PID']." WHERE orderID=".$_GET["orderID"]);
# END Отложенная оплата из личного аккаунта


comment к правке: я так и не понял, зачем привязывать процедуру оплаты к сессии - $_SESSION["newoid"] (чтобы кто-то левый не оплатил наш заказ?), но на всякий случай сделал аналогичную фишку - оплатить можно только свой заказ. ИМХО, оно нафиг не надо и правильнее убрать $_SESSION["newoid"] вообще.
Или я чего-то важного не замечаю.


4.1 в russian.php я заменил обещание "менеджер свяжется с вами" (как-то так, не в тему совершенно) на "Вы можете оплатить заказ позже из личного кабинета"
4.2 там же "личный аккаунт" заменен на "личный кабинет". Лично мне :) оно как-то привычнее и понятнее.
4.3 в админке в "Статусы заказов" изменил текст "Доставлен" на "Оплачен", тоже более понятно.

Прикрепленные файлы


  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 September 2012 - 12:33 PM

Как всегда, забыл отслеживать enabled :).
В код

$data = db_query("SELECT PID, name FROM ".PAYMENT_TYPES_TABLE." ORDER BY sort_order");

надо добавить WHERE enabled=1

Дополнение актуально ТОЛЬКО для "продаж без доставки", т.е. для продажи программного продукта

Что-то я конкретно протормозил. Дополнение актуально для любых товаров, просто при оплате "потом", из личного кабинета нельзя будет сменить ни способ доставки, ни адрес - ничего кроме способа оплаты. Ну так и фиг с ним, способ оплаты с остальными параметрами никак не пересекается.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#3 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 28 December 2012 - 12:19 PM

Привет я чтото не могу понять а как оплачивать из личного кабинета при отложенной оплате у меня появился список выбора вариантов оплаты а кнопки оплатить нет
  • -1

#4 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 28 December 2012 - 01:41 PM

После выбора системы оплаты появится кнопка :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#5 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 28 December 2012 - 06:55 PM

После выбора системы оплаты появится кнопка :).

все разобрался просто в хроме не работает
  • 0

#6 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 28 December 2012 - 08:02 PM

все разобрался просто в хроме не работает

Когда я это дополнение писал, то еще не знал, что <option onclick="..."> работает не во всех браузерах.
Надо заменить

<select>
<option value='0'>Оплатить</option>
{section name=p loop=$pay}
<option value='{$pay[p].PID}' onclick="location.href='index.php?order4_confirmation=yes&order_success=yes&paymentMethodID={$pay[p].PID}&orderID={$user_orders[i].orderID}'">{$pay[p].name}
</option>
{/section}
</select>

на

<select onchange="eval(this.value);">
<option value='0'>Оплатить</option>
{section name=p loop=$pay}
<option value='{$pay[p].PID}' value="location.href='index.php?order4_confirmation=yes&order_success=yes&paymentMethodID={$pay[p].PID}&orderID={$user_orders[i].orderID}'">{$pay[p].name}
</option>
{/section}
</select>

  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 30 December 2012 - 06:14 AM

хром и это не понимает у меня в хроме ничего не происходит с заменой во всех остальных нормально
  • 0

#8 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 31 December 2012 - 12:59 AM

хром и это не понимает у меня в хроме ничего не происходит с заменой во всех остальных нормально

Это довольно странно, т.к. обнаружив такой подвох при написании другого (не бесплатного) модуля я проверил решение во всех имеющихся браузерах, в том числе и в хроме. Да и описано это решение довольно давно, просто я не сталкивался.
Собственно, сейчас переделаю у себя именно этот модуль и проверю.

PS. Проверил. Вообще-то у меня оно нигде не работает. По простой причине - исходный старый value я из option не убрал и их теперь два. Правильный код (в хроме работает, проверил):

<select onchange="eval(this.value);">
<option>Оплатить</option>
{section name=p loop=$pay}
<option value="location.href='index.php?order4_confirmation=yes&order_success=yes&paymentMethodID={$pay[p].PID}&orderID={$user_orders[i].orderID}'">{$pay[p].name}
</option>
{/section}
</select>

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#9 dgimmibos

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 126 сообщений
Репутация: 12
Начинающий

Отправлено 11 March 2013 - 05:50 AM

В код

$data = db_query("SELECT PID, name FROM ".PAYMENT_TYPES_TABLE." ORDER BY sort_order");

надо добавить WHERE enabled=1

В каком файле правка?

3.1 в russian.php я заменил обещание "менеджер свяжется с вами" (как-то так, не в тему совершенно) на "Вы можете оплатить заказ позже из личного кабинета"
В таком случае после олаты заказы полностью, выведится снова эта надпись, так если уже оплатил.
  • 0

#10 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 11 March 2013 - 02:10 PM

В каком файле правка?

Это исправление к первому пункту инструкции.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#11 Pascal

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 46 сообщений
Репутация: 13
Начинающий

Отправлено 25 August 2013 - 10:39 PM

PID-а системы оплаты этого заказа


есть, поле "paymathod" в самом конце таблицы!
  • 0

#12 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 November 2013 - 06:06 PM

хе-хе... Второй год дополнению, много раз видел его установленным. И весьма странно, что никто из использующих не заметил вопиющей ошибки. При оформлении заказа в таблице ORDERS_TABLE этому заказу прописывается выбранная при оформлении система оплаты (поля payment_type и paymethod). Так вот если потом из личного кабинета оплатить заказ через ДРУГУЮ систему оплаты, причем имеющую "обратную связь" (вебмани, робокасса, единая касса, z-payment), то функция after_payment_php будет вызываться от той системы оплаты, которая была выбрана изначально.

1. На сайте не зафиксируется факт произведенной оплаты, т.е. заказ не сменит автоматически статус на "оплаченный".
2. С сайта системы оплаты придет емейл, что не удалось изменить статус оплаченного заказа либо еще что-либо про ошибку.
3. Если изначальная система оплаты не предполагает обратной связи (квитанция, счет) и функции after_payment_php в классе просто нет, то будет сообщение в error-логе о попытке вызова необъявленной функции.

При всем при этом никто ни разу об этом не написал кроме одного-единственного клиента только что, которому я писал отдельный класс под банковские карты (как раз без обратной связи, просто инструкция по оплате). Что, повторюсь, довольно странно.

Исправление:

Чуть ниже пункта (2) из стартовой инструкции есть строка

$paymentMethod = payGetPaymentMethodById($_GET["paymentMethodID"]);

после нее надо вставить строку

db_query("UPDATE ".ORDERS_TABLE." SET payment_type='".$paymentMethod['name']."', paymethod=".$paymentMethod['PID']." WHERE orderID=".$_GET["orderID"]);

  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#13 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 November 2013 - 06:57 PM

в моем модуле это уже давным давно предусмотрено ))
  • 0
Изображение Изображение Изображение

#14 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 31 January 2014 - 05:27 AM

хе-хе... Второй год дополнению, много раз видел его установленным. И весьма странно, что никто из использующих не заметил вопиющей ошибки. При оформлении заказа в таблице ORDERS_TABLE этому заказу прописывается выбранная при оформлении система оплаты (поля payment_type и paymethod). Так вот если потом из личного кабинета оплатить заказ через ДРУГУЮ систему оплаты, причем имеющую "обратную связь" (вебмани, робокасса, единая касса, z-payment), то функция after_payment_php будет вызываться от той системы оплаты, которая была выбрана изначально.

1. На сайте не зафиксируется факт произведенной оплаты, т.е. заказ не сменит автоматически статус на "оплаченный".
2. С сайта системы оплаты придет емейл, что не удалось изменить статус оплаченного заказа либо еще что-либо про ошибку.
3. Если изначальная система оплаты не предполагает обратной связи (квитанция, счет) и функции after_payment_php в классе просто нет, то будет сообщение в error-логе о попытке вызова необъявленной функции.

При всем при этом никто ни разу об этом не написал кроме одного-единственного клиента только что, которому я писал отдельный класс под банковские карты (как раз без обратной связи, просто инструкция по оплате). Что, повторюсь, довольно странно.

Исправление:

Чуть ниже пункта (2) из стартовой инструкции есть строка


$paymentMethod = payGetPaymentMethodById($_GET["paymentMethodID"]);

после нее надо вставить строку

db_query("UPDATE ".ORDERS_TABLE." SET payment_type='".$paymentMethod['name']."', paymethod=".$paymentMethod['PID']." WHERE orderID=".$_GET["orderID"]);

Чтото накатил данное исправление а теперь в админке перестало отображаться какой оплатой произвели

Прикрепленные файлы


  • 0

#15 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 31 January 2014 - 10:38 AM

Чтото накатил данное исправление а теперь в админке перестало отображаться какой оплатой произвели

Ну что тут скажешь. Чудеса.
Ни один из затрагиваемых дополнением файлов не используется в админке :).

PS. Я нашел еще одну ошибку. Например, при выборе способа оплаты "Счет" перед генерацией счета надо заполнить поля названия организации и ИНН. Штатно они заполняются на последней странице оформления заказа, а при отложенной оплате не заполняются вообще, что не правильно. Исправить-то я это уже исправил, все руки не доходят выложить исправление.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 31 January 2014 - 11:54 AM

Откатил назад но всеравно перестало в таблицу заносится поле payment_type вариант оплаты, блин ерунда какаято кроме этого исправления ниодного файла больше не трогал, в чем проблема
  • 0

#17 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 31 January 2014 - 12:22 PM

Исправить-то я это уже исправил, все руки не доходят выложить исправление.

Руки дошли. Выложил новую версию со всеми исправлениями в шапку.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#18 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 31 January 2014 - 03:55 PM

Раз уж руки дошли, то проверь еще один нюанс, почему то я уверен, что он не предусмотрен

пользователь меняет метод оплаты -> и переходит на страницу оплаты
потом меняет на другой статус -> но оплачивает по первому методу
и как следствие заказ после оплаты не примет статус оплаченного
:)
  • 0
Изображение Изображение Изображение

#19 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 31 January 2014 - 05:01 PM

пользователь меняет метод оплаты -> и переходит на страницу оплаты потом меняет на другой статус -> но оплачивает по первому методу

Я не понял, какой статус меняет пользователь после перехода на страницу оплаты.
Давай по шагам.
1. пользователь заходит в личный кабинет и выбирает метод оплаты.
2. после выбора метода идет переход к САМОЙ последней странице, где уже "менеджер свяжется с Вами..." и либо кнопка на внешнюю систему оплаты, либо всплывающее окно со счетом/квитанцией, либо еще что-то (короче, HTML-код, отдаваемый функцией after_processing_html()).
О какой смене статуса (и в какой момент) речь?

PS. Может, ты не статус имеешь в виду, а вот это - http://vsupport.club...dpost__p__28803 ?
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#20 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 31 January 2014 - 06:05 PM

1. пользователь заходит в личный кабинет и выбирает метод оплаты. 2. после выбора метода идет переход к САМОЙ последней странице, где уже "менеджер свяжется с Вами..." и либо кнопка на внешнюю систему оплаты, либо всплывающее окно со счетом/квитанцией, либо еще что-то (короче, HTML-код, отдаваемый функцией after_processing_html()).

дальше пользователь преходит к оплате, оставляет ее на 10-40 минут
потом опять случайно заходит в личный кабинет, и выбирает другой способ оплаты, но оплачивает через первую вкладку
логика : покупатель оплачивает по первому методу, когда у заказа уже выставлен другой способ оплаты
поверь, так бывает
  • 0
Изображение Изображение Изображение