Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

yoomoney-sdk

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

yoomoney-sdk - npm Package Compare versions

Comparing version 1.5.1 to 1.5.2

api.d.ts

330

dist/cjs/api.js

@@ -1,20 +0,14 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var fetch = require('./fetch.js');
/**
* Ошибка, которую выбрасывает API при ошибочном ответе от сервера
*/
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fetch = require("./fetch.js");
class YMApiError extends Error {
/**
* Объект ответа
* @param {AnyRecord} response
*/
constructor(response) {
super(`API returned error code: ${response.error}`);
this.response = response;
this.code = response.error;
}
/**
* Объект ответа
* @param {AnyRecord} response
*/
constructor(response) {
super(`API returned error code: ${response.error}`);
this.response = response;
this.code = response.error;
}
}

@@ -27,4 +21,3 @@ /**

*/
class YMApiVoidResponseError extends Error {
}
class YMApiVoidResponseError extends Error {}
/**

@@ -38,153 +31,156 @@ * Имплементирует [основное API YooMoney](https://yoomoney.ru/docs/wallet)

class API {
/**
* Creates an instance of API.
* @param {string} token Токен авторизации пользователя
* @param {string=} [endpoint="https://yoomoney.ru/api"] По умолчанию `https://yoomoney.ru/api`
* @param {Agent=} [agent]
* @memberof API
*/
constructor(token, endpoint = "https://yoomoney.ru/api", agent) {
this.token = token;
this.endpoint = endpoint;
this.agent = agent;
/**
* Creates an instance of API.
* @param {string} token Токен авторизации пользователя
* @param {string=} [endpoint="https://yoomoney.ru/api"] По умолчанию `https://yoomoney.ru/api`
* @param {Agent=} [agent]
* @memberof API
*/
constructor(token, endpoint = "https://yoomoney.ru/api", agent) {
this.token = token;
this.endpoint = endpoint;
this.agent = agent;
}
/**
* Позволяет совершить вызов произвольного метода API
*
* @template T
* @param {string} method Название метода
* @param {QueryStringifiable} parameters Параметры метода
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @return {Promise<T>}
*/
async call(method, parameters) {
const data = await fetch.fetch(
`${this.endpoint}/${method}`,
parameters,
{
Authorization: `Bearer ${this.token}`
},
this.agent
);
if (data.error) throw new YMApiError(data);
if (typeof data === "string" && data.trim() === "") {
throw new YMApiVoidResponseError();
}
/**
* Позволяет совершить вызов произвольного метода API
*
* @template T
* @param {string} method Название метода
* @param {QueryStringifiable} parameters Параметры метода
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @return {Promise<T>}
*/
async call(method, parameters) {
const data = await fetch.fetch(`${this.endpoint}/${method}`, parameters, {
Authorization: `Bearer ${this.token}`
}, this.agent);
if (data.error)
throw new YMApiError(data);
if (typeof data === "string" && data.trim() === "") {
throw new YMApiVoidResponseError();
}
return data;
}
/**
* Получение информации о состоянии счета пользователя.
*
* Требуемые права токена: `account-info`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @return {t.AccountInfoResponse}
*/
async accountInfo() {
return await this.call("account-info", {});
}
/**
* Метод позволяет просматривать историю операций (полностью или частично) в постраничном режиме. Записи истории выдаются в обратном хронологическом порядке: от последних к более ранним.
*
* Требуемые права токена: `operation-history`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.OperationHistoryParameters=} [parameters={}] Параметры вызова
* @return {Promise<t.OperationHistoryResponse>}
*/
async operationHistory(parameters = {}) {
return await this.call("operation-history", parameters);
}
/**
* Позволяет получить детальную информацию об операции из истории.
*
* Требуемые права токена: `operation-details`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.OperationDetailsParameters} parameters Параметры вызова
* @return {Promise<t.Operation>}
*/
async operationDetails(parameters) {
return await this.call("operation-details", parameters);
}
/**
* Создание платежа, проверка параметров и возможности приема
* платежа магазином или перевода средств на счет пользователя
* ЮMoney.
*
* Требуемые права токена:
* - для платежа в магазин: `payment.to-pattern`
* («шаблон платежа») или `payment-shop`.
*
* - для перевода средств на счета других пользователей:
* `payment.to-account` («идентификатор получателя»,
* «тип идентификатора») или `payment-p2p`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.RequestPaymentParameters} parameters Параметры вызова
* @return {Promise<t.RequestPaymentResponse>}
*/
async requestPayment(parameters) {
return await this.call("request-payment", parameters);
}
/**
* Подтверждение платежа, ранее созданного методом
* [request-payment](https://yoomoney.ru/docs/wallet/process-payments/request-payment).
* Указание метода проведения платежа.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.ProcessPaymentParameters} parameters Параметры вызова
* @return {Promise<t.ProcessPaymentResponse>}
*/
async processPayment(parameters) {
return await this.call("process-payment", parameters);
}
/**
* Прием входящих переводов, защищенных кодом протекции, и
* переводов до востребования.
*
* Количество попыток приема входящего перевода с кодом протекции
* ограничено. При исчерпании количества попыток, перевод
* автоматически отвергается (перевод возвращается отправителю).
*
* Требуемые права токена: `incoming-transfers`
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.IncomingTransferAcceptParameters} parameters Параметры вызова
* @return {Promise<t.IncomingTransferAcceptResponse>}
*/
async incomingTransferAccept(parameters) {
return await this.call("incoming-transfer-accept", parameters);
}
/**
* Отмена входящих переводов, защищенных кодом протекции, и
* переводов до востребования. При отмене перевода он возвращается
* отправителю.
*
* Требуемые права токена: `incoming-transfers`
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.IncomingTransferRejectParameters} parameters Параметры вызова
* @return {Promise<t.IncomingTransferRejectResponse>}
*/
async incomingTransferReject(parameters) {
return await this.call("incoming-transfer-accept", parameters);
}
return data;
}
/**
* Получение информации о состоянии счета пользователя.
*
* Требуемые права токена: `account-info`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @return {t.AccountInfoResponse}
*/
async accountInfo() {
return await this.call("account-info", {});
}
/**
* Метод позволяет просматривать историю операций (полностью или частично) в постраничном режиме. Записи истории выдаются в обратном хронологическом порядке: от последних к более ранним.
*
* Требуемые права токена: `operation-history`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.OperationHistoryParameters=} [parameters={}] Параметры вызова
* @return {Promise<t.OperationHistoryResponse>}
*/
async operationHistory(parameters = {}) {
return await this.call("operation-history", parameters);
}
/**
* Позволяет получить детальную информацию об операции из истории.
*
* Требуемые права токена: `operation-details`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.OperationDetailsParameters} parameters Параметры вызова
* @return {Promise<t.Operation>}
*/
async operationDetails(parameters) {
return await this.call("operation-details", parameters);
}
/**
* Создание платежа, проверка параметров и возможности приема
* платежа магазином или перевода средств на счет пользователя
* ЮMoney.
*
* Требуемые права токена:
* - для платежа в магазин: `payment.to-pattern`
* («шаблон платежа») или `payment-shop`.
*
* - для перевода средств на счета других пользователей:
* `payment.to-account` («идентификатор получателя»,
* «тип идентификатора») или `payment-p2p`.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.RequestPaymentParameters} parameters Параметры вызова
* @return {Promise<t.RequestPaymentResponse>}
*/
async requestPayment(parameters) {
return await this.call("request-payment", parameters);
}
/**
* Подтверждение платежа, ранее созданного методом
* [request-payment](https://yoomoney.ru/docs/wallet/process-payments/request-payment).
* Указание метода проведения платежа.
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.ProcessPaymentParameters} parameters Параметры вызова
* @return {Promise<t.ProcessPaymentResponse>}
*/
async processPayment(parameters) {
return await this.call("process-payment", parameters);
}
/**
* Прием входящих переводов, защищенных кодом протекции, и
* переводов до востребования.
*
* Количество попыток приема входящего перевода с кодом протекции
* ограничено. При исчерпании количества попыток, перевод
* автоматически отвергается (перевод возвращается отправителю).
*
* Требуемые права токена: `incoming-transfers`
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.IncomingTransferAcceptParameters} parameters Параметры вызова
* @return {Promise<t.IncomingTransferAcceptResponse>}
*/
async incomingTransferAccept(parameters) {
return await this.call("incoming-transfer-accept", parameters);
}
/**
* Отмена входящих переводов, защищенных кодом протекции, и
* переводов до востребования. При отмене перевода он возвращается
* отправителю.
*
* Требуемые права токена: `incoming-transfers`
*
* @throws {YMApiError}
* @throws {YMApiVoidResponseError}
*
* @param {t.IncomingTransferRejectParameters} parameters Параметры вызова
* @return {Promise<t.IncomingTransferRejectResponse>}
*/
async incomingTransferReject(parameters) {
return await this.call("incoming-transfer-accept", parameters);
}
}
exports.API = API;
exports.YMApiError = YMApiError;
exports.YMApiVoidResponseError = YMApiVoidResponseError;

