Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Модуль оплат своими руками


Recommended Posts

Модуль оплат своими руками или как сделать платежный модуль (плагин) для магазина.

 

Определения

Заказ - это то что создано в магазине из корзины покупок

Счет - это то что создано в платежной службе для данного заказа для оплаты. Таким обрзом у одного заказ можжет быть создано несколько счетов в разных платежных службах, хотя олпачен должен быть только один.

 

В openStore

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

файл

catalog\controller\payment\MY_MODULE.php

в котором должны быть заданы 3 функции

index - создает кнопку для вызова оплаты

pay - создает заказ и запускает создание счета для него и перенаправление покупателя на созданный счет

callback - сюда принимаем уведомление о поступивших платежах из платежного сервиса

 

в OpenStore функция index выглядит так

 
class ControllerPaymentMyModule extends Controller {
	protected function index() {
		// страницу окончания создания заказа свою грузим
		$this->data['action'] = $this->url->link('payment/MY_MODULE/pay');
	
		// добавили этот шаблон в общую папку
		$tpl = '/template/common/payment_confirm.tpl';
		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . $tpl) ) {
			$this->template = $this->config->get('config_template') . $tpl;
		} else {
			$this->template = 'default' . $tpl;
		}
				
		$this->render();
	}

а файл /template/common/payment_confirm.tpl

содержит:

<div class="buttons">
	<div class="right">
		<a href="<?php echo $action; ?>" class="button" ><?php echo $button_confirm; ?></a>
	</div>
</div>

И для закрытия корзины и создания заказа вызывается функция index вашего модуля через ссылку.

Обычно она вида payment/MODULE_NAME

 
 

 

==========

 

 

MAKE BILL

Итак, после того как Вы выбрали способ оплаты вызывается его MODULE_FUNCTION функция. При этом данная функция должна:

  1. создать заказ (insert order) из корзины - это делается вызовом встроенной функции payment/checkout/insert При этом необходимо задать новый статус заказа (до этого статус был = 0 и поэтому такой заказ не показывался ни где) и записать в созданный заказ данные об созданном счете. Статус заказа желательно установить в 1 (Ожидание)

  2. очистить корзину

  3. создать счет на оплату в выбранной платежной службе

  4. записать данные о созданном счете в историю заказа (update order) - используем встроенную команду update

  5. пере-направить покупателя на созданный счет

 

GET NOTE

Так же в платежном модуле должна быть функция принимающая уведомления от платежной службы об оплате, как правило она называется callback(). Эта функция должна:

  1. получить данные

  2. проверить их на достоверность используя спообы защиты.

  3. занести информацию в заказ. Это делается встроенной функцией update - при этом желательно записать дополнительную информацию об оплате - какая платежная служба, какой аккаунт принял деньги на  какую дату-время, в какой валюте и сколько.,

При этом если от службы пришло уведомление об оплате счета для заказа:

  • со статусом 0 - поидее такой заказ вообще существует как корзина и по нему не нужно принимать уведомления

  • со статусом 1 (ожидание) - если пришло уведомление о полной оплате счета то перевести заказ на  статус 2 (обработка) - командой update

  • со статусом 2 (обработка) - добавить смену статуса от платежной службы (например от cryptoPay.in приходят новые статусы для счета - об подтверждении сетью)

  • с ругими статусами - добавить информацию но не менять статус. Это вызвано тем что заказ моожет быть отмене или возвращен, поэтому статус заказа менять нельзя

 

RE ASK NOTE

Еще надо дать возможность пользователю самостоятеьно проверить статус оплаты счета, так как иногда бывает что что-то пошло не так и пллатежная служба не смогла уведомить магазин о посупившем платеже. Так же это нужнно если уведомления вообще не настроены. Это дделается очень просто - создается кнопка в истории заказа в которую вставляем ссылку на функцию,, которая будет опрашивать платежную службу.

 

Нюансы

Когда заказ создан - он может быть оплачен разными платежными службами - клиент может создать по счету в каждой платежной службе и оплатить один из них. Поэтому при вызове функции MODULE_FUNCTION создания счета в данной службе необходимо проверить - может быть уже заказ в магазине создан из корзины.

Еще один нюанс - когда платежная служба не поддерживает оплату по счетам, а только пополнение на аккаунт пользователя с высылкой соотвествующих уведомленний в магазин. Например Яндекс.Деньги для физических лиц - работает только с аккаунтами своих пользователей. Поэтому когда приходит оплата ао данному заказу, то необходимо проверить - какая сумма пришла,, и если сумма пришла недостаточнная то перевести ее на депозит пользователя в магазине. А если сумма платежа равна или больше суммы заказа, то заказ перевести в статус 2 (обработка - оплаче) и остаток перевести на депозит покупателя в своем магазине.

 

DEPOSITE

