Название | Тип | Описание |
---|---|---|
name | varchar(1024) | Название оплаты для менеджера (Отображается в административной панели). По умолчанию - пустая строка; |
public_name | varchar(1024) | Название оплаты для клиента (Отображается в публичной части сайта). По умолчанию - пустая строка; |
activity | int(1) | Флаг активности оплаты. По умолчанию - 0; |
paramArray | text | JSON массив параметров оплаты; |
urlArray | varchar(1024) | JSON массив ссылок оплаты (отображаются в настройках оплаты); |
rate | double | Скидка/Наценка на способ оплаты. Коэффициент изменения стоимости, т. е. значение 0.1 означает наценку в 10%, а значение -0.05 - скидку в 5%; |
sort | int(11) | Сортировка оплаты. Чем выше число - тем выше по списку отображается оплата; |
permission | varchar(5) | Кому доступна оплата. all - всем, fiz - только физическим лицам, yur - только юридическим; |
code | varchar(5) | UNIQUE Уникальный текстовый идентификатор оплаты; |
plugin | varchar(255) | Название папки плагина оплаты; |
icon | varchar(511) | Ссылка на иконку оплаты (Отображается в публичной части сайта и в разделе заказов административной панели); |
logs | tinyint(1) | Флаг поддержки логирования. 1 - оплата поддерживает логирование, 0 - не поддерживает. |
test
new PaymentQiwi;
class PaymentQiwi {
public static $pluginName = 'payment-qiwi';
public function __construct() {
mgActivateThisPlugin(__FILE__, [__CLASS__, 'activate']);
mgAddAction(self::$pluginName, [__CLASS__, 'getOrderForm'], 1);
mgAddAction('Models_Payment_handleRequest', [__CLASS__, 'webhookIntercept'], 1);
}
...
public static function activate() {
$currentPayment = Models_Payment::getPaymentByPlugin(self::$pluginName);
if (!$currentPayment) {
$name = 'Qiwi';
$icon = SITE.'/mg-plugins/'.self::$pluginName.'/src/icon.png';
$defaultParams = [
[
'name' => 'publicKey',
'title' => 'Публичный ключ',
'type' => 'text',
'value' => '',
],
[
'name' => 'secretKey',
'title' => 'Секретный ключ',
'type' => 'crypt',
'value' => '',
],
];
$urls = [
[
'type' => 'info',
'title' => 'Result URL',
'link' => SITE.'/payment?payment=qiwi',
],
];
Models_Payment::addPayment(
self::$pluginName,
$name,
$name,
self::$pluginName,
$defaultParams,
$icon,
0,
$urls
);
}
}
public static function getOrderForm($args) {
$result = $args['result'];
$orderId = $args['args'][1];
$orderModel = new Models_Order();
$orders = $orderModel->getOrder('`id` = '.DB::quoteInt($orderId));
$order = $orders[$orderId];
$uniqOrderId = $orderId.'-'.time();
$options = Models_Payment::getPaymentParams(self::$pluginName, true);
$publicKey = $options['publicKey'];
// Отменяем предыдущий неоплаченный заказ
if (!empty($_SESSION['qiwiApi']['orderID'])) {
$lastOrderId = $_SESSION['qiwiApi']['orderID'];
$secretKey = $options['secretKey'];
$url = 'https://api.qiwi.com/partner/bill/v1/bills/'.$lastOrderId.'/reject';
$headers = [
'Accept: application/json',
'Content-Type: application/json',
'Authorization: Bearer '.$secretKey,
];
$curlHandler = curl_init($url);
$curlOptions = [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
];
curl_setopt_array($curlHandler, $curlOptions);
curl_exec($curlHandler);
curl_close($curlHandler);
}
$orderAmount = round($order['summ'] + $order['delivery_cost'], 2);
$currency = MG::getSetting('shopCurrencyIso');
if ($currency === 'RUR') {
$currency = 'RUB';
}
$phone = '';
if (!empty($order['phone'])) {
$phone = str_replace([' ', '(', ')', '-'], '', $order['phone']);
$phone = str_replace('+7', '8', $phone);
}
$email = $order['user_email'];
if (empty($email)) {
$email = $order['contact_email'];
}
$successUrl = SITE.'/payment?payment=qiwi';
$_SESSION['qiwiApi']['orderID'] = $uniqOrderId;
ob_start();
require('views/form.php');
$result = ob_get_contents();
ob_end_clean();
return $result;
}
<style>
#qiwiSendForm {
background: rgb(255, 140, 0);
color: white;
border-radius: 24px;
font-weight: 500;
padding: 15px 50px;
}
#qiwiSendForm:hover {
background: rgb(255, 130, 0);
}
style>
<form method="get" action="https://oplata.qiwi.com/create" accept-charset="UTF-8">
<input type="hidden" name="publicKey" value="" />
<input type="hidden" name="billId" value="" />
<input type="hidden" name="amount" value="" />
<input type="hidden" name="phone" value="" />
<input type="hidden" name="email" value="" />
<input type="hidden" name="successUrl" value="" />
<input type="submit" value="Оплатить" id="qiwiSendForm">
form>
public static function webhookIntercept($args) {
$result = $args['result'];
if ($_GET['payment'] !== 'qiwi') {
return $result;
}
$payment = Models_Payment::getPaymentByCode(self::$pluginName, true);
$options = $payment['paramArray'];
$secretKey = $options['secretKey'];
$lastOrderId = $_SESSION['qiwiApi']['orderID'];
$url = 'https://api.qiwi.com/partner/bill/v1/bills/' . $lastOrderId;
$headers = [
'Accept: application/json',
'Content-Type: application/json',
'Authorization: Bearer ' . $secretKey,
];
$curlOptions = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
];
$curlHandler = curl_init($url);
curl_setopt_array($curlHandler, $curlOptions);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
$response = json_decode($response, true);
$status = $response['status']['value'];
if ($status === 'PAID') {
$orderId = preg_replace('/-.*/is', '', $response['billId']);
$orderAmount = $response['amount']['value'];
$orderModel = new Models_Order();
$orders = $orderModel->getOrder(
'`id` => ' . DB::quoteInt($orderId) . ' AND ' .
'ROUND(`summ` + `delivery_cost`) = ' . DB::quoteFloat($orderAmount) . ' AND ' .
'`payment_id` = ' . DB::quoteInt($payment['id'])
);
if (empty($orders)) {
$result = [
'status' => 'fail',
'message' => 'ERR: Заказ был изменен! Была произведена оплата ' . $orderAmount . ' ' . $response['amount']['currency'] . ' по некорректному счету!',
];
return $result;
} else {
$order = array_shift($orders);
$result = [
'status' => 'success',
'message' => 'Вы успешно оплатили заказ. Спасибо!',
];
if (intval($order['status_id']) === 0 || intval($order['status_id']) === 1) {
Controllers_Payment::actionWhenPayment([
'paymentOrderId' => $orderId,
'paymentAmount' => $orderAmount,
'paymentID' => $payment['id']
]);
}
}
} else {
$result = [
'status' => 'fail',
'message' => 'Возникла ошибка в оплате заказа.',
];
}
return $result;
}
Примечание: В системе предусмотрены стандартные страницы для успешной или неудачной оплаты, куда можно пренаправить пользователя после оплаты. Это #SITE#/payment?payStatus=success и #SITE#/payment?payStatus=fail соответственно. Добавьте их в список ссылок при создании оплаты через метод Models_Payment::addPayment, если их можно указать в настройках перенаправления в банке.