Модуль платежной системы NeBank для Hostinpl
Инструкция:
Добавить в config.php
'nb_id' => '1', // ID магазина
'nb_key1' => '...', // Ключ №1
'nb_key2' => '...', // Ключ №2
Далее:
Создать файл nebank.php по адресу /application/controllers/result/, добавим такой код:
- <?php
- class NeBankController extends Controller {
- public function index() {
- $this->load->model('users');
- $this->load->model('invoices');
- $this->load->model('waste');
-
- if($this->request->server['REQUEST_METHOD'] != 'POST') return 'Incorrect method';
-
- $post = json_decode(file_get_contents('php://input'), true);
-
- $id = $post['id'];
- $pay_id = $post['pay_id'];
- $invoice_id = $post['invoice_id'];
- $shop_id = $post['shop_id'];
- $description = $post['description'];
- $amount = $post['amount'];
- $signature = $post['signature'];
-
- if($shop_id != $this->config->nb_id) return 'IncorrectShopId';
-
- $invoice = $this->invoicesModel->getInvoiceById($invoice_id);
- if(!$invoice) return 'NoInvoice';
-
- if($invoice['system'] != 'nebank') return 'NotNebankPay';
-
- $key1 = $this->config->nb_key1;
- $key2 = $this->config->nb_key2;
-
- $sign1 = md5("$shop_id:$invoice_id:$amount:card_cis:$key1");
- $sign2 = md5("$key2:$id:$sign1");
-
- if($sign2 != $signature) {
- $sign3 = md5("$shop_id:$invoice_id:$amount:card_nocis:$key1");
- $sign4 = md5("$key2:$id:$sign3");
-
- if($sign4 != $signature) return 'IncorrectSign';
- }
-
- $user_id = $invoice['user_id'];
- $user = $this->usersModel->getUserById($user_id);
- if(!$user) return 'NoUser';
-
- $total_amount = round($amount / 100, 2);
-
- if($total_amount > 50) $this->usersModel->updateUser($user_id, $userData = array('user_promised_pay' => 0));
-
- $wasteData = array(
- 'user_id' => $user_id,
- 'waste_ammount' => $total_amount,
- 'waste_status' => 0,
- 'waste_usluga' => 'Пополнение баланса пользователя через систему NeBank Pay',
- );
-
- $this->wasteModel->createWaste($wasteData);
-
- $this->usersModel->upUserBalance($user_id, $total_amount);
-
- $bonus_percent = $this->config->bonus_percent;
- $getbonus = ($total_amount * (1 + $bonus_percent / 100)) - $total_amount;
- $this->usersModel->upUserBonuses($user_id, $getbonus);
-
- $this->invoicesModel->updateInvoice($invoice_id, array('invoice_status' => 1));
-
- return 'OK';
- }
- }
- ?>
Теперь в качестве ссылки для уведомления можно будет использовать:
https://вашдомен/result/nebank
Открываем файл pay.php по адресу /application/controllers/account и добавляем функцию nebank() после index:
public function nebank() {
if(!$this->user->isLogged()) {
$this->data['status'] = 'error';
$this->data['error'] = 'Вы не авторизированы!';
return json_encode($this->data);
}
if($this->user->getAccessLevel() < 1) {
$this->data['status'] = 'error';
$this->data['error'] = 'У вас нет доступа к данному разделу!';
return json_encode($this->data);
}
$this->load->model('invoices');
if($this->request->server['REQUEST_METHOD'] != 'POST') {
$this->data['status'] = 'error';
$this->data['error'] = 'Запрос должен быть отправлен методом POST';
return json_encode($this->data);
}
$amount = @$this->request->post['ammount'];
$shop_id = $this->config->nb_id;
$key1 = $this->config->nb_key1;
$key2 = $this->config->nb_key2;
$minor_amount = $amount * 100;
$user_id = $this->user->getId();
$invoiceData = array(
'user_id' => $user_id,
'invoice_ammount' => $amount,
'invoice_status' => 0,
'system' => 'nebank'
);
$invoice_id = $this->invoicesModel->createInvoice($invoiceData);
$method = $this->request->post['method'];
$methods = ['card_cis', 'card_nocis'];
if(!in_array($method, $methods)) return 'IncorrectMethod';
$signature = md5("$shop_id:$invoice_id:$minor_amount:$method:$key1");
$body = json_encode([
'shop_id' => $shop_id,
'invoice_id' => $invoice_id,
'description' => 'Пополнение баланса хостинг-аккаунта #'.$user_id,
'amount' => $minor_amount,
'method' => $method,
'signature' => $signature
]);
$curl = curl_init('https://api.nebank.co/payments');
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-type: application/json']);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($curl);
curl_close($curl);
$decoded = json_decode($response);
if(!$decoded || !$decoded->success) {
$this->data['status'] = 'error';
$this->data['error'] = 'Не удалось создать платёж в системе NeBank. Если вы выбрали иностранные карты, то убедитесь, что сумма пополнения больше 100 рублей.';
$this->invoicesModel->deleteInvoice($invoice_id);
return json_encode($this->data);
}
return $decoded->pay_id;
}
Открываем файл pay.php по адресу /application/views/account/ и добавляем шаблон пополнения перед <?echo $footer?>:
<div class="modal fade" id="nebank_modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Пополнение баланса</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<form id="nebank" method="POST" class="form_0" style="padding:0px; margin:0px;">
<div class="modal-body">
<div class="form-group">
<label>Введите сумму</label>
<input class="form-control" id="ammount" name="ammount" placeholder="100">
</div>
<div class="form-group">
<label>Выберите метод</label>
<select class="form-control" name="method">
<option value="card_cis">Российская банковская карта</option>
<option value="card_nocis">Иностранная банковская карта (мин. 100 рублей)</option>
</select>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light-primary font-weight-bold" data-dismiss="modal">Отмена</button>
<button type="submit" class="btn btn-primary font-weight-bold">Пополнить</button>
</div>
</form>
</div>
</div>
</div>
<script src="https://pay.nebank.co/widget.js?v12"></script>
<script>
$('#nebank').ajaxForm({
url: '/account/pay/nebank',
dataType: 'text',
success: data => {
if(data[0] !== '{') {
$('#nebank_modal').modal('hide');
document.querySelector('.header').style.zIndex = 0;
NeBank.widget({ payId: data });
} else {
data = $.parseJSON(data);
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
}
});
</script>
Дальше добавляем на 107 строчке после <?endif;?>
<div class="col-lg-4">
<div class="card card-custom gutter-b">
<div class="card-body">
<center><img src="https://nebank.co/assets/logo.svg" style="max-width:100%;height:65px;" alt=""></center>
</div>
<div class="card-footer">
<button data-toggle="modal" data-target="#nebank_modal" class="btn btn-primary btn-lg btn-block">Пополнить</button>
</div>
</div>
</div>