Еще один способ оплаты заказов - через пополнение внутреннего депозита в магазине. При этом счет не создается, а просто если досточно средств на депозит, то он получает статус 2 (обработка) и с депозита покупателя списывается сумма

 

Пополнение депозита через платежные службы:

  1. надо задать признак, по которому данная платежная служба подходит для пополнения депозита

  2. В личном кабинете пользователя создаем кнопку - Пополнить депозит

  3. При выборе платежной службы, в ней создается счет с 0-й ценой, который можно поплннять бесконечно долго

  4. при приходе денег на такой счет платежная служба уведомляет магазин о поплнении

  5. магазин сохраняет данные в свою базу, при этом дублирующие поступления игнорируются

При интеграции своего модуля не забываем что название счета для оплаты депозита пользователя выглядит так:

 

DEP3456 - где,

3456 - номер пользователя, DEP - приставка указывающая на то что это счет для депозита.

 

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

если есть какие идеи - пишите

 

Разработал модуль - Muli_Pay - в нем же модуль для депозитов

и к нему модуль для Яндекса и для биткоинов и в нем же библиотека multi_pay_tools

Надіслати
Поділитися на інших сайтах

Библиотека для быстрого написания своего платежного модуля

\catalog\model\payment\multi_pay_tools.php

 

При интеграции своего модуля не забываем что название счета для оплаты депозита пользователя выглядит так:

DEP3456 - 3456 - номер пользователя, DEP - приставка указывающая на то что это счет для депозита

 

полезные функции

 

Для платежных сервисов, которые поддерживают создание счетов

 

order_confirm

	public function order_confirm($order_id, $description='', $order_info=false)

при вызове вашего модуля - первым делом надо создать заказ, для этого как раз и пригодится эта функция

она проверяет - был ли создан заказ ранее -если да, то вызов игнорируется

иначе заказ получает статус 1 а корзина очищается

 

 

order_bill_make

	public function order_bill_make($order_id, $order_info, $description='') {

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

Нам необходимо запомнить данный номер счета - это и выполняет данная функция.

При этом в переменной $description задаем ссылку на счет в службе, имя службы и другую информацию

Если статус заказ не равен 1 то вызов функции игнорируется

 

 

order_bill_update

	public function order_bill_update($order_id, $order_info, $new_status_id, $description='') {

когда информация о счете поменялась - например пришло уведомление об оплате или об просрочке по счету, необходимо записать эту информацию в историю заказ и поменять статус заказа. Это выполняет данная функция. Причем если статус заказ не 1 и не 2 то статус не будет изменен. Если пришло уведомление что счет оплачен полностью то передаем в new_status_id = 2. Однако, если статус заказ не был равен 1 то смены статуса уже не произойдет

 

 
Для платежных сервисов, которые не поддерживают создание счетов
(например электронные деньги для физических лиц - Яндекс.Деньги и КИВИ)
 
add_payment
public function add_payment($service_cod, $service_account, $operation_id,  $datetime, $curr,
$amount, $order_id, $customer_id, $description) {

Когда Ваш модуль получил уведомление от платежной службы, что на ваш аккаунт зачисленна некая сумма с неким комментарием, то нужно определить - это сумма для оплаты некоего заказ? этой суммы хватило для оплаты? Если суммы хватило то закрываем данный заказ, а остаток суммы заносим на депозит покупателя. Если суммы недостаточно, всю ее заносим на депозит. Для этой цели используем данную функцию. В добавок данная функция проверит - если такая транзакция (код-службы + код-аккаунта + код-операции) уже обрабатывалась данной функцией то уведомление будет проигнорировано, если нет, то запишет эту транзакцию в свою таблицу.

 

 

update_deposit

	public function update_deposit($customer_id, $amount, $description) {		

Если надо добавить транзакцию в депозит покупателя, то используем эту функцию

Надіслати
Поділитися на інших сайтах

Помошник helper

еще модуль Multi Pay имеет файл помошник

system\helper\multi_pay.php

полезные функции которого можно продемонстрировать на коде:

	protected function index() {
		$this->load->helper('multi_pay');
		// берется из стадартного языка  $this->load->language('payment/multi_pay_dep');
		$this->data['button_confirm'] = $this->language->get('button_confirm');
		// страницу окончания создания заказа свою грузим
		$this->data['action'] = $this->url->link('payment/multi_pay_dep/pay');
	
		// добавили этот шаблон в общую папку
		$this->template = _tpl('/template/common/payment_confirm.tpl', $this->config->get('config_template'));
				
		$this->render();
	}
 
// добавили этот шаблон в общую папку
$this->template = _tpl('/template/common/payment_confirm.tpl', $this->config->get('config_template'));
 

 

_url - создать ссылку из текущей ссылки, например для запоминания ее в кэше для возврата на нее после регистрации в магазине

_g - легкий способ выбрать значение массива или взять по умолчанию

_tpl - легкий способ задать template

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.