vkcoin-callback-api
Advanced tools
Comparing version 3.0.0 to 4.0.0
177
index.js
@@ -1,8 +0,8 @@ | ||
const request = require("prequest"); | ||
const http = require("http"); | ||
const axios = require("axios"); | ||
const md5 = require('js-md5'); | ||
let pollingPort; | ||
let port = 1234; | ||
module.exports = class VKCOIN { | ||
constructor(auth) { | ||
constructor (auth) { | ||
this.key = auth.key; | ||
@@ -12,133 +12,86 @@ this.id = auth.id; | ||
async startServer(props) { | ||
if (!props.server) | ||
return console.error( "Start server Error: не указан сервер для получения событий!"); | ||
if (props.port) { port = props.port;} | ||
async startServer (props) { | ||
if (!props.server) throw new Error("Ошибка запуска сервера: не указан сервер для получения событий!"); | ||
pollingPort = props.port || 1234; | ||
try { | ||
let connect = await request({ | ||
return (await axios({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/set/", | ||
form: { | ||
callback: `http://${props.server}:${port}`, | ||
merchantId: this.id, | ||
key: this.key, | ||
}, | ||
headers: { "Content-type": "Content-Type: application/json" }, | ||
}); | ||
return connect | ||
} catch (e) { | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
headers: { "Content-Type": "application/json" }, | ||
data: JSON.stringify({ callback: `http://${props.server}:${pollingPort}`, merchantId: this.id, key: this.key }) | ||
})).data; | ||
} catch (e) { throw new Error(e.message || "Ошибка сервера!"); } | ||
} | ||
async startPolling(hand) { | ||
async startPolling (hand) { | ||
try { | ||
http.createServer((req, res) => { | ||
if (req.method === "POST") { | ||
let body = ""; | ||
req.on("data", (chunk) => { | ||
body += chunk.toString(); | ||
}); | ||
req.on("end", () => { | ||
let event = JSON.parse(body); | ||
res.writeHead(200, "OK"); | ||
res.end("OK"); | ||
hand(event); | ||
}); | ||
} | ||
}).listen(port); | ||
} catch (err) { | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
if (req.method === "POST") { | ||
let body = ""; | ||
req.on("data", chunk => { | ||
body += chunk.toString(); | ||
if(body.length > 1e6) { | ||
req.connection.destroy(); | ||
body = ""; | ||
}; | ||
}); | ||
req.on("end", () => { | ||
const event = JSON.parse(body); | ||
const key = md5(event.id + ';' + event.fromId + ';' + event.amount + ';' + event.payload + ';' + this.key); | ||
if(event.key !== key) { | ||
req.connection.destroy(); | ||
return; | ||
}; | ||
res.writeHead(200, "OK"); | ||
res.end("OK"); | ||
hand(event); | ||
}); | ||
} | ||
}).listen(pollingPort); | ||
} catch (e) { throw new Error(e.message || "Ошибка сервера!"); } | ||
} | ||
async send(toId, amount, fromShop) { | ||
if (!fromShop) { | ||
try { | ||
let req = await request({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/send/", | ||
form: { | ||
merchantId: this.id, | ||
key: this.key, | ||
toId: toId, | ||
amount: amount, | ||
}, | ||
headers: { "Content-type": "Content-Type: application/json" }, | ||
}); | ||
return req | ||
} catch (e) { | ||
console.error(e.message); | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
} else { | ||
try { | ||
let req = await request({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/send/", | ||
form: { | ||
merchantId: this.id, | ||
key: this.key, | ||
toId: toId, | ||
amount: amount, | ||
markAsMerchant: fromShop, | ||
}, | ||
headers: { "Content-type": "Content-Type: application/json" }, | ||
}); | ||
return req | ||
} catch (e) { | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
} | ||
async send (toId, amount, fromShop) { | ||
const dataJSON = fromShop ? { merchantId: this.id, key: this.key, toId, amount, markAsMerchant: true } : { merchantId: this.id, key: this.key, toId, amount }; | ||
try { | ||
return (await axios({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/send/", | ||
headers: { "Content-Type": "application/json" }, | ||
data: JSON.stringify(dataJSON) | ||
})).data; | ||
} catch (e) { throw new Error(e.message || "Ошибка сервера!"); } | ||
} | ||
async getBalance(id) { | ||
async getBalance (id) { | ||
try { | ||
let balance = await request({ | ||
id = Array.isArray(id) ? id : [id]; | ||
if (id.length > 100) throw new Error("Ошибка: Длина массива должна быть не более 100!"); | ||
return (await axios({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/score/", | ||
form: { | ||
merchantId: this.id, | ||
key: this.key, | ||
userIds: id, | ||
}, | ||
headers: { "Content-type": "Content-Type: application/json" }, | ||
}); | ||
return balance; | ||
} catch (e) { | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
headers: { "Content-Type": "application/json" }, | ||
data: JSON.stringify({ merchantId: this.id, key: this.key, userIds: id }) | ||
})).data; | ||
} catch (e) { throw new Error(e.message || "Ошибка сервера!"); } | ||
} | ||
async shopName(name) { | ||
async shopName (name) { | ||
try { | ||
let req = await request({ | ||
return (await axios({ | ||
method: "POST", | ||
url: "https://coin-without-bugs.vkforms.ru/merchant/set/", | ||
form: { | ||
merchantId: this.id, | ||
key: this.key, | ||
name: name, | ||
}, | ||
headers: { "Content-type": "Content-Type: application/json" } | ||
}); | ||
return req | ||
} catch (e) { | ||
throw new Error(e.message || "Ошибка сервера!") | ||
} | ||
headers: { "Content-Type": "application/json" }, | ||
data: JSON.stringify({ merchantId: this.id, key: this.key, name }) | ||
})).data; | ||
} catch (e) { throw new Error(e.message || "Ошибка сервера!"); } | ||
} | ||
getLink(amount, payload, fixed) { | ||
if (!this.id) | ||
throw new Error(`Ошибка: Для начала необходимо авторизироваться!`) | ||
if (isNaN(+amount)) | ||
throw new Error(`Ошибка: Недопустимый формат VK Coin!`) | ||
let link = `vk.com/coin#x${this.id}_${+amount}_${payload}` | ||
if (fixed) { link += "_1" } | ||
return link | ||
getLink (amount, payload, isFixed) { | ||
if (!this.id) throw new Error("Ошибка: Для начала необходимо авторизироваться!"); | ||
if (isNaN(Number(amount))) throw new Error("Ошибка: Недопустимый формат VK Coin!"); | ||
return `vk.com/coin#x${this.id}_${Number(amount)}_${payload}${isFixed ? "" : "_1"}`; | ||
} | ||
format(amount) { | ||
return (amount / 1000).toLocaleString('de-DE').replace(/\./g, " ") | ||
} | ||
format (amount) { return (Number(amount) / 1000).toLocaleString("ru-RU"); } | ||
} |
{ | ||
"name": "vkcoin-callback-api", | ||
"version": "3.0.0", | ||
"version": "4.0.0", | ||
"description": "Модуль для работы с методами VK Coin api", | ||
@@ -16,3 +16,4 @@ "main": "index.js", | ||
"dependencies": { | ||
"prequest": "^1.0.0" | ||
"axios": "^0.27.2", | ||
"js-md5": "^0.7.3" | ||
}, | ||
@@ -19,0 +20,0 @@ "author": "XOP EHOTOB <хор-енотов.рф>", |
149
README.MD
# vkcoin-callback-api | ||
Модуль для работы с методами VK Coin api | ||
Модуль для работы с методами VK Coin API | ||
<p align="center"> | ||
<h1>VKCOIN-CALLBACK-API</h1> | ||
<a href="https://www.npmjs.com/package/vkcoin-callback-api"><img src="https://img.shields.io/npm/v/vkcoin-callback-api.svg?style=flat-square" alt="NPM version"></a> | ||
<a href="https://www.npmjs.com/package/vkcoin-callback-api"><img src="https://img.shields.io/npm/dt/vkcoin-callback-api.svg?style=flat-square" alt="NPM downloads"></a> | ||
<h1>VKCOIN-CALLBACK-API</h1> | ||
<a href="https://www.npmjs.com/package/vkcoin-callback-api"><img src="https://img.shields.io/npm/v/vkcoin-callback-api.svg?style=flat-square" alt="NPM version"></a> | ||
<a href="https://www.npmjs.com/package/vkcoin-callback-api"><img src="https://img.shields.io/npm/dt/vkcoin-callback-api.svg?style=flat-square" alt="NPM downloads"></a> | ||
</p> | ||
@@ -14,13 +14,11 @@ | ||
<p> | ||
Для начала работы, необходимо получить Merchant Key от аккаунта <a href="https://vk.com/@hs-marchant-api">здесь</a> | ||
После того как мы получили платежный ключ, необходимо авторезироваться | ||
Для начала работы, необходимо получить Merchant Key от аккаунта <a href="https://vk.com/@hs-marchant-api">здесь</a>. | ||
После того как мы получили платежный ключ, необходимо авторизоваться | ||
</p> | ||
```js | ||
let VKCOIN = require(`vkcoin-callback-api`); | ||
let vkcoin = new VKCOIN({ | ||
id: 1111111111, // Ваш id | ||
key: "5rgpokeK[AQL,zZv6q6d!YJb_uiiOIIuhC![,#uzx4AoT#.reV21", // Ваш Merchant Key | ||
const VKCOIN = require("vkcoin-callback-api"); | ||
const vkcoin = new VKCOIN({ | ||
id: 0, // Ваш ID | ||
key: "" // Ваш Merchant Key | ||
}); | ||
@@ -31,7 +29,7 @@ ``` | ||
Ваш id (19039187) | ||
1. Ваш ID (19039187) | ||
2. Сумма перевода в тысячных долях (1000 = 1 VK Coin) | ||
3. Payload – любое число от -2000000000 до 2000000000, вернется вам в списке транзаций | ||
3. Payload – любое число от -2000000000 до 2000000000, вернется Вам в списке транзаций | ||
@@ -49,5 +47,10 @@ Далее их надо объединить в такую ссылку: vk.com/coin#x19039187*1000* 2000000000 | ||
```js | ||
vkcoin.getLink(amount, payload, fixed); // Первым параметром передаем количество коинов по дефолту, вторым параметром payload котовый вернет VK Coin при пополнении по ссылке (любое число от -2000000000 до 2000000000), третий параметр не обязательный (Устанавливает фиксированную сумму в поле для оплаты) | ||
/* | ||
* amount — количество койнов по умолчанию (число). | ||
* payload — параметр, который вернет VK Coin при пополнении по ссылке (число от -2000000000 до 2000000000). | ||
* isFixed — параметр, отвечающий за изменение суммы пополнения (если поставить true то сумму можно будет менять, не ставьте, если нужна фиксированная сумма). | ||
*/ | ||
vkcoin.getLink(amount, payload, isFixed); | ||
console.log(vkcoin.getLink(100500, 123456789)); // Ссылку в свободном формате с дефолтным значением 100,500 и payload 123456789 vk.com/coin#x19039187_100500_123456789 | ||
console.log(vkcoin.getLink(100500, 123456789)); // vk.com/coin#x19039187_100500_123456789 | ||
``` | ||
@@ -60,7 +63,5 @@ | ||
```js | ||
let port = 3223; | ||
vkcoin.startServer({ | ||
server: "132.123.238.45", // Сервер (Обязательное поле) | ||
port: port, // Порт (По умолчанию 1234) | ||
port: 3223 // Порт (По умолчанию 1234) | ||
}); | ||
@@ -72,5 +73,5 @@ ``` | ||
```js | ||
vkcoin.startPolling(async (event) => { | ||
vkcoin.startPolling(event => { | ||
console.log(event); | ||
// Здесь обрабатывем транзакцию | ||
console.log(event); | ||
}); | ||
@@ -93,5 +94,5 @@ ``` | ||
Где 431035213 - ID получателя, 5000 - Количество коинов для перевода (ВНИМАНИЕ! Количество указывается в тысячных долях, то еcть 5000 = 5 VK Coin) | ||
Где 431035213 - ID получателя, 5000 - Количество коинов для перевода (ВНИМАНИЕ! Количество указывается в тысячных долях, то еcть 5000 = 5 VK Coin). | ||
Для того чтобы платеж был от имени магазина, необхоимо отправить третий параметр | ||
Для того чтобы платеж был от имени магазина, необходимо отправить третий параметр. | ||
@@ -104,11 +105,10 @@ ```js | ||
Для проверки баланса необходимо обратится к методу getBalance и передать массив содержащий не более 100 id получателей | ||
Для проверки баланса необходимо обратиться к методу getBalance и передать массив, содержащий не более 100 ID получателей. | ||
```js | ||
async function get() { | ||
let bal = await vkcoin.getBalance([431035213]); | ||
console.log(bal); | ||
async function getBalance() { | ||
console.log(await vkcoin.getBalance([431035213])); | ||
} | ||
get(); | ||
getBalance(); | ||
``` | ||
@@ -118,3 +118,3 @@ | ||
Для обработки этого ответа console.log(bal.response[431035213]) в таком случае мы поучим баланс пользователя 431035213 в тысячных долях 10991024280 | ||
Для обработки этого ответа console.log(bal.response[431035213]), в таком случае мы получим баланс пользователя 431035213 в тысячных долях 10991024280. | ||
@@ -124,10 +124,7 @@ ## Получим баланс нескольких пользователей | ||
```js | ||
let users = [431035213, 237435213, 237435783]; | ||
const usersId = [431035213, 237435213, 237435783]; | ||
async function get() { | ||
let bal = await vkcoin.getBalance(users); // Получаем баланс пользователей | ||
// Выведем их в консоль по одному | ||
for (let i = 0; i < users.length; i++) { | ||
console.log(bal.response[users[i]] / 1000); // В таком случае мы выведем в консоль баланс всех пользователей в привычном нам формате. | ||
} | ||
async function getBalance() { | ||
const balRes = await vkcoin.getBalance(usersId); // Получаем баланс пользователей | ||
Object.values(balRes.response).map(balance => console.log(balance / 1000)); // Выведем их в консоль по одному | ||
} | ||
@@ -145,23 +142,14 @@ ``` | ||
```js | ||
let VKCOIN = require(`vkcoin-callback-api`); | ||
const { VK } = new require("vk-io"); | ||
const vk = new VK(); | ||
const VKCOIN = require("vkcoin-callback-api"); | ||
const { VK, getRandomId } = require("vk-io"); | ||
let link = "vk.com/coin#x${ID}_${amount}_${payload}_1" // Собираем ссылку по которой нам будут переводить коины | ||
vk.setOptions({ | ||
token: "Ваш токен сообщества", | ||
pollingGroupId: 1111, // id паблика | ||
apiMode: "parallel", // execute api mode для отправки до 50 сообщний в секунду | ||
const vk = new VK({ token: "token" }); | ||
const vkcoin = new VKCOIN({ | ||
id: 0, // Ваш ID | ||
key: "" // Ваш Merchant Key | ||
}); | ||
let vkcoin = new VKCOIN({ | ||
id: 1111111111, // Ваш id | ||
key: "5rgpokeK[AQL,zZv6q6d!YJb_uiiOIIuhC![,#uzx4AoT#.reV21", // Ваш Merchant Key | ||
}); | ||
vkcoin.startServer({ | ||
server: "188.323.22.11", // Сервер (Обязательное поле) | ||
port: 1111, // Порт (По умолчанию 1234) | ||
port: 1111 // Порт (По умолчанию 1234) | ||
}); | ||
@@ -171,41 +159,32 @@ | ||
vkcoin.startPolling(async (event) => { | ||
console.log(event); // Выводим в консоль то что нам вернет вк коин при переводе на нашего бота | ||
vkcoin.startPolling(async event => { | ||
console.log(event); // Выводим в консоль то, что нам вернет VK Coin при поступлении баланса | ||
/* | ||
response возвращаемый при поплнении бота по ссылке: | ||
{ | ||
id: 418034787, (id транзакции) | ||
fromId: 431035213, (id пользователя отправившего нам коины) | ||
toId: 354673884, (id нашего бота) | ||
amount: 5000, (Сумма пополнения * в тысячных долях, тоесть нам перевели 5 VK Coin) | ||
payload: -944320189, (payload перевода * указывается в ссылке на пополнение) | ||
created_at: 1595181763, (Дата события) | ||
from_id: 431035213, (id пользователя отправившего нам коины) | ||
to_id: 354673884, (id нашего бота) | ||
key: 'dbd9579344cdc9d22e912219a3801e34' (хэш) | ||
} | ||
*/ | ||
response — объект, возвращаемый при пополнении бота по ссылке: | ||
{ | ||
id: 418034787, (id транзакции) | ||
fromId: 431035213, (id пользователя, отправившего нам коины) | ||
toId: 354673884, (id нашего бота) | ||
amount: 5000, (Сумма пополнения * в тысячных долях, то есть нам перевели 5 VK Coin) | ||
payload: -944320189, (payload перевода * указывается в ссылке на пополнение) | ||
created_at: 1595181763, (Дата события) | ||
from_id: 431035213, (id пользователя, отправившего нам коины) | ||
to_id: 354673884, (id нашего бота) | ||
key: 'dbd9579344cdc9d22e912219a3801e34' (хэш) | ||
} | ||
*/ | ||
// Далее обробатываем | ||
// Далее обрабатываем | ||
let balance = await vkcoin.getBalance([event.fromId]) // Проверяем баланс пользователя отправившего нам коины | ||
if (balance[event.fromId] / 1000 < 5000000) { | ||
vkcoin.send(event.fromId, 5000000 - balance[event.fromId] / 1000) // Отправляем пользователю коины для того чтобы его баланс был равен 5 000 000 | ||
const balance = await vkcoin.getBalance([event.fromId]); // Проверяем баланс пользователя, отправившего нам коины | ||
if ((balance[event.fromId] / 1000) < 5000000) { | ||
vkcoin.send(event.fromId, 5000000 - (balance[event.fromId] / 1000)); // Отправляем пользователю коины для того, чтобы его баланс был равен 5 000 000 | ||
vk.api.messages.send({ | ||
user_id: event.fromId, | ||
message: `Мы отправили тебе ${5000000 - balance[event.fromId] / 1000} | ||
Теперь твой баланс 5 000 000` // Отправляем пользователю сообщение о том что его баланс пополнен | ||
}); | ||
} else { | ||
vk.api.messages.send({ | ||
user_id: event.fromId, | ||
message: `Твой баланс ${vkcoin.format(balance[event.fromId] / 1000)}, так как твой баланс больше 5 000 000 | ||
мы тебе ничего не отправим` // Отправляем пользователю сообщение о том что его баланс более 5 000 000 VK Coin | ||
}); | ||
} | ||
vk.api.messages.send({ user_id: event.fromId, message: `Мы отправили тебе ${5000000 - balance[event.fromId] / 1000}\nТеперь твой баланс 5 000 000`, random_id: getRandomId() }); // Отправляем пользователю сообщение о том, что его баланс пополнен | ||
} else { | ||
vk.api.messages.send({ user_id: event.fromId, message: `Твой баланс ${vkcoin.format(balance[event.fromId] / 1000)}, т.к. твой баланс больше 5 000 000 VK Coin мы тебе ничего не отправим`, random_id: getRandomId() }); // Отправляем пользователю сообщение о том, что его баланс более 5 000 000 VK Coin | ||
} | ||
}); | ||
``` | ||
<p align='center'>Made by <a href="https://хор-енотов.рф">ХОР ЕНОТОВ</a></p> | ||
<p align='center'>Made by <a href="https://хор-енотов.рф">ХОР ЕНОТОВ</a></p> |
13478
2
87
179
+ Addedaxios@^0.27.2
+ Addedjs-md5@^0.7.3
+ Addedaxios@0.27.2(transitive)
+ Addedfollow-redirects@1.15.6(transitive)
+ Addedform-data@4.0.0(transitive)
+ Addedjs-md5@0.7.3(transitive)
- Removedprequest@^1.0.0
- Removedajv@6.12.6(transitive)
- Removedasn1@0.2.6(transitive)
- Removedassert-plus@1.0.0(transitive)
- Removedaws-sign2@0.7.0(transitive)
- Removedaws4@1.12.0(transitive)
- Removedbcrypt-pbkdf@1.0.2(transitive)
- Removedbluebird@3.7.2(transitive)
- Removedcaseless@0.12.0(transitive)
- Removedcore-util-is@1.0.2(transitive)
- Removeddashdash@1.14.1(transitive)
- Removedecc-jsbn@0.1.2(transitive)
- Removedextend@3.0.2(transitive)
- Removedextsprintf@1.3.0(transitive)
- Removedfast-deep-equal@3.1.3(transitive)
- Removedfast-json-stable-stringify@2.1.0(transitive)
- Removedforever-agent@0.6.1(transitive)
- Removedform-data@2.3.3(transitive)
- Removedgetpass@0.1.7(transitive)
- Removedhar-schema@2.0.0(transitive)
- Removedhar-validator@5.1.5(transitive)
- Removedhttp-signature@1.2.0(transitive)
- Removedis-typedarray@1.0.0(transitive)
- Removedisstream@0.1.2(transitive)
- Removedjsbn@0.1.1(transitive)
- Removedjson-schema@0.4.0(transitive)
- Removedjson-schema-traverse@0.4.1(transitive)
- Removedjson-stringify-safe@5.0.1(transitive)
- Removedjsprim@1.4.2(transitive)
- Removedoauth-sign@0.9.0(transitive)
- Removedobject-assign@2.1.1(transitive)
- Removedperformance-now@2.1.0(transitive)
- Removedprequest@1.0.0(transitive)
- Removedpsl@1.9.0(transitive)
- Removedpunycode@2.3.1(transitive)
- Removedqs@6.5.3(transitive)
- Removedrequest@2.88.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedsshpk@1.18.0(transitive)
- Removedtough-cookie@2.5.0(transitive)
- Removedtunnel-agent@0.6.0(transitive)
- Removedtweetnacl@0.14.5(transitive)
- Removeduri-js@4.4.1(transitive)
- Removeduuid@3.4.0(transitive)
- Removedverror@1.10.0(transitive)