Гайд [Node.JS] Делаем простую автооплату через QIWI (VK Bot)

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Автор темы
Модератор
1,890
3,043
Привет ✋, давно хотел написать подобный гайд и вот дошли руки. Напишем с вами простого бота в VK с автооплатой через QIWI.
Что нам понадобится для работы:
1) Любая библиотека для работы с API VK (я буду использовать EasyVK)
2)
Node-QIWI-SDK
3) Сам Node.JS

После установки всего, что я описал выше переходим в ВКонтакте и создаем или используем уже существующую группу:

1) Переходим в раздел "Работа с API"
В данном разделе переходим в LongPoll API и включаем LongPoll, версию API выбираем 5.103 (можете и свою, я всегда использую 5.103)
Переходим в "Типы событий" и включаем событие на "Входящие сообщения", этого нам хватит.

2) Переходим в раздел "Сообщения" и включаем сообщения группы.

Группа готова к использованию, перейдем к написанию кода, создаем JS файл и открываем его в любом редакторе.



Подключаем наши библиотеки:
JavaScript:
const vk = require("easyvk")
const QIWI = require("@qiwi/bill-payments-node-js-sdk")
Далее сделаем объект с настройками для VK, где будем хранить токен и версию API для EasyVK:
JavaScript:
const vk = require("easyvk")
const QIWI = require("@qiwi/bill-payments-node-js-sdk")

const VKSettings = {
    token: "Token",
    v: "5.103"
}
И подключимся к LongPoll нашей группы:
JavaScript:
// Передаем наш VK Settings
vk(VKSettings).then(async api => {
    const longpoll = await api.bots.longpoll.connect() // Подключаемся к LongPoll

    longpoll.on("message_new", async (msg) => {
        // Это событие для входящего события, в "msg" хранится наш ответ от сервера
    })
})
В "msg" будет храниться ответ от VK когда в группу кто-то напишет сообщение, давайте напишем в группу и выведем "msg"
JavaScript:
longpoll.on("message_new", async (msg) => {
    console.log(msg)
})
1609255769559.png

Видим, что событие сработало и пришел ответ с нашим сообщением, давайте сделаем реакцию на определенную команду, к примеру "/qiwi" и ответим на эту команду:
JavaScript:
longpoll.on("message_new", async (msg) => {
        if (msg.message.text == "/qiwi") { // Если написали боту /qiwi
            api.call('messages.send', { // Обращаемся к методу messages.send и отправляем сообщение
                random_id: vk.randomId(),
                peer_id: msg.message.peer_id,
                message: "Я отреагировал на твое сообщение!"
            });
        }
    })

1609256102469.png


Теперь приступим к работе с QIWI, для оплаты мы будем использовать формы с оплатой.
Переходим на https://p2p.qiwi.com/, логинемся под свой кошелек.
Далее переходим в раздел "API" и создаем токен, сохраняем наш секретный ключ (не спутайте с PublicKey!), в скрипте можно создать переменную с нашим ключом.
1609256351682.png


Где-нибудь вверху скрипта пишем вот такое:
JavaScript:
const qiwiApi = new QIWI("СЕКРЕТНЫЙ КЛЮЧ")
Теперь создадим такой же массив как мы делали с настройками для ВК, там мы будем храниться данные для создания формы оплаты:
JavaScript:
const QIWISettings = {
    amount: null, // Сумма, пока оставим null
    billId: "0", // Идентификатор платежа (он у каждого будет уникальный)
    comment: "0", // Комментарий
    currency: "RUB" // Валюта
}

Сделаем генерацию ссылки на форму по команде "/qiwi":
JavaScript:
longpoll.on("message_new", async (msg) => {
        if (msg.message.text == "/qiwi") { // Если написали боту /qiwi
            QIWISettings.amount = 1 // К примеру у нас продается товар за 1 рубль
            QIWISettings.billId = qiwiApi.generateId() // Генерируем идентификатор с помощью встроенной в библиотеку функцию
            QIWISettings.comment = "Оплата товара 'Клубника'" // К примеру мы покупаем Клубнику

            qiwiApi.createBill(QIWISettings.billId, QIWISettings).then(data => { // Выставляем счет, передаем billId и другие данные
                api.call('messages.send', { // Обращаемся к методу messages.send и отправляем сообщение
                    random_id: vk.randomId(),
                    peer_id: msg.message.peer_id,
                    message: `Сумма: ${QIWISettings.amount}\nДля оплаты перейдите по ссылке: ${data.payUrl}` // отправляем юзеру ссылку для оплаты
                });
            })
        }
    })

Теперь напишем боту команду "/qiwi", он должен прислать нам ссылку на оплату.
1609257373501.png
1609257424198.png

Как мы видим, все работает!
Теперь нам надо проверить платеж от пользователя, сделать это можно разными способами, но я делаю самый простой гайд и поэтому будем проверять платеж по команде юзера, к примеру ("/check")
JavaScript:
if (msg.message.text == "/check") {
            qiwiApi.getBillInfo(QIWISettings.billId).then(data => { // получаем данные о счете
                if (data.status.value == "PAID") { // Если статус счета оплачен (PAID)
                    api.call('messages.send', { // Обращаемся к методу messages.send и отправляем сообщение
                        random_id: vk.randomId(),
                        peer_id: msg.message.peer_id,
                        message: "Оплата прошла успешно! Мы уже доставляем вам клубнику!" // Отправляем сообщение об удачной оплате!
                    });
                }
                else { // Если же нет.
                    api.call('messages.send', { // Обращаемся к методу messages.send и отправляем сообщение
                        random_id: vk.randomId(),
                        peer_id: msg.message.peer_id,
                        message: "Вы не оплатили счет!" // Отправляем сообщение об неудачной оплате
                    });
                }
            })
        }

Теперь проверим:
Если счет не оплачен
1609257750373.png

Переведем рубль
1609257820957.png


На этом все. Я показал как сделать простую оплату через QIWI через бота VK. Если будут вопросы - задайте, постараюсь ответить
 

wulfandr

Известный
638
258
давай теперь что-то поглобальней в виду оплатки. типа unitpay и так далее
 

Владислав1

Новичок
1
0
Для работы с вк апи я подключал эти библиотеки, поэтому когда я прописал твой скрипт, он не понимал, зачем ему const vk = new VK();
сделай, плз, с моими библиотеками, потому что у них написание отличается. Желательно написать мне в личку, когда сделашеь. https://vk.com/vladnet14

const { VK, Keyboard } = require('vk-io');
const vk = new VK();
const commands = [];
const request = require('prequest');
let user = new VK();
user.setOptions({
token: 'TOKEN'
});
 

Botik228

Активный
400
65

Uncaught ReferenceError ReferenceError: longpoll is not defined at <anonymous> (*************) at Module._compile (internal/modules/cjs/loader.js:1118:30) at Module._extensions..js (internal/modules/cjs/loader.js:1138:10) at Module.load (internal/modules/cjs/loader.js:982:32) at Module._load (internal/modules/cjs/loader.js:875:14) at executeUserEntryPoint (internal/modules/run_main.js:71:12) at <anonymous> (internal/main/run_main_module.js:17:47)

В чем проблема?
 
Последнее редактирование:

blazzzer

Новичок
2
2
годно, но не то, что я делал и дропал на форуме ОБ, там моментально чекает оплату и пишет на аккаунт чела.

Счета, кстати, ты выставлял по странному. Можно удобнее и правильнее.

Но а так тема гуд.