исправлена логика рекуррентов - теперь регулярные оплаты происходят только после подтверждения покупки + некоторые исправления

This commit is contained in:
detre30 2018-04-04 15:05:20 +03:00
parent de60986357
commit f9aa3e1c49
16 changed files with 93 additions and 48 deletions

View File

@ -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

View File

@ -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');

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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,

View File

@ -13,7 +13,7 @@ require_once ($MODULE_FOLDER . 'rbkmoney/ru.lang.php');
$rbkMoneyAdmin = new RbkMoneyAdmin();
if (!$view) {
if (!$view || $view === 'rbkmoney.settings') {
$view = 'settings';
}

View File

@ -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
*

View File

@ -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)');

View File

@ -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>

View File

@ -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 . "'");
}
/**

View File

@ -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-ФЗ');

View File

@ -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');

View File

@ -1,6 +1,6 @@
<?php
namespace src;
namespace src\Helpers;
class Paginator
{

View File

@ -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('.');

View File

@ -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', 'Использовать');