yoomoney-sdk
Advanced tools
Comparing version 1.5.1 to 1.5.2
@@ -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¤cy&datetime&sender&codepro¬ification_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¤cy&datetime&sender&codepro¬ification_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 @@ _Что делаем?_: |
130
package.json
{ | ||
"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 @@ _Что делаем?_: |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
455800
85
7683
114
36
+ Addedasynckit@0.4.0(transitive)
+ Addedaxios@0.27.2(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedform-data@4.0.1(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
- Removedaxios@0.26.1(transitive)
Updatedaxios@^0.27.2