@@ -1,2 +0,1 @@

'use strict';
"use strict";

@@ -1,17 +0,14 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var redirectFormBuilder = require('redirect-form-builder');
var fetch = require('./fetch.js');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const redirectFormBuilder = require("redirect-form-builder"),
fetch = require("./fetch.js");
const AuthScope = {
AccountInfo: "account-info",
OperationHistory: "operation-history",
OperationDetails: "operation-details",
IncomingTransfers: "incoming-transfers",
Payment: "payment",
PaymentShop: "payment-shop",
PaymentP2P: "payment-p2p",
MoneySource: "money-source"
AccountInfo: "account-info",
OperationHistory: "operation-history",
OperationDetails: "operation-details",
IncomingTransfers: "incoming-transfers",
Payment: "payment",
PaymentShop: "payment-shop",
PaymentP2P: "payment-p2p",
MoneySource: "money-source"
};

@@ -24,10 +21,10 @@ /**

class YMAuthError extends Error {
/**
*
* @param {string} code Код ошибки
*/
constructor(code) {
super(`API returned error: ${code}`);
this.code = code;
}
/**
*
* @param {string} code Код ошибки
*/
constructor(code) {
super(`API returned error: ${code}`);
this.code = code;
}
}

@@ -42,81 +39,94 @@ /**

class Auth {
/**
* Creates an instance of Auth.
* @memberof Auth
* @param {string} clientId ID приложения
* @param {string} redirectUrl URL-перенаправления
* @param {string=} [clientSecret] Секретное Слово
* @param {string} [endpoint="https://yoomoney.ru/oauth"] По умолчанию `https://yoomoney.ru/oauth`
* @param {Agent=} [agent] HTTP Agent для использования с Proxy
*/
constructor(clientId, redirectUrl, clientSecret, endpoint = "https://yoomoney.ru/oauth/", agent) {
this.clientId = clientId;
this.redirectUrl = redirectUrl;
this.clientSecret = clientSecret;
this.endpoint = endpoint;
this.agent = agent;
/**
* Creates an instance of Auth.
* @memberof Auth
* @param {string} clientId ID приложения
* @param {string} redirectUrl URL-перенаправления
* @param {string=} [clientSecret] Секретное Слово
* @param {string} [endpoint="https://yoomoney.ru/oauth"] По умолчанию `https://yoomoney.ru/oauth`
* @param {Agent=} [agent] HTTP Agent для использования с Proxy
*/
constructor(
clientId,
redirectUrl,
clientSecret,
endpoint = "https://yoomoney.ru/oauth/",
agent
) {
this.clientId = clientId;
this.redirectUrl = redirectUrl;
this.clientSecret = clientSecret;
this.endpoint = endpoint;
this.agent = agent;
}
/**
* Генерирует html-форму перенаправления пользователя на авторизацию
*
* @memberof Auth
* @param {AuthScope[]} scope
* @param {string=} instanceName
* @return {string}
*/
getAuthForm(scope, instanceName) {
const builder = new redirectFormBuilder.FormBuilder(
`${this.endpoint}/authorize`,
"POST",
{
client_id: this.clientId,
response_type: "code",
redirect_uri: this.redirectUrl,
scope: scope.join(" ")
}
);
if (instanceName) {
builder.setField("instance_name", instanceName);
}
/**
* Генерирует html-форму перенаправления пользователя на авторизацию
*
* @memberof Auth
* @param {AuthScope[]} scope
* @param {string=} instanceName
* @return {string}
*/
getAuthForm(scope, instanceName) {
const builder = new redirectFormBuilder.FormBuilder(`${this.endpoint}/authorize`, "POST", {
client_id: this.clientId,
response_type: "code",
redirect_uri: this.redirectUrl,
scope: scope.join(" ")
});
if (instanceName) {
builder.setField("instance_name", instanceName);
}
return builder.buildHtml();
return builder.buildHtml();
}
/**
* Генерирует URL для перенаправления пользователя на авторизацию
*
* @memberof Auth
* @param {AuthScope[]} scope
* @param {string=} instanceName
* @return {string}
*/
getAuthUrl(scope, instanceName) {
const url = new URL("/authorize", this.endpoint);
url.searchParams.set("client_id", this.clientId);
url.searchParams.set("response_type", "code");
url.searchParams.set("redirect_uri", this.redirectUrl);
url.searchParams.set("scope", scope.join(" "));
if (instanceName) {
url.searchParams.set("instance_name", instanceName);
}
/**
* Генерирует URL для перенаправления пользователя на авторизацию
*
* @memberof Auth
* @param {AuthScope[]} scope
* @param {string=} instanceName
* @return {string}
*/
getAuthUrl(scope, instanceName) {
const url = new URL("/authorize", this.endpoint);
url.searchParams.set("client_id", this.clientId);
url.searchParams.set("response_type", "code");
url.searchParams.set("redirect_uri", this.redirectUrl);
url.searchParams.set("scope", scope.join(" "));
if (instanceName) {
url.searchParams.set("instance_name", instanceName);
}
return url.toString();
}
/**
* Обменивает временный токен на постоянный токен авторизации
*
* @memberof Auth
* @throws {YMAuthError}
* @param {string} code Временный токен (authorization code)
* @return {Promise<string>} Токен авторизации
*/
async exchangeCode2Token(code) {
const json = await fetch.fetch(`${this.endpoint}/token`, {
code,
client_id: this.clientId,
grant_type: "authorization_code",
redirect_uri: this.redirectUrl,
client_secret: this.clientSecret
}, {}, this.agent);
if (json.error)
throw new YMAuthError(json.error);
return json.access_token;
}
return url.toString();
}
/**
* Обменивает временный токен на постоянный токен авторизации
*
* @memberof Auth
* @throws {YMAuthError}
* @param {string} code Временный токен (authorization code)
* @return {Promise<string>} Токен авторизации
*/
async exchangeCode2Token(code) {
const json = await fetch.fetch(
`${this.endpoint}/token`,
{
code,
client_id: this.clientId,
grant_type: "authorization_code",
redirect_uri: this.redirectUrl,
client_secret: this.clientSecret
},
{},
this.agent
);
if (json.error) throw new YMAuthError(json.error);
return json.access_token;
}
}
exports.Auth = Auth;
exports.AuthScope = AuthScope;
exports.YMAuthError = YMAuthError;

@@ -1,13 +0,8 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var axios = require('axios');
var querystring = require('querystring');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
// import nodeFetch, { RequestInit, Response } from "node-fetch";
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const axios = require("axios"),
querystring = require("querystring");
const _interopDefaultLegacy = (e) =>
e && typeof e === "object" && "default" in e ? e["default"] : e;
const axios__default = /*#__PURE__*/ _interopDefaultLegacy(axios);
/**

@@ -23,19 +18,21 @@ *

async function fetch(url, parameters, headers = {}, agent) {
return await axios__default["default"]
.post(url, querystring.stringify(parameters), {
headers: {
...headers,
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json"
},
httpAgent: agent,
httpsAgent: agent,
responseType: "json"
return await axios__default
.post(url, querystring.stringify(parameters), {
headers: {
"User-Agent": "yoomoney-sdk/1.5.2 (+https://npmjs.com/package/yoomoney-sdk)",
...headers,
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json"
},
httpAgent: agent,
httpsAgent: agent,
responseType: "json"
})
.then((response) => response.data)
.catch((error) => axios__default["default"].isAxiosError(error) && error.response
.then((response) => response.data)
.catch((error) =>
axios__default.isAxiosError(error) && error.response
? error.response
: Promise.reject(error));
: Promise.reject(error)
);
}
exports.fetch = fetch;
export { API as YMApi, API as API, YMApiError, YMApiVoidResponseError } from "./api";
export * as ymTypes from "./api.types";
export * from "./api.types";
export { Auth as YMAuth, Auth, YMAuthError, AuthScope } from "./auth";
export { NotificationChecker as YMNotificationChecker, NotificationChecker, NotificationDTO as YMNotificationDTO, NotificationDTO, YMNotificationError } from "./notifications";
export { FormConfig as YMFormConfig, FormConfig, PaymentType as YMFormPaymentType, PaymentType as FormPaymentType, PaymentType, PaymentFormBuilder as YMPaymentFromBuilder, PaymentFormBuilder as YMPaymentFormBuilder, PaymentFormBuilder as PaymentFormBuilder } from "./payment-form-builder";

@@ -1,13 +0,8 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var api = require('./api.js');
var api_types = require('./api.types.js');
var auth = require('./auth.js');
var notifications = require('./notifications.js');
var paymentFormBuilder = require('./payment-form-builder.js');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const api = require("./api.js"),
api_types = require("./api.types.js"),
auth = require("./auth.js"),
notifications = require("./notifications.js"),
paymentFormBuilder = require("./payment-form-builder.js");
exports.API = api.API;

@@ -14,0 +9,0 @@ exports.YMApi = api.API;

@@ -1,14 +0,7 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var crypto = require('crypto');
var querystring = require('querystring');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const crypto = require("crypto"),
querystring = require("querystring");
class YMNotificationError extends Error {}
/**
* Ошибка проверки уведомления от YooMoney
*/
class YMNotificationError extends Error {
}
/**
* @template {CallableFunction} T

@@ -20,14 +13,12 @@ *

function promise(function_) {
const wrapper = (...parameters) => {
try {
const result = function_(...parameters);
if (result instanceof Promise)
return result;
return Promise.resolve(result);
}
catch (error) {
return Promise.reject(error);
}
};
return wrapper;
const wrapper = (...parameters) => {
try {
const result = function_(...parameters);
if (result instanceof Promise) return result;
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
};
return wrapper;
}

@@ -42,120 +33,117 @@ /**

class NotificationChecker {
/**
* Creates an instance of NotificationChecker.
* @param {string} secret Секретное слово
* @memberof NotificationChecker
*/
constructor(secret) {
this.secret = secret;
/**
* Creates an instance of NotificationChecker.
* @param {string} secret Секретное слово
* @memberof NotificationChecker
*/
constructor(secret) {
this.secret = secret;
}
/**
* Проверяет полученное уведомление и возвращает типизированную версию
*
* @throws {YMNotificationError} Если хеш уведомления не совпадает
* @param {Object} notification Объект уведомления
* @return {NotificationDTO}
* @memberof NotificationChecker
*/
check(notification) {
const notificationWithSecret = {
...notification,
notification_secret: this.secret
};
const pattern =
"notification_type&operation_id&amount&currency&datetime&sender&codepro&notification_secret&label";
const signature = pattern
.split("&")
.map((key) => notificationWithSecret[key])
.join("&");
const hash = crypto.createHash("sha1").update(signature).digest();
if (!crypto.timingSafeEqual(hash, Buffer.from(notification.sha1_hash, "hex"))) {
throw new YMNotificationError(`Notification hash mismatch`);
}
/**
* Проверяет полученное уведомление и возвращает типизированную версию
*
* @throws {YMNotificationError} Если хеш уведомления не совпадает
* @param {Object} notification Объект уведомления
* @return {NotificationDTO}
* @memberof NotificationChecker
*/
check(notification) {
const notificationWithSecret = {
...notification,
notification_secret: this.secret
};
const pattern = "notification_type&operation_id&amount&currency&datetime&sender&codepro&notification_secret&label";
const signature = pattern
.split("&")
.map((key) => notificationWithSecret[key])
.join("&");
const hash = crypto.createHash("sha1").update(signature).digest();
if (!crypto.timingSafeEqual(hash, Buffer.from(notification.sha1_hash, "hex"))) {
throw new YMNotificationError(`Notification hash mismatch`);
}
return {
...notification,
amount: Number.parseFloat(notification.amount),
notification_type: notification.notification_type,
withdraw_amount: Number.parseFloat(notification.withdraw_amount) || 0,
currency: notification.currency,
codepro: Boolean(notification.codepro),
test_notification: Boolean(notification.test_notification),
unaccepted: Boolean(notification.unaccepted)
};
}
/**
*
* `[Экспериментально]` Упрощает интеграцию с `express`
*
* #### Это middleware кидает ошибки, позаботьтесь об их обработке
*
* @param {Object} [options={}] Параметры обработки запроса
* @param {boolean} [options.memo=true] Флаг для включения/отключения пропуска повторяющихся запросов, если один из них был успешно обработан
* @memberof NotificationChecker
* @param {RequestHandler<Record<string, string>, any, NotificationDTO>=} actualHandler
* @return {RequestHandler}
*
* ##### Пример:
* **В начале файла**
* ```js
* const nc = new YMNotificationChecker(process.env.YM_SECRET);
*
* ```
* *`Вариант 1 - Классический`*
*
* ```js
* app.post('/webhook/yoomoney', nc.middleware(), (req, res) => {
* req.body // Это `NotificationDTO`
* })
* ```
*
* *`Вариант 2 - Если нужны подсказки типов`*
*
* ```js
* app.post('/webhook/yoomoney', nc.middleware({}, (req, res) => {
* req.body // Это `NotificationDTO`
* }))
* ```
*
* **Обработка ошибок**
* ```js
* app.use((error, request, response, next) => {
* console.log(error); // [YMNotificationError: Notification hash mismatch]
* })
* ```
*/
middleware(options = {}, actualHandler = (_request, _response, next) => next()) {
const calls = new Set();
const { memo = true } = options;
return async (request, response, next) => {
let body = {};
if (!request.body) {
const text = await new Promise((resolve, reject) => {
let accumulated = "";
request.on("error", (error) => reject(error));
request.on("data", (data) => (accumulated += String(data)));
request.on("end", () => resolve(accumulated));
});
body = querystring.parse(text);
}
if (typeof request.body === "object") {
body = request.body;
}
const key = body.sha1_hash;
if (memo && calls.has(key))
return next();
try {
const notification = this.check(body);
request.body = notification;
}
catch (error) {
return next(error);
}
if (!memo)
return actualHandler(request, response, next);
await promise(actualHandler)(request, response, next);
calls.add(key);
};
}
return {
...notification,
amount: Number.parseFloat(notification.amount),
notification_type: notification.notification_type,
withdraw_amount: Number.parseFloat(notification.withdraw_amount) || 0,
currency: notification.currency,
codepro: Boolean(notification.codepro),
test_notification: Boolean(notification.test_notification),
unaccepted: Boolean(notification.unaccepted)
};
}
/**
*
* `[Экспериментально]` Упрощает интеграцию с `express`
*
* #### Это middleware кидает ошибки, позаботьтесь об их обработке
*
* @param {Object} [options={}] Параметры обработки запроса
* @param {boolean} [options.memo=true] Флаг для включения/отключения пропуска повторяющихся запросов, если один из них был успешно обработан
* @memberof NotificationChecker
* @param {RequestHandler<Record<string, string>, any, NotificationDTO>=} actualHandler
* @return {RequestHandler}
*
* ##### Пример:
* **В начале файла**
* ```js
* const nc = new YMNotificationChecker(process.env.YM_SECRET);
*
* ```
* *`Вариант 1 - Классический`*
*
* ```js
* app.post('/webhook/yoomoney', nc.middleware(), (req, res) => {
* req.body // Это `NotificationDTO`
* })
* ```
*
* *`Вариант 2 - Если нужны подсказки типов`*
*
* ```js
* app.post('/webhook/yoomoney', nc.middleware({}, (req, res) => {
* req.body // Это `NotificationDTO`
* }))
* ```
*
* **Обработка ошибок**
* ```js
* app.use((error, request, response, next) => {
* console.log(error); // [YMNotificationError: Notification hash mismatch]
* })
* ```
*/
middleware(options = {}, actualHandler = (_request, _response, next) => next()) {
const calls = new Set();
const { memo = true } = options;
return async (request, response, next) => {
let body = {};
if (!request.body) {
const text = await new Promise((resolve, reject) => {
let accumulated = "";
request.on("error", (error) => reject(error));
request.on("data", (data) => (accumulated += String(data)));
request.on("end", () => resolve(accumulated));
});
body = querystring.parse(text);
}
if (typeof request.body === "object") {
body = request.body;
}
const key = body.sha1_hash;
if (memo && calls.has(key)) return next();
try {
const notification = this.check(body);
request.body = notification;
} catch (error) {
return next(error);
}
if (!memo) return actualHandler(request, response, next);
await promise(actualHandler)(request, response, next);
calls.add(key);
};
}
}
exports.NotificationChecker = NotificationChecker;
exports.YMNotificationError = YMNotificationError;

@@ -1,12 +0,8 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var redirectFormBuilder = require('redirect-form-builder');
/* eslint-disable no-invalid-this */
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const redirectFormBuilder = require("redirect-form-builder");
const PaymentType = {
FromCard: "AC",
FromWallet: "PC",
FromMobileBalance: "MC"
FromCard: "AC",
FromWallet: "PC",
FromMobileBalance: "MC"
};

@@ -19,18 +15,18 @@ /**

function convert(config) {
return {
"quickpay-form": config.quickPayForm,
paymentType: config.paymentType,
receiver: config.receiver,
sum: config.sum.toString(),
targets: config.targets,
"need-address": String(!!config.needAddress),
"need-email": String(!!config.needEmail),
"need-fio": String(!!config.needFio),
"need-phone": String(!!config.needPhone),
"short-dest": config.shortDest,
comment: config.comment,
formcomment: config.formComment,
label: config.label,
successURL: config.successURL
};
return {
"quickpay-form": config.quickPayForm,
paymentType: config.paymentType,
receiver: config.receiver,
sum: config.sum.toString(),
targets: config.targets,
"need-address": String(!!config.needAddress),
"need-email": String(!!config.needEmail),
"need-fio": String(!!config.needFio),
"need-phone": String(!!config.needPhone),
"short-dest": config.shortDest,
comment: config.comment,
formcomment: config.formComment,
label: config.label,
successURL: config.successURL
};
}

@@ -43,126 +39,131 @@ /**

class PaymentFormBuilder {
/**
*
* Creates an instance of PaymentFormBuilder.
* @param {FormConfig} [config={
* paymentType: "PC",
* receiver: "",
* sum: 100,
* quickPayForm: "shop",
* targets: ""
* }] Изначальные настройки формы
* @memberof PaymentFormBuilder
*/
constructor(config = {
paymentType: "PC",
receiver: "",
sum: 100,
quickPayForm: "shop",
targets: ""
}) {
this.config = config;
this.setTargets = this._makeSetter("targets");
this.setPaymentType = this._makeSetter("paymentType");
this.setQuickPayForm = this._makeSetter("quickPayForm");
this.setType = this._makeSetter("quickPayForm");
this.setFormComment = this._makeSetter("formComment");
this.setShortDest = this._makeSetter("shortDest");
this.setLabel = this._makeSetter("label");
this.setComment = this._makeSetter("comment");
/**
*
* Creates an instance of PaymentFormBuilder.
* @param {FormConfig} [config={
* paymentType: "PC",
* receiver: "",
* sum: 100,
* quickPayForm: "shop",
* targets: ""
* }] Изначальные настройки формы
* @memberof PaymentFormBuilder
*/
constructor(
config = {
paymentType: "PC",
receiver: "",
sum: 100,
quickPayForm: "shop",
targets: ""
}
/**
* Генерирует стандартные сеттеры
*
* @param {string} field
* @return {Function}
* @private
* @memberof PaymentFromBuilder
*/
_makeSetter(field) {
return (value) => Object.defineProperty(this, field, { value });
}
/**
* Задаёт сумму платежа
*
* @memberof PaymentFromBuilder
* @param {string | number} amount Сумма
* @return {this}
*/
setAmount(amount) {
this.config.sum = Number.parseFloat(amount.toString());
return this;
}
/**
* Задаёт получателя платежа
*
* @memberof PaymentFromBuilder
* @param {string | number} receiver Получатель
* @return {this}
*/
setReceiver(receiver) {
this.config.receiver = receiver.toString();
return this;
}
/**
* Задаёт URL перенаправления после успешного платежа
*
* @memberof PaymentFromBuilder
* @param {string | URL} url URL
* @return {this}
*/
setSuccessURL(url) {
this.config.successURL = url.toString();
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireFio(doRequire = true) {
this.config.needFio = doRequire;
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireAddress(doRequire = true) {
this.config.needAddress = doRequire;
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireEmail(doRequire = true) {
this.config.needEmail = doRequire;
return this;
}
/**
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requirePhone(doRequire = true) {
this.config.needPhone = doRequire;
return this;
}
/**
* Генерирует HTML на основе заданных параметров
* @memberof PaymentFromBuilder
* @param {boolean} [fullPage=false]
* @return {string}
*/
buildHtml(fullPage = false) {
return new redirectFormBuilder.FormBuilder("https://yoomoney.ru/quickpay/confirm.xml", "POST", convert(this.config)).buildHtml(fullPage);
}
) {
this.config = config;
this.setTargets = this._makeSetter("targets");
this.setPaymentType = this._makeSetter("paymentType");
this.setQuickPayForm = this._makeSetter("quickPayForm");
this.setType = this._makeSetter("quickPayForm");
this.setFormComment = this._makeSetter("formComment");
this.setShortDest = this._makeSetter("shortDest");
this.setLabel = this._makeSetter("label");
this.setComment = this._makeSetter("comment");
}
/**
* Генерирует стандартные сеттеры
*
* @param {string} field
* @return {Function}
* @private
* @memberof PaymentFromBuilder
*/
_makeSetter(field) {
return (value) => Object.defineProperty(this, field, { value });
}
/**
* Задаёт сумму платежа
*
* @memberof PaymentFromBuilder
* @param {string | number} amount Сумма
* @return {this}
*/
setAmount(amount) {
this.config.sum = Number.parseFloat(amount.toString());
return this;
}
/**
* Задаёт получателя платежа
*
* @memberof PaymentFromBuilder
* @param {string | number} receiver Получатель
* @return {this}
*/
setReceiver(receiver) {
this.config.receiver = receiver.toString();
return this;
}
/**
* Задаёт URL перенаправления после успешного платежа
*
* @memberof PaymentFromBuilder
* @param {string | URL} url URL
* @return {this}
*/
setSuccessURL(url) {
this.config.successURL = url.toString();
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireFio(doRequire = true) {
this.config.needFio = doRequire;
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireAddress(doRequire = true) {
this.config.needAddress = doRequire;
return this;
}
/**
*
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requireEmail(doRequire = true) {
this.config.needEmail = doRequire;
return this;
}
/**
* @memberof PaymentFromBuilder
* @param {boolean} [doRequire=true]
* @return {this}
*/
requirePhone(doRequire = true) {
this.config.needPhone = doRequire;
return this;
}
/**
* Генерирует HTML на основе заданных параметров
* @memberof PaymentFromBuilder
* @param {boolean} [fullPage=false]
* @return {string}
*/
buildHtml(fullPage = false) {
return new redirectFormBuilder.FormBuilder(
"https://yoomoney.ru/quickpay/confirm.xml",
"POST",
convert(this.config)
).buildHtml(fullPage);
}
}
exports.PaymentFormBuilder = PaymentFormBuilder;
exports.PaymentType = PaymentType;
export { API as YMApi, API as API, YMApiError, YMApiVoidResponseError } from "./api";
export * as ymTypes from "./api.types";
export * from "./api.types";
export { Auth as YMAuth, Auth, YMAuthError, AuthScope } from "./auth";
export { NotificationChecker as YMNotificationChecker, NotificationChecker, NotificationDTO as YMNotificationDTO, NotificationDTO, YMNotificationError } from "./notifications";
export { FormConfig as YMFormConfig, FormConfig, PaymentType as YMFormPaymentType, PaymentType as FormPaymentType, PaymentType, PaymentFormBuilder as YMPaymentFromBuilder, PaymentFormBuilder as YMPaymentFormBuilder, PaymentFormBuilder as PaymentFormBuilder } from "./payment-form-builder";

@@ -1,202 +0,13 @@

[yoomoney-sdk](README.md) / Exports
[QIWI SDK](README.md) / Modules
# yoomoney-sdk
# QIWI SDK
## Table of contents
### References
### Modules
- [API](modules.md#api)
- [Auth](modules.md#auth)
- [FormConfig](modules.md#formconfig)
- [FormPaymentType](modules.md#formpaymenttype)
- [NotificationChecker](modules.md#notificationchecker)
- [NotificationDTO](modules.md#notificationdto)
- [PaymentFormBuilder](modules.md#paymentformbuilder)
- [PaymentType](modules.md#paymenttype)
- [YMPaymentFormBuilder](modules.md#ympaymentformbuilder)
### Namespaces
- [ymTypes](modules/ymTypes.md)
### Classes
- [YMApi](classes/YMApi.md)
- [YMApiError](classes/YMApiError.md)
- [YMApiVoidResponseError](classes/YMApiVoidResponseError.md)
- [YMAuth](classes/YMAuth.md)
- [YMAuthError](classes/YMAuthError.md)
- [YMNotificationChecker](classes/YMNotificationChecker.md)
- [YMNotificationError](classes/YMNotificationError.md)
- [YMPaymentFromBuilder](classes/YMPaymentFromBuilder.md)
### Type aliases
- [AuthScope](modules.md#authscope)
- [YMFormConfig](modules.md#ymformconfig)
- [YMNotificationDTO](modules.md#ymnotificationdto)
### Variables
- [AuthScope](modules.md#authscope-1)
- [YMFormPaymentType](modules.md#ymformpaymenttype)
## References
### API
Renames and re-exports [YMApi](classes/YMApi.md)
___
### Auth
Renames and re-exports [YMAuth](classes/YMAuth.md)
___
### FormConfig
Renames and re-exports [YMFormConfig](modules.md#ymformconfig)
___
### FormPaymentType
Renames and re-exports [YMFormPaymentType](modules.md#ymformpaymenttype)
___
### NotificationChecker
Renames and re-exports [YMNotificationChecker](classes/YMNotificationChecker.md)
___
### NotificationDTO
Renames and re-exports [YMNotificationDTO](modules.md#ymnotificationdto)
___
### PaymentFormBuilder
Renames and re-exports [YMPaymentFromBuilder](classes/YMPaymentFromBuilder.md)
___
### PaymentType
Renames and re-exports [YMFormPaymentType](modules.md#ymformpaymenttype)
___
### YMPaymentFormBuilder
Renames and re-exports [YMPaymentFromBuilder](classes/YMPaymentFromBuilder.md)
## Type aliases
### AuthScope
Ƭ **AuthScope**: ``"account-info"`` \| ``"operation-history"`` \| ``"operation-details"`` \| ``"incoming-transfers"`` \| ``"payment"`` \| ``"payment-shop"`` \| ``"payment-p2p"`` \| ``"money-source"``
#### Defined in
[src/auth.ts:4](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/5426e16/src/auth.ts#L4)
___
### YMFormConfig
Ƭ **YMFormConfig**: `Object`
#### Type declaration
| Name | Type | Description |
| :------ | :------ | :------ |
| `comment?` | `string` | Поле, в котором можно передать комментарий отправителя перевода. (До 200 символов) |
| `formComment?` | `string` | Название перевода в истории отправителя (для переводов из кошелька или с привязанной карты). Отображается в кошельке отправителя. Удобнее всего формировать его из названий магазина и товара. Например: `Мой магазин: валенки белые` |
| `label?` | `string` | Метка, которую сайт или приложение присваивает конкретному переводу. Например, в качестве метки можно указывать код или идентификатор заказа. (До 64 символов) |
| `needAddress?` | `boolean` | Нужен адрес отправителя. |
| `needEmail?` | `boolean` | Нужна электронная почты отправителя. |
| `needFio?` | `boolean` | Нужны ФИО отправителя. |
| `needPhone?` | `boolean` | Нужен телефон отправителя. |
| `paymentType` | ``"PC"`` \| ``"AC"`` \| ``"MC"`` | Способ оплаты. Возможные значения: `PC` — оплата из кошелька ЮMoney; `AC` — с банковской карты; `MC` — с баланса мобильного. |
| `quickPayForm` | ``"shop"`` \| ``"small"`` \| ``"donate"`` | Возможные значения: `shop` — для универсальной формы; `small` — для кнопки; `donate` — для «благотворительной» формы. |
| `receiver` | `string` | Номер кошелька ЮMoney, на который нужно зачислять деньги отправителей. |
| `shortDest?` | `string` | Название перевода на странице подтверждения. Рекомендуем делать его таким же, как `formComment`. |
| `successURL?` | `string` | URL-адрес для редиректа после совершения перевода. |
| `sum` | `number` | Сумма перевода (спишется с отправителя). |
| `targets` | `string` | Назначение платежа. (До 150 символов) |
#### Defined in
[src/payment-form-builder.ts:11](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/5426e16/src/payment-form-builder.ts#L11)
___
### YMNotificationDTO
Ƭ **YMNotificationDTO**: `Object`
#### Type declaration
| Name | Type | Description |
| :------ | :------ | :------ |
| `amount` | `number` | Сумма, которая зачислена на счет получателя. |
| `building?` | `string` | Дом. |
| `city?` | `string` | Город. |
| `codepro` | `boolean` | Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда `false`. |
| `currency` | ``"643"`` | Код валюты — всегда `643` (рубль РФ согласно ISO 4217). |
| `datetime` | `string` | Дата и время совершения перевода. |
| `email?` | `string` | Адрес электронной почты отправителя перевода. Если почта не запрашивалась, параметр содержит пустую строку. |
| `fathersname?` | `string` | Отчество. |
| `firstname?` | `string` | Имя. |
| `flat?` | `string` | Квартира. |
| `label` | `string` | Метка платежа. Если ее нет, параметр содержит пустую строку. |
| `lastname?` | `string` | Фамилия. |
| `notification_type` | ``"p2p-incoming"`` \| ``"card-incoming"`` | Для переводов из кошелька — `p2p-incoming`. Для переводов с произвольной карты — `card-incoming`. |
| `operation_id` | `string` | Идентификатор операции в истории счета получателя. |
| `phone?` | `string` | Телефон отправителя перевода. Если телефон не запрашивался, параметр содержит пустую строку. |
| `sender` | `string` | Для переводов из кошелька — номер кошелька отправителя. Для переводов с произвольной карты — параметр содержит пустую строку. |
| `sha1_hash` | `string` | SHA-1 hash параметров уведомления. |
| `street?` | `string` | Улица. |
| `suite?` | `string` | Корпус. |
| `test_notification` | `boolean` | - |
| `unaccepted` | `boolean` | Перевод еще не зачислен. Получателю нужно освободить место в кошельке или использовать код протекции (если `codepro=true`). |
| `withdraw_amount` | `number` | Сумма, которая списана со счета отправителя. |
| `zip?` | `string` | Индекс. |
#### Defined in
[src/notifications.ts:5](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/5426e16/src/notifications.ts#L5)
## Variables
### AuthScope
• **AuthScope**: `Record`<`string`, [`AuthScope`](modules.md#authscope-1)\>
#### Defined in
[src/auth.ts:14](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/5426e16/src/auth.ts#L14)
___
### YMFormPaymentType
• `Const` **YMFormPaymentType**: `Object`
#### Type declaration
| Name | Type |
| :------ | :------ |
| `FromCard` | ``"AC"`` |
| `FromMobileBalance` | ``"MC"`` |
| `FromWallet` | ``"PC"`` |
#### Defined in
[src/payment-form-builder.ts:5](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/5426e16/src/payment-form-builder.ts#L5)
- [api](modules/api.md)
- [auth](modules/auth.md)
- [forms](modules/forms.md)
- [index](modules/index.md)
- [notifications](modules/notifications.md)

@@ -1,10 +0,5 @@

yoomoney-sdk / [Exports](modules.md)
QIWI SDK / [Modules](modules.md)
# YooMoney NodeJS SDK
[![license MIT](https://img.shields.io/npm/l/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/main/LICENSE)
[![npm](https://img.shields.io/npm/v/yoomoney-sdk?style=flat-square)](https://npmjs.com/package/yoomoney-sdk)
[![GitHub](https://img.shields.io/github/stars/AlexXanderGrib/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![last commit](https://img.shields.io/github/last-commit/AlexXanderGrib/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk)
<center>

@@ -14,31 +9,39 @@ <img src="docs/assets/logo.svg" alt="YooMoney SDK" />

[![Downloads](https://img.shields.io/npm/dt/yoomoney-sdk.svg)](https://npmjs.com/package/yoomoney-sdk)
[![last commit](https://img.shields.io/github/last-commit/AlexXanderGrib/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![GitHub](https://img.shields.io/github/stars/AlexXanderGrib/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![yoomoney-sdk](https://snyk.io/advisor/npm-package/yoomoney-sdk/badge.svg)](https://snyk.io/advisor/npm-package/yoomoney-sdk)
[![Known Vulnerabilities](https://snyk.io/test/npm/yoomoney-sdk/badge.svg)](https://snyk.io/test/npm/yoomoney-sdk)
[![Quality](https://img.shields.io/npms-io/quality-score/yoomoney-sdk.svg?label=quality%20%28npms.io%29&)](https://npms.io/search?q=yoomoney-sdk)
[![npm](https://img.shields.io/npm/v/yoomoney-sdk.svg)](https://npmjs.com/package/yoomoney-sdk)
[![license MIT](https://img.shields.io/npm/l/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/main/LICENSE.txt)
[![Size](https://img.shields.io/bundlephobia/minzip/yoomoney-sdk)](https://bundlephobia.com/package/yoomoney-sdk)
## 🍬 Почему именно эта библиотека?
1. Есть поддержка TypeScript
2. Покрывает большую часть https://yoomoney.ru/docs/wallet
3. Документация прямо в коде (JSDoc)
4. Всего 2 зависимости: `axios` и `redirect-form-builder` (для генерации html форм)
5. Есть API генерации frontend форм перенаправления для [Авторизации](https://yoomoney.ru/docs/wallet/using-api/authorization/basics) и [Оплаты](https://yoomoney.ru/docs/payment-buttons/using-api/forms)
6. [Безопасная](./SECURITY.md) (Относительно)
1. **Полная.** Покрывает следующие API:
- [Авторизации приложения](https://yoomoney.ru/docs/wallet/using-api/authorization/basics)
- [API пользователя](https://yoomoney.ru/docs/wallet)
- [Создание форм оплаты](https://yoomoney.ru/docs/payment-buttons/using-api/forms)
- [Проверка уведомлений об оплате](https://yoomoney.ru/docs/payment-buttons/using-api/notifications)
2. **Простая.** на каждое API всего 1 класс
- **Много [примеров](./examples/README.md)**.
3. **Надёжная.** Библиотека написана на **TypeScript** и покрыта тестами.
4. [**Безопасная.**](./SECURITY.md) У библиотеки всего 2 зависимости, и она постоянно сканируется Code QL и [Snyk](https://snyk.io/advisor/npm-package/yoomoney-sdk) на наличие уязвимостей.
## 📦 Установка
**Используя `NPM`**
- **Используя `npm`**
```shell
npm i qiwi-sdk
```
- **Используя `Yarn`**
```shell
yarn add qiwi-sdk
```
- **Используя `pnpm`**
```shell
pnpm add qiwi-sdk
```
```shell
npm i yoomoney-sdk
```
**Используя `Yarn`**
```shell
yarn add yoomoney-sdk
```
**Используя `pnpm`**
```shell
pnpm add yoomoney-sdk
```
## 🛠️ Использование

@@ -66,2 +69,8 @@

# Устанавливаем зависимости
npm install
# Собираем библиотеку
npm run build
# Запускаем скрипт

@@ -91,3 +100,3 @@ node examples/4-get-token.js

## ❤️ Контрибьютинг
## ❤️ Содействие (Contributing)

@@ -94,0 +103,0 @@ _Что делаем?_:

{
"name": "yoomoney-sdk",
"version": "1.5.1",
"description": "YooMoney typed SDK",
"main": "./dist/cjs/index.js",
"types": "./dist/cjs/index.d.ts",
"typings": "./dist/cjs/index.d.ts",
"module": "./dist/esm/index.js",
"version": "1.5.2",
"description": "⭐ Typed YooMoney Wallet SDK for NodeJS. Supported API's: Auth, Wallet & Notifications",
"main": "./index.js",
"types": "./index.d.ts",
"typings": "./index.d.ts",
"module": "./index.mjs",
"type": "commonjs",
"sideEffects": false,
"exports": {
"./package.json": "./package.json",
".": {
"require": "./index.js",
"import": "./index.mjs",
"types": "./index.d.ts"
},
"./api": {
"require": "./api.js",
"import": "./api.mjs",
"types": "./api.d.ts"
},
"./auth": {
"require": "./auth.js",
"import": "./auth.mjs",
"types": "./auth.d.ts"
},
"./notifications": {
"require": "./notifications.js",
"import": "./notifications.mjs",
"types": "./notifications.d.ts"
},
"./forms": {
"require": "./forms.js",
"import": "./forms.mjs",
"types": "./forms.d.ts"
}
},
"publishConfig": {
"access": "public"
},
"typesVersions": {
"*": {
"api": [
"./api.d.ts"
],
"auth": [
"./auth.d.ts"
],
"notifications": [
"./notifications.d.ts"
],
"forms": [
"./forms.d.ts"
]
}
},
"engines": {

@@ -21,3 +69,3 @@ "node": ">=10"

"build:dist": "rimraf dist && rollup -c",
"build:docs": "typedoc --out docs/api src/index.ts",
"build:docs": "typedoc",
"build": "npm run build:dist && npm run build:docs",

@@ -34,5 +82,20 @@ "prepack": "npm run build",

"docs",
"src",
"examples",
"README.md",
"CONTRIBUTING.md"
"CONTRIBUTING.md",
"LICENSE.txt",
"SECURITY.md",
"index.js",
"index.mjs",
"index.d.ts",
"api.js",
"api.mjs",
"api.d.ts",
"auth.js",
"auth.mjs",
"auth.d.ts",
"notifications.js",
"notifications.mjs",
"notifications.d.ts"
],

@@ -45,6 +108,16 @@ "repository": {

"yoomoney",
"yoo",
"yandex",
"money",
"wallet",
"auth",
"payments",
"rest",
"api",
"sdk"
"sdk",
"typed",
"typescript",
"node",
"nodejs",
"backend"
],

@@ -59,13 +132,14 @@ "author": "AlexXanderGrib <me@alexxgrib.me> (https://alexxgrib.me)",

"devDependencies": {
"@rollup/plugin-replace": "^4.0.0",
"@types/express": "^4.17.13",
"@types/inquirer": "^8.2.1",
"@types/jest": "^27.4.1",
"@types/node": "^17.0.24",
"@types/jest": "^27.5.1",
"@types/node": "^17.0.35",
"@types/node-fetch": "^2.6.1",
"@typescript-eslint/eslint-plugin": "^5.19.0",
"@typescript-eslint/parser": "^5.19.0",
"eslint": "^8.13.0",
"@typescript-eslint/eslint-plugin": "^5.25.0",
"@typescript-eslint/parser": "^5.25.0",
"eslint": "^8.16.0",
"eslint-config-google": "^0.14.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^16.0.3",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0",

@@ -75,21 +149,25 @@ "eslint-plugin-node": "^11.1.0",

"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-security": "^1.4.0",
"eslint-plugin-security": "^1.5.0",
"eslint-plugin-unicorn": "^42.0.0",
"express": "^4.17.3",
"husky": "^7.0.4",
"inquirer": "^8.2.2",
"jest": "^27.5.1",
"express": "^4.18.1",
"glob": "^8.0.3",
"husky": "^8.0.1",
"inquirer": "^8.2.4",
"jest": "^28.1.0",
"ngrok": "^4.3.1",
"prettier": "^2.6.2",
"rimraf": "^3.0.2",
"rollup": "^2.70.2",
"rollup": "^2.74.1",
"rollup-plugin-cleanup": "^3.2.1",
"rollup-plugin-prettier": "^2.2.2",
"rollup-plugin-typescript2": "^0.31.2",
"ts-jest": "^27.1.4",
"ts-node": "^10.7.0",
"ts-jest": "^28.0.2",
"ts-node": "^10.8.0",
"typedoc": "^0.22.15",
"typedoc-plugin-markdown": "^3.12.0",
"typescript": "^4.6.3"
"typedoc-plugin-markdown": "^3.12.1",
"typedoc-plugin-missing-exports": "^0.22.6",
"typescript": "^4.6.4"
},
"dependencies": {
"axios": "^0.26.1",
"axios": "^0.27.2",
"redirect-form-builder": "^1.0.0"

@@ -96,0 +174,0 @@ },

# YooMoney NodeJS SDK
[![license MIT](https://img.shields.io/npm/l/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/main/LICENSE)
[![npm](https://img.shields.io/npm/v/yoomoney-sdk?style=flat-square)](https://npmjs.com/package/yoomoney-sdk)
[![GitHub](https://img.shields.io/github/stars/AlexXanderGrib/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![last commit](https://img.shields.io/github/last-commit/AlexXanderGrib/yoomoney-sdk?style=flat-square)](https://github.com/AlexXanderGrib/yoomoney-sdk)
<center>

@@ -12,31 +7,39 @@ <img src="docs/assets/logo.svg" alt="YooMoney SDK" />

[![Downloads](https://img.shields.io/npm/dt/yoomoney-sdk.svg)](https://npmjs.com/package/yoomoney-sdk)
[![last commit](https://img.shields.io/github/last-commit/AlexXanderGrib/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![GitHub](https://img.shields.io/github/stars/AlexXanderGrib/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk)
[![yoomoney-sdk](https://snyk.io/advisor/npm-package/yoomoney-sdk/badge.svg)](https://snyk.io/advisor/npm-package/yoomoney-sdk)
[![Known Vulnerabilities](https://snyk.io/test/npm/yoomoney-sdk/badge.svg)](https://snyk.io/test/npm/yoomoney-sdk)
[![Quality](https://img.shields.io/npms-io/quality-score/yoomoney-sdk.svg?label=quality%20%28npms.io%29&)](https://npms.io/search?q=yoomoney-sdk)
[![npm](https://img.shields.io/npm/v/yoomoney-sdk.svg)](https://npmjs.com/package/yoomoney-sdk)
[![license MIT](https://img.shields.io/npm/l/yoomoney-sdk.svg)](https://github.com/AlexXanderGrib/yoomoney-sdk/blob/main/LICENSE.txt)
[![Size](https://img.shields.io/bundlephobia/minzip/yoomoney-sdk)](https://bundlephobia.com/package/yoomoney-sdk)
## 🍬 Почему именно эта библиотека?
1. Есть поддержка TypeScript
2. Покрывает большую часть https://yoomoney.ru/docs/wallet
3. Документация прямо в коде (JSDoc)
4. Всего 2 зависимости: `axios` и `redirect-form-builder` (для генерации html форм)
5. Есть API генерации frontend форм перенаправления для [Авторизации](https://yoomoney.ru/docs/wallet/using-api/authorization/basics) и [Оплаты](https://yoomoney.ru/docs/payment-buttons/using-api/forms)
6. [Безопасная](./SECURITY.md) (Относительно)
1. **Полная.** Покрывает следующие API:
- [Авторизации приложения](https://yoomoney.ru/docs/wallet/using-api/authorization/basics)
- [API пользователя](https://yoomoney.ru/docs/wallet)
- [Создание форм оплаты](https://yoomoney.ru/docs/payment-buttons/using-api/forms)
- [Проверка уведомлений об оплате](https://yoomoney.ru/docs/payment-buttons/using-api/notifications)
2. **Простая.** на каждое API всего 1 класс
- **Много [примеров](./examples/README.md)**.
3. **Надёжная.** Библиотека написана на **TypeScript** и покрыта тестами.
4. [**Безопасная.**](./SECURITY.md) У библиотеки всего 2 зависимости, и она постоянно сканируется Code QL и [Snyk](https://snyk.io/advisor/npm-package/yoomoney-sdk) на наличие уязвимостей.
## 📦 Установка
**Используя `NPM`**
- **Используя `npm`**
```shell
npm i qiwi-sdk
```
- **Используя `Yarn`**
```shell
yarn add qiwi-sdk
```
- **Используя `pnpm`**
```shell
pnpm add qiwi-sdk
```
```shell
npm i yoomoney-sdk
```
**Используя `Yarn`**
```shell
yarn add yoomoney-sdk
```
**Используя `pnpm`**
```shell
pnpm add yoomoney-sdk
```
## 🛠️ Использование

@@ -64,2 +67,8 @@

# Устанавливаем зависимости
npm install
# Собираем библиотеку
npm run build
# Запускаем скрипт

@@ -89,3 +98,3 @@ node examples/4-get-token.js

## ❤️ Контрибьютинг
## ❤️ Содействие (Contributing)

@@ -92,0 +101,0 @@ _Что делаем?_:

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc