mirror of
https://github.com/valitydev/rbkmoney-cms-netcat.git
synced 2024-11-06 01:35:18 +00:00
исправлена логика рекуррентов - теперь регулярные оплаты происходят только после подтверждения покупки + некоторые исправления
This commit is contained in:
parent
de60986357
commit
f9aa3e1c49
16
README.md
16
README.md
@ -1,12 +1,12 @@
|
||||
1. Скачайте и установите NetCat на сервер (https://netcat.ru/democentre).
|
||||
2. Переместите папку netcat/modules в /netcat/modules с заменой файлов
|
||||
3. Зайдите на страницу по адресу http://ваш_сайт/netcat/modules/rbkmoney/install.php
|
||||
4. После установки модуля нужно заполнить необходимые поля для его корректной работы.
|
||||
Сделать это нужно через админку в настройках модуля (http://ваш_сайт/netcat/admin)
|
||||
Настройки>Управление модулями, знак шестеренки напротив названия модуля.
|
||||
После заполнения полей нажмите кнопку сохранить в конце страницы
|
||||
5. Перейдите в настройки модуля Интернет-магазин (Настройки>Интернетмагазин), в меню слева выберите пункт Настройки->Оплата.
|
||||
2. Установите модуль RBKmoney (Инструменты->Установка модуля).
|
||||
После установки необходимо перезагрузить страницу.
|
||||
3. Далее нужно заполнить необходимые поля для корректной работы модуля.
|
||||
Сделать это можно через админку в настройках модуля (http://ваш_сайт/netcat/admin)
|
||||
Настройки>Управление модулями, знак шестеренки напротив названия модуля.
|
||||
После заполнения полей нажмите кнопку сохранить в конце страницы.
|
||||
4. Перейдите в настройки модуля Интернет-магазин (Настройки>Интернетмагазин),
|
||||
в меню слева выберите пункт Настройки->Оплата.
|
||||
Добавьте новый способ оплаты с указанием платежной системы RBKmoney (кнопка "Добавить" внизу страницы).
|
||||
6. Также, для работы модуля необходимо заполнить ставки НДС у товаров в магазине.
|
||||
|
||||
Настройка окончена, теперь при оплате товаров среди способов оплаты будет выводится RBKmoney
|
@ -29,6 +29,7 @@ define('ERROR_HOLD_STATUS_IS_NOT_VALID', 'Invalid value of the `holdStatus` para
|
||||
define('ERROR_SUCCESS_URL_IS_NOT_VALID', 'Invalid value of the `successUrl` parameter');
|
||||
define('ERROR_PAYMENT_TYPE_IS_NOT_VALID', 'Invalid value of the `paymentType` parameter');
|
||||
define('ERROR_HOLD_EXPIRATION_IS_NOT_VALID', 'Invalid value of the `holdExpiration` parameter');
|
||||
define('ERROR_AMOUNT_IS_NOT_VALID', 'Invalid value of the `amount` parameter');
|
||||
define('ERROR_TAX_RATE_IS_NOT_VALID', 'Invalid value `VAT rate` for product: ');
|
||||
define('PAYMENT_TYPE_HOLD', 'Hold');
|
||||
define('PAYMENT_TYPE_INSTANTLY', 'Write-off instantly');
|
||||
@ -53,7 +54,7 @@ define('REFUND_CREATE_ERROR', 'Refund create error');
|
||||
define('USER_FIELD', 'User');
|
||||
define('AMOUNT_FIELD', 'Amount');
|
||||
define('PRODUCT_FIELD', 'Product');
|
||||
define('USER_STATUS', 'User status');
|
||||
define('RECURRENT_CREATE_DATE', 'Created at');
|
||||
define('FORM_BUTTON_DELETE', 'Delete');
|
||||
define('FISCALIZATION', 'Fiscalization (54 Federal Law)');
|
||||
define('FISCALIZATION_USE', 'Use');
|
||||
|
@ -11,7 +11,7 @@
|
||||
/netcat/modules/rbkmoney/ru.lang.php
|
||||
/netcat/modules/rbkmoney/en.lang.php
|
||||
/netcat/modules/rbkmoney/ui_config.php
|
||||
/netcat/modules/rbkmoney/url_routes.js.php
|
||||
/netcat/modules/rbkmoney/url_routes.js
|
||||
/netcat/modules/payment/classes/system/rbkmoney.php
|
||||
/netcat/modules/rbkmoney/src/Api/ContactInfo.php
|
||||
/netcat/modules/rbkmoney/src/Api/Customers/CreateCustomer/Request/CreateCustomerRequest.php
|
||||
@ -88,9 +88,9 @@
|
||||
/netcat/modules/rbkmoney/src/Api/Webhooks/WebhookScope.php
|
||||
/netcat/modules/rbkmoney/src/Client/Client.php
|
||||
/netcat/modules/rbkmoney/src/Client/Sender.php
|
||||
/netcat/modules/rbkmoney/src/Exceptions/RBKMoneyException.php
|
||||
/netcat/modules/rbkmoney/src/Exceptions/RBKmoneyException.php
|
||||
/netcat/modules/rbkmoney/src/Exceptions/RequestException.php
|
||||
/netcat/modules/rbkmoney/src/Helpers/ResponseHandler.php
|
||||
/netcat/modules/rbkmoney/src/Interfaces/ClientInterface.php
|
||||
/netcat/modules/rbkmoney/src/Paginator.php
|
||||
/netcat/modules/rbkmoney/src/Helpers/Paginator.php
|
||||
/netcat/modules/rbkmoney/src/autoload.php
|
10
install.php
10
install.php
@ -6,8 +6,6 @@ include_once($_SERVER['DOCUMENT_ROOT'] . '/vars.inc.php');
|
||||
include_once($ROOT_FOLDER . 'connect_io.php');
|
||||
include_once(__DIR__ . "/$lang.lang.php");
|
||||
|
||||
InstallThisModule();
|
||||
|
||||
function CheckAbilityOfInstallation()
|
||||
{
|
||||
return array('Success'=>1);
|
||||
@ -23,7 +21,7 @@ function InstallThisModule()
|
||||
|
||||
$nc_core->db->query("CREATE TABLE `RBKmoney_Recurrent_Items` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`article` VARCHAR (20) NOT NULL,
|
||||
`article` VARCHAR(20) NOT NULL,
|
||||
PRIMARY KEY (`id`))"
|
||||
);
|
||||
|
||||
@ -34,9 +32,11 @@ function InstallThisModule()
|
||||
`name` VARCHAR(250) NOT NULL,
|
||||
`message_id` INT(11) NOT NULL,
|
||||
`sub_class_id` INT(11) NOT NULL,
|
||||
`currency` VARCHAR (5) NOT NULL,
|
||||
`currency` VARCHAR(5) NOT NULL,
|
||||
`vat_rate` VARCHAR(10) NULL,
|
||||
`date` DATETIME NOT NULL,
|
||||
`status` VARCHAR(20) NOT NULL,
|
||||
`invoice_id` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `recurrent_customer` (`recurrent_customer_id`))"
|
||||
);
|
||||
@ -74,5 +74,5 @@ function InstallThisModule()
|
||||
('successUrl', 'http://example.ru', 'rbkmoney')"
|
||||
);
|
||||
|
||||
$result["Success"] = 1;
|
||||
return array('Success'=>1);
|
||||
}
|
@ -147,6 +147,8 @@ class nc_payment_system_rbkmoney extends nc_payment_system
|
||||
$callback = json_decode($message);
|
||||
|
||||
if (isset($callback->invoice)) {
|
||||
file_put_contents(__DIR__.'/body.txt', $message);
|
||||
file_put_contents(__DIR__.'/header.txt', getenv('HTTP_CONTENT_SIGNATURE'));
|
||||
$this->paymentCallback($callback);
|
||||
} elseif (isset($callback->customer)) {
|
||||
$this->customerCallback($callback->customer);
|
||||
@ -166,7 +168,7 @@ class nc_payment_system_rbkmoney extends nc_payment_system
|
||||
$this->on_payment_failure($invoice);
|
||||
}
|
||||
|
||||
$this->printCallbackResponse($exception);
|
||||
$this->printCallbackErrorResponse($exception);
|
||||
|
||||
die;
|
||||
}
|
||||
@ -174,11 +176,11 @@ class nc_payment_system_rbkmoney extends nc_payment_system
|
||||
/**
|
||||
* @param RBKmoneyException $exception
|
||||
*/
|
||||
private function printCallbackResponse(RBKmoneyException $exception)
|
||||
private function printCallbackErrorResponse(RBKmoneyException $exception)
|
||||
{
|
||||
header('Content-Type: application/json', true, $exception->getCode());
|
||||
|
||||
echo json_encode(['message' => $exception->getMessage()]);
|
||||
echo json_encode(['message' => $exception->getMessage()], 256);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -276,6 +278,10 @@ class nc_payment_system_rbkmoney extends nc_payment_system
|
||||
$invoice->set('status', $invoice::STATUS_SUCCESS)->save();
|
||||
$netshopOrder->set('status', NETSHOP_STATUS_SUCCESS)->save();
|
||||
|
||||
include dirname(__DIR__) . '/../../rbkmoney/customers.php';
|
||||
$customers = new Customers($this->sender);
|
||||
$customers->setRecurrentReadyStatuses($invoice);
|
||||
|
||||
} elseif (in_array($type, [
|
||||
InvoicesTopicScope::INVOICE_CANCELLED,
|
||||
InvoicesTopicScope::PAYMENT_REFUNDED
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
use src\Api\Exceptions\WrongDataException;
|
||||
use src\Api\Exceptions\WrongRequestException;
|
||||
use src\Api\Invoices\CreateInvoice\TaxMode;
|
||||
use src\Api\Invoices\GetInvoiceById\Request\GetInvoiceByIdRequest;
|
||||
use src\Api\Payments\CancelPayment\Request\CancelPaymentRequest;
|
||||
use src\Api\Payments\CapturePayment\Request\CapturePaymentRequest;
|
||||
@ -12,7 +11,7 @@ use src\Api\Search\SearchPayments\Response\Payment;
|
||||
use src\Client\Client;
|
||||
use src\Client\Sender;
|
||||
use src\Exceptions\RequestException;
|
||||
use src\Paginator;
|
||||
use src\Helpers\Paginator;
|
||||
|
||||
class RbkMoneyAdmin
|
||||
{
|
||||
@ -153,11 +152,10 @@ class RbkMoneyAdmin
|
||||
|
||||
try {
|
||||
$sender->sendCapturePaymentRequest($capturePayment);
|
||||
nc_print_status(PAYMENT_CONFIRMED, 'ok');
|
||||
} catch (RequestException $exception) {
|
||||
nc_print_status(PAYMENT_CAPTURE_ERROR, 'error');
|
||||
}
|
||||
|
||||
nc_print_status(PAYMENT_CONFIRMED, 'ok');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -179,11 +177,10 @@ class RbkMoneyAdmin
|
||||
|
||||
try {
|
||||
$sender->sendCancelPaymentRequest($capturePayment);
|
||||
nc_print_status(PAYMENT_CANCELLED, 'ok');
|
||||
} catch (RequestException $exception) {
|
||||
nc_print_status(PAYMENT_CANCELLED_ERROR, 'error');
|
||||
}
|
||||
|
||||
nc_print_status(PAYMENT_CANCELLED, 'ok');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,11 +203,10 @@ class RbkMoneyAdmin
|
||||
|
||||
try {
|
||||
$sender->sendCreateRefundRequest($capturePayment);
|
||||
nc_print_status(REFUND_CREATED, 'ok');
|
||||
} catch (RequestException $exception) {
|
||||
nc_print_status(REFUND_CREATE_ERROR, 'error');
|
||||
}
|
||||
|
||||
nc_print_status(REFUND_CREATED, 'ok');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -373,15 +369,10 @@ class RbkMoneyAdmin
|
||||
$ncUser = new nc_User;
|
||||
$user = $ncUser->get_by_id($customer['user_id']);
|
||||
|
||||
$statuses = [
|
||||
'ready' => CUSTOMER_READY,
|
||||
'unready' => CUSTOMER_UNREADY,
|
||||
];
|
||||
|
||||
$this->recurrent[$payment->id] = [
|
||||
'user_name' => $user['Login'],
|
||||
'user' => "/netcat/admin/user/index.php?phase=4&UserID={$customer['user_id']}",
|
||||
'status' => $statuses[$customer['status']],
|
||||
'status' => $payment->status,
|
||||
'amount' => $payment->amount, 2,
|
||||
'name' => $payment->name,
|
||||
'date' => $payment->date,
|
||||
|
@ -13,7 +13,7 @@ require_once ($MODULE_FOLDER . 'rbkmoney/ru.lang.php');
|
||||
|
||||
$rbkMoneyAdmin = new RbkMoneyAdmin();
|
||||
|
||||
if (!$view) {
|
||||
if (!$view || $view === 'rbkmoney.settings') {
|
||||
$view = 'settings';
|
||||
}
|
||||
|
||||
|
@ -88,10 +88,26 @@ class Customers
|
||||
$currency = $item['currency'];
|
||||
$vatRate = $item['vat_rate'];
|
||||
$date = $item['date'];
|
||||
$status = $item['status'];
|
||||
$invoiceId = $item['invoice_id'];
|
||||
|
||||
$this->ncCore->db->query(
|
||||
"INSERT INTO `RBKmoney_Recurrent` (`recurrent_customer_id`, `amount`, `name`, `message_id`, `sub_class_id`, `currency`, `vat_rate`, `date`)
|
||||
VALUES ('$recurrentCustomerId', '$amount', '$name', '$messageId', '$subClassId', '$currency', '$vatRate', '{$date->format('Y.m.d H:i:s')}')"
|
||||
"INSERT INTO `RBKmoney_Recurrent` (`recurrent_customer_id`, `amount`, `name`, `message_id`, `sub_class_id`, `currency`, `vat_rate`, `date`, `status`, `invoice_id`)
|
||||
VALUES ('$recurrentCustomerId', '$amount', '$name', '$messageId', '$subClassId', '$currency', '$vatRate', '{$date->format('Y.m.d H:i:s')}', '$status', '$invoiceId')"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $invoiceId
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function setRecurrentReadyStatus($invoiceId)
|
||||
{
|
||||
$this->ncCore->db->query(
|
||||
"UPDATE `RBKmoney_Recurrent`
|
||||
SET `status` = '" . RECURRENT_READY_STATUS . "'
|
||||
WHERE `invoice_id` = '$invoiceId'"
|
||||
);
|
||||
}
|
||||
|
||||
@ -215,6 +231,8 @@ class Customers
|
||||
'currency' => $this->get_currency_code($invoice->get_currency()),
|
||||
'vat_rate' => $item->get('vat_rate'),
|
||||
'date' => new DateTime(),
|
||||
'status' => RECURRENT_UNREADY_STATUS,
|
||||
'invoice_id' => $invoice->get_id(),
|
||||
);
|
||||
}
|
||||
$intersections = array_intersect($articles, $this->getRecurrentItems());
|
||||
@ -239,6 +257,35 @@ class Customers
|
||||
return $resultCustomer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param nc_payment_invoice $invoice
|
||||
*
|
||||
* @throws nc_record_exception
|
||||
*/
|
||||
public function setRecurrentReadyStatuses(nc_payment_invoice $invoice)
|
||||
{
|
||||
$articles = array();
|
||||
|
||||
/**
|
||||
* @var $item nc_payment_invoice_item
|
||||
*/
|
||||
foreach ($invoice->get_items() as $item) {
|
||||
$componentId = $item->get('source_component_id');
|
||||
if (empty($componentId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$article = $this->getArticle($item->get('source_component_id'), $item->get('source_item_id'));
|
||||
$articles[$item->get('item_price')] = $article;
|
||||
}
|
||||
|
||||
$intersections = array_intersect($articles, $this->getRecurrentItems());
|
||||
|
||||
if (!empty($intersections)) {
|
||||
$this->setRecurrentReadyStatus($invoice->get_id());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $userId
|
||||
*
|
||||
|
@ -54,7 +54,6 @@ define('REFUND_CREATE_ERROR', 'Refund create error');
|
||||
define('USER_FIELD', 'User');
|
||||
define('AMOUNT_FIELD', 'Amount');
|
||||
define('PRODUCT_FIELD', 'Product');
|
||||
define('USER_STATUS', 'User status');
|
||||
define('RECURRENT_CREATE_DATE', 'Created at');
|
||||
define('FORM_BUTTON_DELETE', 'Delete');
|
||||
define('FISCALIZATION', 'Fiscalization (54 Federal Law)');
|
||||
|
@ -4,7 +4,7 @@
|
||||
<th><?php echo USER_FIELD; ?></th>
|
||||
<th><?php echo AMOUNT_FIELD; ?></th>
|
||||
<th><?php echo PRODUCT_FIELD; ?></th>
|
||||
<th><?php echo USER_STATUS; ?></th>
|
||||
<th><?php echo RBK_MONEY_TRANSACTION_STATUS; ?></th>
|
||||
<th><?php echo RECURRENT_CREATE_DATE; ?></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
|
@ -71,10 +71,9 @@ class Recurrent
|
||||
*/
|
||||
public function getRecurrentPayments()
|
||||
{
|
||||
return $this->nc_core->db->get_results("SELECT r.id, r.amount, r.name, r.message_id, r.sub_class_id, r.currency, r.vat_rate, r.recurrent_customer_id
|
||||
FROM `RBKmoney_Recurrent` r
|
||||
JOIN `RBKmoney_Recurrent_Customers` c ON r.recurrent_customer_id = c.id
|
||||
WHERE c.status = 'ready'");
|
||||
return $this->nc_core->db->get_results("SELECT *
|
||||
FROM `RBKmoney_Recurrent`
|
||||
WHERE status = '" . RECURRENT_READY_STATUS . "'");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,7 +54,6 @@ define('REFUND_CREATE_ERROR', 'Ошибка создания возврата п
|
||||
define('USER_FIELD', 'Пользователь');
|
||||
define('AMOUNT_FIELD', 'Сумма');
|
||||
define('PRODUCT_FIELD', 'Товар');
|
||||
define('USER_STATUS', 'Статус пользователя');
|
||||
define('RECURRENT_CREATE_DATE', 'Дата создания');
|
||||
define('FORM_BUTTON_DELETE', 'Удалить');
|
||||
define('FISCALIZATION', 'Фискализация по 54-ФЗ');
|
||||
|
@ -31,4 +31,6 @@ define('PROPERTY_RESULT', 'result');
|
||||
define('PROPERTY_SHOP_ID', 'shopID');
|
||||
define('PROPERTY_FEE', 'fee');
|
||||
define('PROPERTY_GEO_LOCATION_INFO', 'geoLocationInfo');
|
||||
define('PROPERTY_METADATA', 'metadata');
|
||||
define('PROPERTY_METADATA', 'metadata');
|
||||
define('RECURRENT_READY_STATUS', 'ready');
|
||||
define('RECURRENT_UNREADY_STATUS', 'unready');
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace src;
|
||||
namespace src\Helpers;
|
||||
|
||||
class Paginator
|
||||
{
|
@ -1,5 +1,5 @@
|
||||
urlDispatcher.addRoutes({
|
||||
'module.rbkmoney': NETCAT_PATH + 'modules/rbkmoney/admin.php?view=info'
|
||||
'module.rbkmoney': NETCAT_PATH + 'modules/rbkmoney/admin.php?view=settings'
|
||||
})
|
||||
.addPrefixRouter('module.rbkmoney.', function (path, params) {
|
||||
var view = path.split('.');
|
||||
|
@ -28,6 +28,7 @@ define('ERROR_API_KEY_IS_NOT_VALID', 'Некорректное значение
|
||||
define('ERROR_SUCCESS_URL_IS_NOT_VALID', 'Некорректное значение страницы успешной оплаты');
|
||||
define('ERROR_PAYMENT_TYPE_IS_NOT_VALID', 'Некорректное значение типа оплаты');
|
||||
define('ERROR_HOLD_STATUS_IS_NOT_VALID', 'Некорректное значение статуса инвойса при холде');
|
||||
define('ERROR_AMOUNT_IS_NOT_VALID', 'Некорректное значение суммы платежа');
|
||||
define('ERROR_HOLD_EXPIRATION_IS_NOT_VALID', 'Некорректное значение стороны списания средств по окончанию срока холдированния');
|
||||
define('ERROR_TAX_RATE_IS_NOT_VALID', 'Неверно указан НДС в товаре: ');
|
||||
define('PAYMENT_TYPE_HOLD', 'Холд');
|
||||
@ -53,7 +54,7 @@ define('REFUND_CREATE_ERROR', 'Ошибка создания возврата п
|
||||
define('USER_FIELD', 'Пользователь');
|
||||
define('AMOUNT_FIELD', 'Сумма');
|
||||
define('PRODUCT_FIELD', 'Товар');
|
||||
define('USER_STATUS', 'Статус пользователя');
|
||||
define('RECURRENT_CREATE_DATE', 'Дата создания');
|
||||
define('FORM_BUTTON_DELETE', 'Удалить');
|
||||
define('FISCALIZATION', 'Фискализация по 54-ФЗ');
|
||||
define('FISCALIZATION_USE', 'Использовать');
|
||||
|
Loading…
Reference in New Issue
Block a user