├── .github └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── apps └── www │ ├── .gitignore │ ├── .prettierrc │ ├── .source │ ├── index.ts │ └── source.config.mjs │ ├── Dockerfile │ ├── README.md │ ├── next.config.ts │ ├── package.json │ ├── pnpm-lock.yaml │ ├── postcss.config.mjs │ ├── source.config.ts │ ├── src │ ├── app │ │ ├── (app) │ │ │ ├── docs │ │ │ │ └── [[...slug]] │ │ │ │ │ └── page.tsx │ │ │ ├── layout.config.tsx │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ └── layout.tsx │ ├── components │ │ └── shared │ │ │ └── mdx-components.tsx │ ├── content │ │ └── docs │ │ │ ├── getting-started │ │ │ ├── installation.mdx │ │ │ └── introduction.mdx │ │ │ ├── meta.json │ │ │ ├── payments │ │ │ ├── cancel.mdx │ │ │ ├── confirm.mdx │ │ │ ├── create.mdx │ │ │ ├── info.mdx │ │ │ └── list.mdx │ │ │ └── refunds │ │ │ ├── create.mdx │ │ │ ├── info.mdx │ │ │ └── list.mdx │ ├── lib │ │ ├── source.ts │ │ └── utils.ts │ ├── providers │ │ └── theme-provider.tsx │ └── styles │ │ └── globals.css │ └── tsconfig.json ├── package.json ├── packages └── nestjs-yookassa │ ├── .eslintrc.js │ ├── .gitignore │ ├── .npmignore │ ├── .prettierrc │ ├── README.md │ ├── dist │ ├── index.d.ts │ ├── index.js │ ├── interfaces │ │ ├── common.interface.d.ts │ │ ├── common.interface.js │ │ ├── confirmation.interface.d.ts │ │ ├── confirmation.interface.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── payment-details.interface.d.ts │ │ ├── payment-details.interface.js │ │ ├── payment-method.interface.d.ts │ │ ├── payment-method.interface.js │ │ ├── payment-request.interface.d.ts │ │ ├── payment-request.interface.js │ │ ├── receipt-details.interface.d.ts │ │ ├── receipt-details.interface.js │ │ ├── receipt-request.interface.d.ts │ │ ├── receipt-request.interface.js │ │ ├── refund-details.interface.d.ts │ │ ├── refund-details.interface.js │ │ ├── refund-request.interface.d.ts │ │ ├── refund-request.interface.js │ │ ├── yookassa-options.interface.d.ts │ │ └── yookassa-options.interface.js │ ├── services │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── payment.service.d.ts │ │ ├── payment.service.js │ │ ├── refund.service.d.ts │ │ └── refund.service.js │ ├── yookassa.constants.d.ts │ ├── yookassa.constants.js │ ├── yookassa.module.d.ts │ ├── yookassa.module.js │ ├── yookassa.service.d.ts │ └── yookassa.service.js │ ├── package.json │ ├── src │ ├── index.ts │ ├── interfaces │ │ ├── common.interface.ts │ │ ├── confirmation.interface.ts │ │ ├── index.ts │ │ ├── payment-details.interface.ts │ │ ├── payment-method.interface.ts │ │ ├── payment-request.interface.ts │ │ ├── receipt-details.interface.ts │ │ ├── receipt-request.interface.ts │ │ ├── refund-details.interface.ts │ │ ├── refund-request.interface.ts │ │ └── yookassa-options.interface.ts │ ├── services │ │ ├── index.ts │ │ ├── payment.service.ts │ │ └── refund.service.ts │ ├── yookassa.constants.ts │ ├── yookassa.module.ts │ └── yookassa.service.ts │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── tsconfig.json └── turbo.json /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Library 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | concurrency: ${{ github.workflow }}-${{ github.ref }} 9 | 10 | jobs: 11 | publish: 12 | name: Build & Publish nestjs-yookassa 13 | runs-on: ubuntu-latest 14 | 15 | defaults: 16 | run: 17 | shell: bash 18 | 19 | steps: 20 | - name: 📥 Checkout repository 21 | uses: actions/checkout@v3 22 | 23 | - name: 📦 Set up PNPM 24 | uses: pnpm/action-setup@v2 25 | with: 26 | version: 9 27 | 28 | - name: 🧰 Set up Node.js 29 | uses: actions/setup-node@v3 30 | with: 31 | node-version: 18 32 | registry-url: 'https://registry.npmjs.org/' 33 | cache: 'pnpm' 34 | 35 | - name: 📥 Install dependencies 36 | run: pnpm install --frozen-lockfile 37 | 38 | - name: 🛠️ Build packages 39 | run: pnpm build:packages 40 | 41 | - name: 🕵️‍♂️ Check if version exists on npm 42 | id: check_version 43 | run: | 44 | VERSION=$(jq -r '.version' packages/nestjs-yookassa/package.json) 45 | echo "Current package version: $VERSION" 46 | 47 | if npm view nestjs-yookassa@$VERSION version > /dev/null 2>&1; then 48 | echo "Version $VERSION already exists on npm. Skipping publish." 49 | echo "should_publish=false" >> $GITHUB_OUTPUT 50 | else 51 | echo "Version $VERSION does not exist. Will publish." 52 | echo "should_publish=true" >> $GITHUB_OUTPUT 53 | fi 54 | 55 | - name: 🚀 Publish to NPM 56 | if: steps.check_version.outputs.should_publish == 'true' 57 | working-directory: packages/nestjs-yookassa 58 | run: pnpm publish --access public 59 | env: 60 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 61 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | .pnp 4 | .pnp.js 5 | 6 | # testing 7 | coverage 8 | 9 | # next.js 10 | .next/ 11 | out/ 12 | build 13 | 14 | # misc 15 | .DS_Store 16 | *.pem 17 | 18 | # debug 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | .pnpm-debug.log* 23 | 24 | # local env files 25 | .env.local 26 | .env.development.local 27 | .env.test.local 28 | .env.production.local 29 | 30 | # turbo 31 | .turbo 32 | 33 | .contentlayer 34 | tsconfig.tsbuildinfo 35 | 36 | # ide 37 | .idea 38 | .fleet 39 | .vscode -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=true -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 TeaCoder 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NestJS YooKassa Monorepo 2 | 3 | Этот репозиторий представляет собой монорепозиторий, в котором объединены как библиотека для интеграции с YooKassa API для NestJS, так и различные приложения, связанные с этим проектом. 4 | 5 | ## Документация 6 | 7 | Основная документация по использованию библиотеки находится в (https://nestjs-yookassa.ru). 8 | 9 | ## Поддержка 10 | 11 | Если у вас возникли вопросы или проблемы, не стесняйтесь обращаться к автору или создавать issues в репозитории. 12 | 13 | - Автор: [TeaCoder](https://teacoder.ru) 14 | - Контрибьюторы: 15 | - Vadim Nechaev (help@teacoder.ru) 16 | 17 | ## Лицензия 18 | 19 | Этот проект лицензирован под [MIT License](LICENSE). 20 | -------------------------------------------------------------------------------- /apps/www/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | .turbo 9 | 10 | # testing 11 | /coverage 12 | 13 | # next.js 14 | /.next/ 15 | /out/ 16 | 17 | # production 18 | /build 19 | 20 | # misc 21 | .DS_Store 22 | *.pem 23 | 24 | # debug 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # local env files 30 | .env*.local 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /apps/www/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "none", 3 | "tabWidth": 4, 4 | "useTabs": true, 5 | "semi": false, 6 | "jsxSingleQuote": true, 7 | "singleQuote": true, 8 | "arrowParens": "avoid", 9 | "importOrder": [ 10 | "", 11 | "^@/api/(.*)$", 12 | "^@/app/(.*)$", 13 | "^@/assets/(.*)$", 14 | "^@/components/(.*)$", 15 | "^@/config/(.*)$", 16 | "^@/constants/(.*)$", 17 | "^@/hooks/(.*)$", 18 | "^@/services/(.*)$", 19 | "^@/types/(.*)$", 20 | "^@/utils/(.*)$", 21 | "^../(.*)$", 22 | "^./(.*)$" 23 | ], 24 | "importOrderSeparation": true, 25 | "importOrderSortSpecifiers": true, 26 | "plugins": [ 27 | "@trivago/prettier-plugin-sort-imports", 28 | "prettier-plugin-tailwindcss" 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /apps/www/.source/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck -- skip type checking 2 | import * as meta_0 from "../src/content/docs/meta.json?collection=meta&hash=1747981341957" 3 | import * as docs_9 from "../src/content/docs/refunds/list.mdx?collection=docs&hash=1747981341957" 4 | import * as docs_8 from "../src/content/docs/refunds/info.mdx?collection=docs&hash=1747981341957" 5 | import * as docs_7 from "../src/content/docs/refunds/create.mdx?collection=docs&hash=1747981341957" 6 | import * as docs_6 from "../src/content/docs/payments/list.mdx?collection=docs&hash=1747981341957" 7 | import * as docs_5 from "../src/content/docs/payments/info.mdx?collection=docs&hash=1747981341957" 8 | import * as docs_4 from "../src/content/docs/payments/create.mdx?collection=docs&hash=1747981341957" 9 | import * as docs_3 from "../src/content/docs/payments/confirm.mdx?collection=docs&hash=1747981341957" 10 | import * as docs_2 from "../src/content/docs/payments/cancel.mdx?collection=docs&hash=1747981341957" 11 | import * as docs_1 from "../src/content/docs/getting-started/introduction.mdx?collection=docs&hash=1747981341957" 12 | import * as docs_0 from "../src/content/docs/getting-started/installation.mdx?collection=docs&hash=1747981341957" 13 | import { _runtime } from "fumadocs-mdx" 14 | import * as _source from "../source.config" 15 | export const docs = _runtime.doc([{ info: {"path":"getting-started\\installation.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/getting-started/installation.mdx"}, data: docs_0 }, { info: {"path":"getting-started\\introduction.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/getting-started/introduction.mdx"}, data: docs_1 }, { info: {"path":"payments\\cancel.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/payments/cancel.mdx"}, data: docs_2 }, { info: {"path":"payments\\confirm.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/payments/confirm.mdx"}, data: docs_3 }, { info: {"path":"payments\\create.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/payments/create.mdx"}, data: docs_4 }, { info: {"path":"payments\\info.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/payments/info.mdx"}, data: docs_5 }, { info: {"path":"payments\\list.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/payments/list.mdx"}, data: docs_6 }, { info: {"path":"refunds\\create.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/refunds/create.mdx"}, data: docs_7 }, { info: {"path":"refunds\\info.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/refunds/info.mdx"}, data: docs_8 }, { info: {"path":"refunds\\list.mdx","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/refunds/list.mdx"}, data: docs_9 }]); 16 | export const meta = _runtime.meta([{ info: {"path":"meta.json","absolutePath":"C:/javascript-app/libs/nestjs-yookassa/apps/www/src/content/docs/meta.json"}, data: meta_0 }]); -------------------------------------------------------------------------------- /apps/www/.source/source.config.mjs: -------------------------------------------------------------------------------- 1 | // source.config.ts 2 | import { transformerRemoveNotationEscape } from "@shikijs/transformers"; 3 | import { rehypeCodeDefaultOptions } from "fumadocs-core/mdx-plugins"; 4 | import { remarkInstall } from "fumadocs-docgen"; 5 | import { defineConfig, defineDocs } from "fumadocs-mdx/config"; 6 | import { transformerTwoslash } from "fumadocs-twoslash"; 7 | import { createFileSystemTypesCache } from "fumadocs-twoslash/cache-fs"; 8 | import rehypeKatex from "rehype-katex"; 9 | var { docs, meta } = defineDocs({ 10 | dir: "src/content/docs" 11 | }); 12 | var source_config_default = defineConfig({ 13 | mdxOptions: { 14 | rehypeCodeOptions: { 15 | lazy: true, 16 | experimentalJSEngine: true, 17 | langs: ["ts", "js", "html", "tsx", "mdx"], 18 | inline: "tailing-curly-colon", 19 | themes: { 20 | light: "catppuccin-latte", 21 | dark: "catppuccin-mocha" 22 | }, 23 | transformers: [ 24 | ...rehypeCodeDefaultOptions.transformers ?? [], 25 | transformerTwoslash({ 26 | typesCache: createFileSystemTypesCache() 27 | }), 28 | transformerRemoveNotationEscape() 29 | ] 30 | }, 31 | remarkCodeTabOptions: { 32 | parseMdx: true 33 | }, 34 | remarkPlugins: [ 35 | [ 36 | remarkInstall, 37 | { 38 | persist: { 39 | id: "package-manager" 40 | } 41 | } 42 | ] 43 | ], 44 | rehypePlugins: (v) => [rehypeKatex, ...v] 45 | } 46 | }); 47 | export { 48 | source_config_default as default, 49 | docs, 50 | meta 51 | }; 52 | -------------------------------------------------------------------------------- /apps/www/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine AS build 2 | 3 | WORKDIR /app 4 | 5 | RUN npm install -g pnpm 6 | 7 | COPY pnpm-lock.yaml ./ 8 | COPY package.json ./ 9 | 10 | RUN pnpm install --frozen-lockfile 11 | 12 | COPY . . 13 | 14 | RUN pnpm run build 15 | 16 | EXPOSE 5000 17 | 18 | CMD ["pnpm", "run", "start"] 19 | -------------------------------------------------------------------------------- /apps/www/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /apps/www/next.config.ts: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import { createMDX } from 'fumadocs-mdx/next' 4 | import type { NextConfig } from 'next' 5 | 6 | const withMDX = createMDX() 7 | 8 | const config: NextConfig = { 9 | reactStrictMode: true, 10 | output: 'standalone', 11 | trailingSlash: false, 12 | skipTrailingSlashRedirect: true, 13 | experimental: { 14 | optimizePackageImports: ['tailwindcss'] 15 | } 16 | } 17 | 18 | export default withMDX(config) 19 | -------------------------------------------------------------------------------- /apps/www/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "www", 3 | "version": "0.1.1", 4 | "private": true, 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev", 8 | "start": "next start", 9 | "format": "prettier --write \"**/*.{js,ts,tsx,json,md}\"" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-accordion": "^1.2.1", 13 | "@radix-ui/react-aspect-ratio": "^1.1.0", 14 | "@radix-ui/react-collapsible": "^1.1.1", 15 | "@radix-ui/react-dialog": "^1.1.2", 16 | "@radix-ui/react-dropdown-menu": "^2.1.2", 17 | "@radix-ui/react-label": "^2.1.0", 18 | "@radix-ui/react-separator": "^1.1.0", 19 | "@radix-ui/react-slot": "^1.1.0", 20 | "@radix-ui/react-tabs": "^1.1.1", 21 | "@radix-ui/react-tooltip": "^1.1.4", 22 | "@shikijs/transformers": "^3.4.2", 23 | "@types/mdx": "^2.0.13", 24 | "class-variance-authority": "^0.7.0", 25 | "clsx": "^2.1.1", 26 | "fumadocs-core": "^15.3.4", 27 | "fumadocs-docgen": "^2.0.0", 28 | "fumadocs-mdx": "^11.6.5", 29 | "fumadocs-twoslash": "^3.1.3", 30 | "fumadocs-ui": "^15.3.4", 31 | "geist": "^1.3.1", 32 | "lucide-react": "^0.460.0", 33 | "mdx": "^0.3.1", 34 | "next": "15.0.3", 35 | "next-themes": "^0.4.3", 36 | "react": "19.0.0-rc-66855b96-20241106", 37 | "react-dom": "19.0.0-rc-66855b96-20241106", 38 | "react-icons": "^5.3.0", 39 | "rehype-katex": "^7.0.1", 40 | "rehype-shiki": "^0.0.9", 41 | "remark-math": "^6.0.0", 42 | "shiki": "^3.4.2", 43 | "tailwind-merge": "^2.5.4", 44 | "tw-animate-css": "^1.3.0" 45 | }, 46 | "devDependencies": { 47 | "@tailwindcss/postcss": "^4.1.7", 48 | "@trivago/prettier-plugin-sort-imports": "^4.3.0", 49 | "@types/node": "^20", 50 | "@types/react": "npm:types-react@19.0.0-rc.1", 51 | "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", 52 | "prettier": "^3.5.3", 53 | "prettier-plugin-tailwindcss": "^0.6.9", 54 | "tailwindcss": "^4.1.7", 55 | "typescript": "^5" 56 | }, 57 | "overrides": { 58 | "@types/react": "npm:types-react@19.0.0-rc.1", 59 | "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /apps/www/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: { 3 | "@tailwindcss/postcss": {}, 4 | }, 5 | } 6 | export default config -------------------------------------------------------------------------------- /apps/www/source.config.ts: -------------------------------------------------------------------------------- 1 | import { transformerRemoveNotationEscape } from '@shikijs/transformers' 2 | import { rehypeCodeDefaultOptions } from 'fumadocs-core/mdx-plugins' 3 | import { remarkInstall } from 'fumadocs-docgen' 4 | import { defineConfig, defineDocs } from 'fumadocs-mdx/config' 5 | import { transformerTwoslash } from 'fumadocs-twoslash' 6 | import { createFileSystemTypesCache } from 'fumadocs-twoslash/cache-fs' 7 | import rehypeKatex from 'rehype-katex' 8 | 9 | export const { docs, meta } = defineDocs({ 10 | dir: 'src/content/docs' 11 | }) 12 | 13 | export default defineConfig({ 14 | mdxOptions: { 15 | rehypeCodeOptions: { 16 | lazy: true, 17 | experimentalJSEngine: true, 18 | langs: ['ts', 'js', 'html', 'tsx', 'mdx'], 19 | inline: 'tailing-curly-colon', 20 | themes: { 21 | light: 'catppuccin-latte', 22 | dark: 'catppuccin-mocha' 23 | }, 24 | transformers: [ 25 | ...(rehypeCodeDefaultOptions.transformers ?? []), 26 | transformerTwoslash({ 27 | typesCache: createFileSystemTypesCache() 28 | }), 29 | transformerRemoveNotationEscape() 30 | ] 31 | }, 32 | remarkCodeTabOptions: { 33 | parseMdx: true 34 | }, 35 | remarkPlugins: [ 36 | [ 37 | remarkInstall, 38 | { 39 | persist: { 40 | id: 'package-manager' 41 | } 42 | } 43 | ] 44 | ], 45 | rehypePlugins: v => [rehypeKatex, ...v] 46 | } 47 | }) 48 | -------------------------------------------------------------------------------- /apps/www/src/app/(app)/docs/[[...slug]]/page.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | DocsBody, 3 | DocsDescription, 4 | DocsPage, 5 | DocsTitle 6 | } from 'fumadocs-ui/page' 7 | import { notFound } from 'next/navigation' 8 | 9 | import { getMDXComponents } from '@/components/shared/mdx-components' 10 | 11 | import { source } from '@/lib/source' 12 | 13 | type Params = Promise<{ slug: string[] }> 14 | 15 | export default async function DocPage({ params }: { params: Params }) { 16 | const { slug } = await params 17 | 18 | const page = source.getPage(slug) 19 | 20 | if (!page) notFound() 21 | 22 | const MDX = page.data.body 23 | 24 | return ( 25 | 26 | {page.data.title} 27 | {page.data.description} 28 | 29 | 30 | 31 | 32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /apps/www/src/app/(app)/layout.config.tsx: -------------------------------------------------------------------------------- 1 | import { BaseLayoutProps } from 'fumadocs-ui/layouts/shared' 2 | 3 | export const baseOptions: BaseLayoutProps = { 4 | nav: { 5 | title: 'NestJS YooKassa' 6 | }, 7 | githubUrl: 'https://github.com/teacoder-team/nestjs-yookassa' 8 | } 9 | -------------------------------------------------------------------------------- /apps/www/src/app/(app)/layout.tsx: -------------------------------------------------------------------------------- 1 | import { DocsLayout as FumadocsLayout } from 'fumadocs-ui/layouts/docs' 2 | import type { PropsWithChildren } from 'react' 3 | 4 | import { baseOptions } from './layout.config' 5 | import { source } from '@/lib/source' 6 | 7 | export default function AppLayout({ children }: PropsWithChildren) { 8 | return ( 9 | 10 | {children} 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/www/src/app/(app)/page.tsx: -------------------------------------------------------------------------------- 1 | import { redirect } from 'next/navigation' 2 | 3 | export default function HomePage() { 4 | return redirect('/docs/getting-started/installation') 5 | } 6 | -------------------------------------------------------------------------------- /apps/www/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { RootProvider } from 'fumadocs-ui/provider' 2 | import { GeistSans } from 'geist/font/sans' 3 | import type { Metadata } from 'next' 4 | import { ReactNode } from 'react' 5 | 6 | import { cn } from '@/lib/utils' 7 | import '@/styles/globals.css' 8 | 9 | export const metadata: Metadata = { 10 | title: 'NestJS Yookassa by TeaCoder', 11 | description: 'Generated by create next app' 12 | } 13 | 14 | export default function RootLayout({ 15 | children 16 | }: Readonly<{ 17 | children: ReactNode 18 | }>) { 19 | return ( 20 | 21 | 22 | 32 | {children} 33 | 34 | 35 | 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /apps/www/src/components/shared/mdx-components.tsx: -------------------------------------------------------------------------------- 1 | import { Step, Steps } from 'fumadocs-ui/components/steps' 2 | import { Tab, Tabs } from 'fumadocs-ui/components/tabs' 3 | import defaultMdxComponents from 'fumadocs-ui/mdx' 4 | import type { MDXComponents } from 'mdx/types' 5 | 6 | export function getMDXComponents(components?: MDXComponents): MDXComponents { 7 | return { 8 | ...defaultMdxComponents, 9 | Steps, 10 | Step, 11 | Tab, 12 | Tabs, 13 | ...components 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/getting-started/installation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Установка и настройка 3 | description: Шаги по установке и настройке 4 | --- 5 | 6 | В этом разделе мы разберем, как установить и настроить модуль nestjs-yookassa, а также приведем несколько примеров, как подключить его к вашему приложению на NestJS. 7 | 8 | 9 | 10 | ### Установка пакета 11 | 12 | Для начала установите необходимые пакеты. Используйте команду npm или yarn, чтобы добавить nestjs-yookassa в ваш проект. 13 | 14 | ```package-install 15 | npm install nestjs-yookassa 16 | ``` 17 | 18 | Пакет nestjs-yookassa включает в себя все необходимые зависимости для работы с ЮКасса в вашем приложении на NestJS. 19 | 20 | ### Настройка переменных окружения 21 | 22 | Для корректной работы модуля вам необходимо задать несколько переменных окружения. 23 | 24 | ```bash 25 | YOOKASSA_SHOP_ID=your_shop_id 26 | YOOKASSA_SECRET_KEY=your_secret_key 27 | ``` 28 | 29 | #### Где взять эти данные? 30 | 31 | Shop ID и Secret Key вы найдете в личном кабинете Yookassa после 32 | регистрации. 33 | 34 | Убедитесь, что эти значения строго конфиденциальны. Никогда не 35 | публикуйте их в репозитории. 36 | 37 | Эти значения предоставляются вам системой Yookassa после регистрации. Убедитесь, что они правильно указаны в файле, так как без них не будет возможности подключиться к сервису Yookassa. 38 | 39 | ### Подключение модуля 40 | 41 | После установки пакета и настройки переменных окружения, необходимо подключить модуль nestjs-yookassa к вашему приложению. 42 | 43 | #### Синхронная конфигурация 44 | 45 | Для базовой синхронной конфигурации используйте метод forRoot() для инициализации модуля с вашими настройками. 46 | 47 | ```typescript 48 | import { Module } from '@nestjs/common'; 49 | import { YookassaModule } from 'nestjs-yookassa'; 50 | 51 | @Module({ 52 | imports: [ 53 | YookassaModule.forRoot({ 54 | shopId: process.env.YOOKASSA_SHOP_ID, 55 | apiKey: process.env.YOOKASSA_SECRET_KEY 56 | }) 57 | ] 58 | }) 59 | export class AppModule {} 60 | ``` 61 | 62 | В этом примере YookassaModule.forRoot() принимает объект с настройками, который вы передаете в конфигурацию модуля. 63 | 64 | #### Асинхронная конфигурация 65 | 66 | Если вам нужно загружать параметры конфигурации из других источников или использовать асинхронные операции для получения значений, можно применить метод forRootAsync(). Этот подход подходит для работы с динамически получаемыми значениями конфигурации. 67 | 68 | ```typescript 69 | import { Module } from '@nestjs/common' 70 | import { ConfigModule, ConfigService } from '@nestjs/config' 71 | import { YookassaModule } from 'nestjs-yookassa' 72 | 73 | @Module({ 74 | imports: [ 75 | ConfigModule.forRoot(), 76 | YookassaModule.forRootAsync({ 77 | imports: [ConfigModule], 78 | inject: [ConfigService], 79 | useFactory: async (configService: ConfigService) => ({ 80 | shopId: configService.get('YOOKASSA_SHOP_ID'), 81 | apiKey: configService.get('YOOKASSA_SECRET_KEY') 82 | }) 83 | }) 84 | ] 85 | }) 86 | export class AppModule {} 87 | ``` 88 | 89 | В этом примере useFactory позволяет асинхронно получить значения конфигурации из ConfigService. Это полезно, если ваши параметры конфигурации могут изменяться или загружаются из внешнего источника. 90 | 91 | #### Вынесение конфигурации в отдельный файл 92 | 93 | Для более удобной работы с конфигурацией можно вынести настройки в отдельный файл. Например, создайте файл yookassa.config.ts: 94 | 95 | ```typescript 96 | // src/config/yookassa.config.ts 97 | import { ConfigService } from '@nestjs/config' 98 | import type { YookassaOptions } from 'nestjs-yookassa' 99 | 100 | export function getYookassaConfig( 101 | configService: ConfigService 102 | ): YookassaOptions { 103 | return { 104 | shopId: configService.get('YOOKASSA_SHOP_ID'), 105 | apiKey: configService.get('YOOKASSA_SECRET_KEY') 106 | } 107 | } 108 | ``` 109 | 110 | Затем подключите его в AppModule: 111 | 112 | ```typescript 113 | import { Module } from '@nestjs/common' 114 | import { ConfigModule, ConfigService } from '@nestjs/config' 115 | import { YookassaModule } from 'nestjs-yookassa' 116 | import { getYookassaConfig } from './config/yookassa.config' 117 | 118 | @Module({ 119 | imports: [ 120 | ConfigModule.forRoot(), 121 | YookassaModule.forRootAsync({ 122 | imports: [ConfigModule], 123 | useFactory: getYookassaConfig, 124 | inject: [ConfigService] 125 | }) 126 | ] 127 | }) 128 | export class AppModule {} 129 | ``` 130 | 131 | В этом случае конфигурация будет храниться в отдельном файле, что улучшает структуру и позволяет легче управлять параметрами окружения. 132 | 133 | 134 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/getting-started/introduction.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Введение 3 | description: Краткое введение в использование Yookassa в приложении NestJS. 4 | --- 5 | 6 | Добро пожаловать в документацию по интеграции Yookassa с приложениями на базе NestJS. В этом руководстве мы подробно рассмотрим, как настроить и использовать Yookassa в вашем NestJS приложении. 7 | 8 | Yookassa — это мощная и гибкая система для приема онлайн-платежей, поддерживающая различные способы оплаты, включая банковские карты, электронные кошельки, мобильные платежи и многое другое. Благодаря Yookassa вы можете организовать процесс приема платежей в своем приложении с минимальными усилиями. Система предоставляет удобные инструменты для работы с API и SDK, которые позволяют легко интегрировать платежи в любые веб-приложения. 9 | 10 | Моя библиотека, разработанная специально для интеграции с NestJS, значительно упрощает подключение Yookassa к вашему проекту. Она предоставляет готовые решения для работы с основными функциональностями системы Yookassa, такими как создание и обработка платежей, работа с вебхуками, а также поддержка различных типов транзакций. Библиотека максимально абстрагирует сложности работы с API Yookassa, позволяя вам сосредоточиться на логике вашего приложения. 11 | 12 | Следуя этому руководству, вы сможете сэкономить время и усилия при интеграции Yookassa, используя готовые решения, которые предоставляет моя библиотека, и сосредоточиться на разработке остальных функций вашего приложения. 13 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Name of Folder", 3 | "pages": [ 4 | "---Начало---", 5 | "getting-started/installation", 6 | "getting-started/introduction", 7 | "---Платежи---", 8 | "payments/create", 9 | "payments/list", 10 | "payments/info", 11 | "payments/confirm", 12 | "payments/cancel", 13 | "---Возвраты---", 14 | "refunds/create", 15 | "refunds/list", 16 | "refunds/info" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/payments/cancel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Отмена платежа 3 | description: Шаги для отмены платежа 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как отменить платеж, который был создан ранее. Это полезно, если, например, заказ отменен и продавец не собирается обрабатывать платеж. 7 | 8 | 9 | 10 | ### Вызов метода для отмены платежа 11 | 12 | Для отмены платежа необходимо предоставить только идентификатор платежа. 13 | 14 | Используйте метод cancelPayment для отмены платежа. Метод отправит запрос на сервер Yookassa и вернет обновленную информацию о статусе отмененного платежа. 15 | 16 | ```typescript 17 | import { YookassaService } from 'nestjs-yookassa'; 18 | 19 | @Injectable() 20 | export class PaymentService { 21 | constructor(private readonly yookassaService: YookassaService) {} 22 | 23 | async cancelPayment() { 24 | const paymentId = '123456' 25 | 26 | const canceledPayment = await this.yookassaService.cancelPayment(paymentId); 27 | 28 | return canceledPayment 29 | } 30 | } 31 | ``` 32 | 33 | ### Обработка ответа от API 34 | 35 | Ответ от Yookassa после отмены платежа будет содержать обновленную информацию о платеже, включая его статус. Пример ответа: 36 | 37 | ```json 38 | { 39 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор платежа 40 | "status": "canceled", // Статус платежа 41 | "amount": { 42 | "value": "100.00", // Сумма платежа 43 | "currency": "RUB" // Валюта платежа 44 | }, 45 | "description": "Test payment", // Описание платежа 46 | "recipient": { 47 | "account_id": "1234567", // Идентификатор аккаунта получателя (магазина) 48 | "gateway_id": "1234567" // Идентификатор шлюза получателя 49 | }, 50 | "payment_method": { 51 | "type": "yoo_money", // Тип метода оплаты 52 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор метода платежа 53 | "saved": false, // Флаг, указывающий, сохранены ли данные карты (если применимо) 54 | "status": "inactive" // Статус метода оплаты 55 | "title": "YooMoney wallet 111111111111111", // Название способа оплаты 56 | "account_number": "111111111111111" // Номер счета, с которого был произведен платеж 57 | }, 58 | "created_at": "2025-01-17T12:04:48.325Z", // Дата и время создания платежа 59 | "test": true, // Флаг, показывающий, что это тестовый платеж (не реальный). 60 | "paid": false, // Статус оплаты. `false` означает, что средства еще не были списаны. 61 | "refundable": false, // Флаг, указывающий, можно ли вернуть средства по данному платежу. 62 | "metadata": { 63 | "order_id": "12345678" // Дополнительные метаданные, предоставленные при создании платежа (например, ID заказа). 64 | }, 65 | "cancellation_details": { 66 | "party": "merchant", // Сторона, инициировавшая отмену ("merchant" - продавец) 67 | "reason": "canceled_by_merchant" // Причина отмены ("canceled_by_merchant" - отменен продавцом) 68 | } 69 | } 70 | ``` 71 | 72 | После отмены платежа его статус будет изменен на canceled. Вы также получите другие данные о платеже, такие как сумма и информация о получателе. 73 | 74 | #### Возможные статусы платежа 75 | 76 |
    77 |
  • pending — Платеж ожидает обработки.
  • 78 |
  • waiting_for_capture — Платеж ожидает захвата средств.
  • 79 |
  • succeeded — Платеж успешно завершен.
  • 80 |
  • canceled — Платеж был отменен.
  • 81 |
82 | 83 | #### Возможные ошибки 84 | 85 | При попытке отменить платеж, который уже был подтвержден и завершен, может возникнуть следующая ошибка: 86 | 87 | ```json 88 | { 89 | "statusCode": 400, 90 | "message": "You can't cancel a payment with this status. You can only cancel payments with the waiting_for_capture status." 91 | } 92 | ``` 93 | 94 | Эта ошибка возникает, если вы пытаетесь отменить платеж, который уже был подтвержден или завершен. Платежи с такими статусами, как "SUCCEEDED" или "PAID", не могут быть отменены. Для отмены доступен только статус "WAITING_FOR_CAPTURE" (платеж, ожидающий захвата средств). 95 | 96 |
97 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/payments/confirm.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Подтверждение платежа 3 | description: Шаги для подтверждения (захвата) платежа 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как подтвердить (или захватить) платеж, который был ранее создан. Этот процесс обычно выполняется после того, как заказ подтвержден, и продавец готов забрать средства с клиента. 7 | 8 | 9 | 10 | ### Вызов метода для захвата платежа 11 | 12 | Для захвата платежа необходимо указать идентификатор платежа. 13 | 14 | Используйте метод capturePayment для захвата средств с карты клиента. Метод отправит запрос на сервер Yookassa и вернет обновленную информацию о платеже. 15 | 16 | ```typescript 17 | import { YookassaService } from 'nestjs-yookassa'; 18 | 19 | @Injectable() 20 | export class PaymentService { 21 | constructor(private readonly yookassaService: YookassaService) {} 22 | 23 | async capturePayment() { 24 | const paymentId = '123456' 25 | 26 | const capturedPayment = await this.yookassaService.capturePayment(paymentId); 27 | 28 | return capturedPayment 29 | } 30 | } 31 | ``` 32 | 33 | ### Обработка ответа от API 34 | 35 | Ответ от Yookassa после захвата платежа содержит информацию о платеже, включая его обновлённый статус, сумму и другие важные данные. Пример ответа: 36 | 37 | ```json 38 | { 39 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор платежа 40 | "status": "pending", // Статус платежа 41 | "amount": { 42 | "value": "100.00", // Сумма платежа 43 | "currency": "RUB" // Валюта платежа 44 | }, 45 | "income_amount": { 46 | "value": "96.50", // Сумма, фактически полученная магазином (с учетом комиссии) 47 | "currency": "RUB" // Валюта фактически полученной суммы 48 | }, 49 | "description": "Test payment", // Описание платежа 50 | "recipient": { 51 | "account_id": "1234567", // Идентификатор аккаунта получателя (магазина) 52 | "gateway_id": "1234567" // Идентификатор шлюза получателя 53 | }, 54 | "payment_method": { 55 | "type": "yoo_money", // Тип метода оплаты 56 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор метода платежа 57 | "saved": false, // Флаг, указывающий, сохранены ли данные карты (если применимо) 58 | "status": "inactive" // Статус метода оплаты 59 | "title": "YooMoney wallet 111111111111111", // Название способа оплаты 60 | "account_number": "111111111111111" // Номер счета, с которого был произведен платеж 61 | }, 62 | "captured_at": "2025-01-17T11:45:09.367Z", // Дата и время захвата платежа 63 | "created_at": "2025-01-17T11:38:48.411Z", // Дата и время создания платежа 64 | "test": true, // Флаг, показывающий, что это тестовый платеж (не реальный). 65 | "refunded_amount": { 66 | "value": "0.00", // Сумма возврата 67 | "currency": "RUB" // Валюта суммы возврата 68 | }, 69 | "paid": true, // Платеж был произведен (true - да) 70 | "refundable": true, // Платеж можно вернуть (true - да) 71 | "metadata": { 72 | "order_id": "12345678" // Дополнительные метаданные, предоставленные при создании платежа (например, ID заказа). 73 | } 74 | } 75 | ``` 76 | 77 | Если платеж успешно захвачен, вы получите информацию с обновленным статусом платежа и временем захвата. В случае ошибки будет выброшено исключение с описанием ошибки. 78 | 79 | #### Возможные статусы платежа 80 | 81 |
    82 |
  • pending — Платеж ожидает обработки.
  • 83 |
  • waiting_for_capture — Платеж ожидает захвата средств.
  • 84 |
  • succeeded — Платеж успешно завершен.
  • 85 |
  • canceled — Платеж был отменен.
  • 86 |
87 | 88 | #### Возможные ошибки 89 | 90 | При попытке захватить платеж, который ещё не был подтвержден или оплачен, может возникнуть ошибка. Пример ошибки: 91 | 92 | ```json 93 | { 94 | "statusCode": 400, 95 | "message": "Incorrect payment_id. Payment doesn't exist or access denied. Specify the payment ID created in your store." 96 | } 97 | ``` 98 | 99 | Эта ошибка возникает, когда пытаются подтвердить или захватить платеж, который ещё не был оплачен. Убедитесь, что вы выполняете захват платежа только после того, как он будет подтвержден и средства будут зарезервированы. 100 | 101 |
102 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/payments/create.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Создание платежа 3 | description: Шаги для создания платежа 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как создать платеж . Мы покажем, как подготовить данные для платежа, вызвать API Yookassa для его создания и обработать ответ от сервиса. 7 | 8 | 9 | 10 | ### Подготовка данных для создания платежа 11 | 12 | Для создания платежа вам необходимо подготовить объект PaymentCreateRequest, который содержит всю необходимую информацию о платеже. Важнейшие поля включают сумму платежа. 13 | 14 | ```typescript 15 | import { CurrencyEnum, type PaymentCreateRequest, PaymentMethodsEnum } from 'nestjs-yookassa' 16 | 17 | const paymentData: PaymentCreateRequest = { 18 | amount: { 19 | value: 100, // сумма 20 | currency: currency: CurrencyEnum.RUB // валюта 21 | }, 22 | description: 'Test payment', // описание платежа 23 | payment_method_data: { 24 | type: PaymentMethodsEnum.yoo_money // метод платежа (например, YooMoney) 25 | }, 26 | capture: false // флаг для отложенного захвата 27 | confirmation: { 28 | type: 'redirect', // тип подтверждения 29 | return_url: 'https://example.com/thanks' // URL для перенаправления после подтверждения 30 | }, 31 | metadata: { 32 | order_id: '12345678', // Дополнительные метаданные, предоставленные при создании платежа 33 | }, 34 | } 35 | ``` 36 | 37 | ### Вызов метода для создания платежа 38 | 39 | Теперь, когда у вас есть данные для платежа, вы можете использовать метод createPayment из сервиса YookassaService для отправки данных на сервер Yookassa и получения информации о созданном платеже. 40 | 41 | ```typescript 42 | import { CurrencyEnum, type PaymentCreateRequest, PaymentMethodsEnum, YookassaService } from 'nestjs-yookassa'; 43 | 44 | @Injectable() 45 | export class PaymentService { 46 | constructor(private readonly yookassaService: YookassaService) {} 47 | 48 | async createPayment() { 49 | const paymentData: PaymentCreateRequest = { 50 | amount: { 51 | value: 100, 52 | currency: CurrencyEnum.RUB 53 | }, 54 | description: 'Test payment', 55 | payment_method_data: { 56 | type: PaymentMethodsEnum.yoo_money 57 | }, 58 | capture: false, 59 | confirmation: { 60 | type: 'redirect', 61 | return_url: 'https://example.com/thanks' 62 | }, 63 | metadata: { 64 | order_id: '12345678', 65 | }, 66 | } 67 | 68 | const newPayment = await this.yookassaService.createPayment(paymentData); 69 | 70 | return newPayment; 71 | } 72 | } 73 | ``` 74 | 75 | ### Обработка ответа от API 76 | 77 | Ответ от Yookassa содержит информацию о платеже, такую как идентификатор платежа, статус, сумму и другую информацию. Пример ответа: 78 | 79 | ```json 80 | { 81 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Уникальный идентификатор платежа 82 | "status": "pending", // Статус платежа 83 | "amount": { 84 | "value": "100.00", // Сумма платежа 85 | "currency": "RUB" // Валюта платежа 86 | }, 87 | "description": "Test payment", // Описание платежа 88 | "recipient": { 89 | "account_id": "1234567", // Идентификатор аккаунта получателя (магазина) 90 | "gateway_id": "1234567" // Идентификатор шлюза получателя 91 | }, 92 | "payment_method": { 93 | "type": "yoo_money", // Тип метода оплаты 94 | "id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор метода платежа 95 | "saved": false, // Флаг, указывающий, сохранены ли данные карты (если применимо) 96 | "status": "inactive" // Статус метода оплаты 97 | }, 98 | "created_at": "2025-01-17T10:15:35.455Z", // Дата и время создания платежа 99 | "confirmation": { 100 | "type": "redirect", // Тип подтверждения 101 | "return_url": "https://example.com/thanks", // URL, на который пользователь будет перенаправлен после подтверждения 102 | "confirmation_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=32f3dce3-e775-424f-a265-4e1e86e3db08" // URL для начала процесса подтверждения (например, перенаправление на сайт YooMoney для завершения платежа). 103 | }, 104 | "test": true, // Флаг, показывающий, что это тестовый платеж (не реальный). 105 | "paid": false, // Статус оплаты. `false` означает, что средства еще не были списаны. 106 | "refundable": false, // Флаг, указывающий, можно ли вернуть средства по данному платежу. 107 | "metadata": { 108 | "order_id": "12345678" // Дополнительные метаданные, предоставленные при создании платежа (например, ID заказа). 109 | } 110 | } 111 | ``` 112 | 113 | Если платеж успешно создан, вы получите ответ с подробной информацией о нем, включая его статус и информацию о подтверждении. 114 | 115 | #### Возможные статусы платежа 116 | 117 |
    118 |
  • pending — Платеж ожидает обработки.
  • 119 |
  • waiting_for_capture — Платеж ожидает захвата средств.
  • 120 |
  • succeeded — Платеж успешно завершен.
  • 121 |
  • canceled — Платеж был отменен.
  • 122 |
123 | 124 | #### Возможные ошибки 125 | 126 | При попытке создать платеж могут возникнуть следующие ошибки: 127 | 128 |
129 |

1. Ошибка, связанная с недоступностью метода оплаты:

130 | 131 | ```json 132 | { 133 | "statusCode": 400, 134 | "message": "Payment method is not available" 135 | } 136 | ``` 137 | 138 | Эта ошибка возникает, когда выбранный метод оплаты не поддерживается. В таком случае необходимо выбрать другой метод оплаты, который доступен для использования. 139 | 140 |
141 | 142 |
143 |

2. Ошибка, связанная с некорректной валютой:

144 | 145 | ```json 146 | { 147 | "statusCode": 400, 148 | "message": "Incorrect currency of payment. The value of the amount.currency parameter doesn't correspond with the settings of your store. Specify another currency value in the request or contact the YooMoney manager to change the settings" 149 | } 150 | ``` 151 | 152 | Эта ошибка возникает, когда выбранная валюта не поддерживается для платежей в вашем магазине. Убедитесь, что валюта, указанная в параметре amount.currency, соответствует настройкам вашего магазина. В случае необходимости можно изменить валюту запроса или обратиться к менеджеру YooMoney для изменения настроек валюты. 153 | 154 |
155 | 156 |
157 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/payments/info.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Информация о платеже 3 | description: Шаги для получения деталей о платеже 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как получить подробную информацию о платеже по его уникальному идентификатору. 7 | 8 | 9 | 10 | ### Вызов метода для получения информации о платеже 11 | 12 | Для получения подробной информации о платеже, нужно использовать метод getPaymentDetails, передав в него идентификатор платежа. 13 | 14 | ```typescript 15 | import { YookassaService } from 'nestjs-yookassa'; 16 | 17 | @Injectable() 18 | export class PaymentService { 19 | constructor(private readonly yookassaService: YookassaService) {} 20 | 21 | async getPaymentDetails() { 22 | const paymentId = '123456'; // Уникальный ID платежа 23 | 24 | const payment = await this.yookassaService.getPaymentDetails(paymentId); 25 | 26 | return payment 27 | } 28 | } 29 | ``` 30 | 31 | ### Обработка ответа от API 32 | 33 | Ответ от Yookassa содержит подробную информацию о платеже, такую как его статус, сумма, метод оплаты и прочие данные. Пример ответа: 34 | 35 | ```json 36 | { 37 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", // Уникальный идентификатор платежа 38 | "status": "pending", // Статус платежа 39 | "amount": { 40 | "value": "529.00", // Сумма платежа 41 | "currency": "RUB" // Валюта платежа 42 | }, 43 | "description": "Test payment", // Описание платежа 44 | "recipient": { 45 | "account_id": "497037", // Идентификатор аккаунта получателя 46 | "gateway_id": "2358944" // Идентификатор шлюза получателя 47 | }, 48 | "payment_method": { 49 | "type": "bank_card", // Тип метода оплаты 50 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", // Идентификатор метода платежа 51 | "status": "inactive" // Статус метода оплаты 52 | }, 53 | "created_at": "2025-01-17T15:58:05.278Z", // Дата и время создания платежа 54 | "confirmation": { 55 | "type": "redirect", // Тип подтверждения 56 | "confirmation_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=2f1c91cd-000f-5000-8000-1e9f7e4ebff7" // URL для подтверждения 57 | }, 58 | "test": true, // Флаг, показывающий, что это тестовый платеж (не реальный). 59 | "paid": false, // Статус оплаты. `false` означает, что средства еще не были списаны. 60 | "refundable": false, // Флаг, указывающий, можно ли вернуть средства по данному платежу. 61 | "metadata": { 62 | "order_id": "12345678" // Дополнительные метаданные, предоставленные при создании платежа (например, ID заказа). 63 | } 64 | } 65 | ``` 66 | 67 | ### Возможные статусы платежа 68 | 69 | Ответ может содержать следующие статусы платежа: 70 | 71 |
    72 |
  • pending — Платеж ожидает обработки.
  • 73 |
  • waiting_for_capture — Платеж ожидает захвата средств.
  • 74 |
  • succeeded — Платеж успешно завершен.
  • 75 |
  • canceled — Платеж был отменен.
  • 76 |
77 | 78 | ### Пример обработки различных статусов платежа 79 | 80 | #### 1. Платеж в ожидании (статус: pending) 81 | 82 | Когда платеж находится в статусе "pending", это означает, что он еще не был обработан или принят к выполнению. Система ожидает подтверждения от клиента или процесса, который должен завершить или отклонить транзакцию. Обычно в этом случае необходимо дождаться, пока клиент не завершит подтверждение, например, через редирект на страницу оплаты. 83 | 84 | ```json 85 | { 86 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", 87 | "status": "pending", 88 | "amount": { 89 | "value": "529.00", 90 | "currency": "RUB" 91 | }, 92 | "description": "Test payment", 93 | "recipient": { 94 | "account_id": "497037", 95 | "gateway_id": "2358944" 96 | }, 97 | "payment_method": { 98 | "type": "bank_card", 99 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", 100 | "saved": false, 101 | "status": "inactive" 102 | }, 103 | "created_at": "2025-01-17T15:58:05.278Z", 104 | "confirmation": { 105 | "type": "redirect", 106 | "return_url": "https://example.com/thanks", 107 | "confirmation_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=2f1c91cd-000f-5000-8000-1e9f7e4ebff7" 108 | }, 109 | "test": true, 110 | "paid": false, 111 | "refundable": false, 112 | "metadata": { 113 | "order_id": "12345678" 114 | } 115 | } 116 | ``` 117 | 118 | #### 2. Платеж ожидает подтверждения (статус: waiting_for_capture) 119 | 120 | Когда статус платежа "waiting_for_capture", это означает, что средства были заблокированы на счете клиента, и система ожидает завершения процедуры подтверждения и захвата средств. Обычно это происходит в случаях, когда для платежа требуется дополнительное подтверждение от пользователя или другого процесса. 121 | 122 | ```json 123 | { 124 | "id": "2f1c9181-000f-5000-a000-105cb3820b4a", 125 | "status": "waiting_for_capture", 126 | "amount": { 127 | "value": "529.00", 128 | "currency": "RUB" 129 | }, 130 | "description": "Test payment", 131 | "recipient": { 132 | "account_id": "497037", 133 | "gateway_id": "2358944" 134 | }, 135 | "payment_method": { 136 | "type": "bank_card", 137 | "id": "2f1c9181-000f-5000-a000-105cb3820b4a", 138 | "saved": false, 139 | "status": "inactive", 140 | "title": "Bank card *4444", 141 | "card": { 142 | "first6": "555555", 143 | "last4": "4444", 144 | "expiry_year": "2044", 145 | "expiry_month": "04", 146 | "card_type": "MasterCard", 147 | "card_product": { 148 | "code": "E" 149 | }, 150 | "issuer_country": "US" 151 | } 152 | }, 153 | "created_at": "2025-01-17T15:56:49.489Z", 154 | "expires_at": "2025-01-24T15:57:12.776Z", 155 | "test": true, 156 | "paid": true, 157 | "refundable": false, 158 | "metadata": { 159 | "order_id": "12345678" 160 | }, 161 | "authorization_details": { 162 | "rrn": "464425465642653", 163 | "auth_code": "680377", 164 | "three_d_secure": { 165 | "applied": false, 166 | "method_completed": false, 167 | "challenge_completed": false 168 | } 169 | } 170 | } 171 | ``` 172 | 173 | #### 3. Платеж успешно завершен (статус: succeeded) 174 | 175 | Статус "succeeded" означает, что платеж был успешно завершен и средства были списаны с карты клиента. Платеж полностью обработан, и средства переведены на счет получателя. Этот статус подтверждает, что транзакция была успешно проведена. 176 | 177 | ```json 178 | { 179 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", 180 | "status": "succeeded", 181 | "amount": { 182 | "value": "529.00", 183 | "currency": "RUB" 184 | }, 185 | "income_amount": { 186 | "value": "510.48", 187 | "currency": "RUB" 188 | }, 189 | "description": "Test payment", 190 | "recipient": { 191 | "account_id": "497037", 192 | "gateway_id": "2358944" 193 | }, 194 | "payment_method": { 195 | "type": "bank_card", 196 | "id": "2f1c91cd-000f-5000-8000-1e9f7e4ebff7", 197 | "saved": false, 198 | "status": "inactive", 199 | "title": "Bank card *4444", 200 | "card": { 201 | "first6": "555555", 202 | "last4": "4444", 203 | "expiry_year": "2044", 204 | "expiry_month": "04", 205 | "card_type": "MasterCard", 206 | "card_product": { 207 | "code": "E" 208 | }, 209 | "issuer_country": "US" 210 | } 211 | }, 212 | "captured_at": "2025-01-17T15:59:27.119Z", 213 | "created_at": "2025-01-17T15:58:05.278Z", 214 | "test": true, 215 | "refunded_amount": { 216 | "value": "0.00", 217 | "currency": "RUB" 218 | }, 219 | "paid": true, 220 | "refundable": true, 221 | "metadata": { 222 | "order_id": "12345678" 223 | }, 224 | "authorization_details": { 225 | "rrn": "281463796947749", 226 | "auth_code": "184168", 227 | "three_d_secure": { 228 | "applied": false, 229 | "method_completed": false, 230 | "challenge_completed": false 231 | } 232 | } 233 | } 234 | ``` 235 | 236 | #### 4. Платеж был отменен (статус: canceled) 237 | 238 | Статус "canceled" означает, что платеж был отменен до завершения. Это может происходить по разным причинам, например, если клиент сам отменяет платеж, если есть проблема с обработкой, или если платеж был отклонен системой. В ответе может содержаться информация о причине отмены. 239 | 240 | ```json 241 | { 242 | "id": "2f1c9181-000f-5000-a000-105cb3820b4a", 243 | "status": "canceled", 244 | "amount": { 245 | "value": "529.00", 246 | "currency": "RUB" 247 | }, 248 | "description": "Test payment", 249 | "recipient": { 250 | "account_id": "497037", 251 | "gateway_id": "2358944" 252 | }, 253 | "payment_method": { 254 | "type": "bank_card", 255 | "id": "2f1c9181-000f-5000-a000-105cb3820b4a", 256 | "saved": false, 257 | "status": "inactive", 258 | "title": "Bank card *4444", 259 | "card": { 260 | "first6": "555555", 261 | "last4": "4444", 262 | "expiry_year": "2044", 263 | "expiry_month": "04", 264 | "card_type": "MasterCard", 265 | "card_product": { 266 | "code": "E" 267 | }, 268 | "issuer_country": "US" 269 | } 270 | }, 271 | "created_at": "2025-01-17T15:56:49.489Z", 272 | "test": true, 273 | "paid": false, 274 | "refundable": false, 275 | "metadata": { 276 | "order_id": "12345678" 277 | }, 278 | "cancellation_details": { 279 | "party": "merchant", 280 | "reason": "canceled_by_merchant" 281 | }, 282 | "authorization_details": { 283 | "rrn": "464425465642653", 284 | "auth_code": "680377", 285 | "three_d_secure": { 286 | "applied": false, 287 | "method_completed": false, 288 | "challenge_completed": false 289 | } 290 | } 291 | } 292 | ``` 293 | 294 |
295 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/payments/list.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Список платежей 3 | description: Шаги для получения списка всех платежей с возможностью пагинации 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как получить список всех платежей, используя API Yookassa. Это позволяет запрашивать платежи, фильтровать их по дате и ограничивать количество выводимых записей. Этот функционал полезен для отображения истории платежей или для обработки большого объема данных с использованием пагинации. 7 | 8 | 9 | 10 | ### Вызов метода для получения списка платежей 11 | 12 | Метод getPayments позволяет получать список всех платежей. Вы можете использовать его для фильтрации платежей по датам, а также задавать ограничение на количество отображаемых платежей на странице (пагинация). 13 | 14 | Функция имеет следующие параметры: 15 | 16 |
    17 |
  • 18 | limit (число) — максимальное количество платежей, которое будет 19 | возвращено на одну страницу. 20 |
  • 21 |
  • 22 | from (строка) — начальная дата в формате YYYY-MM-DD для фильтрации 23 | платежей по дате. 24 |
  • 25 |
  • 26 | to (строка) — конечная дата в формате YYYY-MM-DD для фильтрации платежей 27 | по дате. 28 |
  • 29 |
30 | 31 | ```typescript 32 | import { YookassaService } from 'nestjs-yookassa'; 33 | 34 | @Injectable() 35 | export class PaymentService { 36 | constructor(private readonly yookassaService: YookassaService) {} 37 | 38 | async getPaymentsList() { 39 | const limit = 2; // Ограничение на количество платежей 40 | const from = '2025-01-01'; // Начальная дата фильтра 41 | const to = '2025-01-31'; // Конечная дата фильтра 42 | 43 | const payments = await this.yookassaService.getPayments(limit, from, to); 44 | 45 | return payments 46 | } 47 | } 48 | ``` 49 | 50 | ### Обработка ответа от API 51 | 52 | Ответ от API содержит массив объектов PaymentDetails, где каждый объект представляет собой информацию о платеже. Пример ответа может быть следующим: 53 | 54 | ```json 55 | { 56 | "type": "list", // Тип ответа, в данном случае список 57 | "next_cursor": "2f1c5d0c-000f-5000-9000-1bc0db33907d", // Указатель на следующую страницу (для пагинации) 58 | "items": [ 59 | { 60 | "id": "2f1c6950-000f-5000-b000-142aa79ed0ff", 61 | "status": "succeeded", 62 | "amount": { 63 | "value": "529.00", 64 | "currency": "RUB" 65 | }, 66 | "income_amount": { 67 | "value": "510.48", 68 | "currency": "RUB" 69 | }, 70 | "description": "Test payment", 71 | "recipient": { 72 | "account_id": "497037", 73 | "gateway_id": "2358944" 74 | }, 75 | "payment_method": { 76 | "type": "bank_card", 77 | "id": "2f1c6950-000f-5000-b000-142aa79ed0ff", 78 | "saved": false, 79 | "status": "inactive", 80 | "title": "Bank card *4444", 81 | "card": { 82 | "first6": "555555", 83 | "last4": "4444", 84 | "expiry_year": "2044", 85 | "expiry_month": "04", 86 | "card_type": "MasterCard", 87 | "card_product": { 88 | "code": "E" 89 | }, 90 | "issuer_country": "US" 91 | } 92 | }, 93 | "captured_at": "2025-01-17T13:06:01.264Z", 94 | "created_at": "2025-01-17T13:05:20.062Z", 95 | "test": true, 96 | "refunded_amount": { 97 | "value": "0.00", 98 | "currency": "RUB" 99 | }, 100 | "paid": true, 101 | "refundable": true, 102 | "metadata": { 103 | "order_id": "12345678" 104 | }, 105 | "authorization_details": { 106 | "rrn": "224984783956865", 107 | "auth_code": "769976", 108 | "three_d_secure": { 109 | "applied": false, 110 | "method_completed": false, 111 | "challenge_completed": false 112 | } 113 | } 114 | }, 115 | { 116 | "id": "2f1c5df0-000f-5000-8000-11e6d86b5540", 117 | "status": "canceled", 118 | "amount": { 119 | "value": "100.00", 120 | "currency": "RUB" 121 | }, 122 | "description": "Test payment", 123 | "recipient": { 124 | "account_id": "497037", 125 | "gateway_id": "2358944" 126 | }, 127 | "payment_method": { 128 | "type": "yoo_money", 129 | "id": "2f1c5df0-000f-5000-8000-11e6d86b5540", 130 | "saved": false, 131 | "status": "inactive", 132 | "title": "YooMoney wallet 410011758831136", 133 | "account_number": "410011758831136" 134 | }, 135 | "created_at": "2025-01-17T12:16:48.321Z", 136 | "test": true, 137 | "paid": false, 138 | "refundable": false, 139 | "metadata": { 140 | "order_id": "12345678" 141 | }, 142 | "cancellation_details": { 143 | "party": "merchant", 144 | "reason": "canceled_by_merchant" 145 | } 146 | } 147 | ] 148 | } 149 | ``` 150 | 151 |
152 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/refunds/create.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Создание возврата 3 | description: Шаги для создания возврата по платежу 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как создать возврат средств по платежу. Мы покажем, как подготовить данные для возврата и обработать ответ от сервиса. 7 | 8 | 9 | 10 | ### Подготовка данных для создания возврата 11 | 12 | Для создания возврата необходимо подготовить объект RefundCreateRequest, который содержит все данные для возврата. Важнейшие поля включают уникальный идентификатор платежа (payment_id), сумму возврата и описание. 13 | 14 | ```typescript 15 | import type { RefundCreateRequest } from 'nestjs-yookassa' 16 | 17 | const refundData: RefundCreateRequest = { 18 | payment_id: '123456', // Идентификатор платежа, по которому нужно создать возврат 19 | description: 'Возврат на заказ с ID 123456' // Описание возврата 20 | } 21 | ``` 22 | 23 | ### Вызов метода для создания возврата 24 | 25 | Теперь, когда у вас есть данные для возврата, вы можете использовать метод createRefund для отправки запроса на создание возврата и получения информации о созданном возврате. 26 | 27 | ```typescript 28 | import { type RefundCreateRequest, YookassaService } from 'nestjs-yookassa'; 29 | 30 | @Injectable() 31 | export class PaymentService { 32 | constructor(private readonly yookassaService: YookassaService) {} 33 | 34 | async createRefund() { 35 | const refundData: RefundCreateRequest = { 36 | payment_id: '123456', 37 | description: 'Возврат на заказ с ID 123456', 38 | }; 39 | 40 | const newRefund = await this.yookassaService.createRefund(refundData); 41 | 42 | return newRefund; 43 | } 44 | } 45 | ``` 46 | 47 | ### Обработка ответа от API 48 | 49 | Ответ от Yookassa содержит информацию о возврате, такую как идентификатор возврата, статус, сумма и другие детали. Пример ответа: 50 | 51 | ```json 52 | { 53 | "id": "2f1d2280-0015-5000-b000-1c02972ec0ef", // Уникальный идентификатор возврата 54 | "payment_id": "123456", // Идентификатор платежа, к которому привязан возврат 55 | "status": "succeeded", // Статус возврата 56 | "created_at": "2025-01-18T02:15:28.461Z", // Дата и время создания возврата 57 | "amount": { 58 | "value": "529.00", // Сумма возврата 59 | "currency": "RUB" // Валюта возврата 60 | }, 61 | "description": "Возврат на заказ с ID 123456" // Описание возврата, может включать информацию о заказе или причине возврата 62 | } 63 | ``` 64 | 65 | #### Возможные ошибки 66 | 67 | При попытке создать возврат могут возникать ошибки, если платеж находится в неподобающем статусе. Вот несколько примеров ошибок и объяснение их причин: 68 | 69 |
70 |

1. Платеж в статусе pending

71 | 72 | ```json 73 | { 74 | "statusCode": 400, 75 | "message": "You can't make a refund since the payment from customer hasn't been received yet. Wait until the payment status changes to succeeded and repeat your request for making the refund. If you are making a two-stage payment, wait until the payment status changes to waiting_for_capture and cancel the payment" 76 | } 77 | ``` 78 | 79 | Эта ошибка возникает, когда вы пытаетесь создать возврат по платежу, который еще не был завершен, и находится в статусе pending (ожидается подтверждение). 80 | 81 |
82 | 83 |
84 |

2. Платеж в статусе waiting_for_capture

85 | 86 | ```json 87 | { 88 | "statusCode": 400, 89 | "message": "You can't refund this payment as it's still being processed. Wait until the payment status changes to succeeded" 90 | } 91 | ``` 92 | 93 | Эта ошибка возникает, когда платеж находится в статусе waiting_for_capture, что означает, что он еще не был захвачен и обработан. 94 | 95 |
96 | 97 |
98 |

3. Платеж был отменен

99 | 100 | ```json 101 | { 102 | "statusCode": 400, 103 | "message": "You can't refund this payment as it's been canceled. You can only refund payments with the succeeded status" 104 | } 105 | ``` 106 | 107 | Эта ошибка возникает, когда платеж был отменен и теперь имеет статус canceled. 108 | 109 |
110 | 111 |
112 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/refunds/info.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Информация о возврате 3 | description: Шаги для получения деталей о возврате 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как получить подробную информацию о возврате по его уникальному идентификатору. 7 | 8 | 9 | 10 | ### Вызов метода для получения информации о возврате 11 | 12 | Для получения подробной информации о возврате, нужно использовать метод getRefundDetails, передав в него идентификатор возврата. 13 | 14 | ```typescript 15 | import { YookassaService } from 'nestjs-yookassa'; 16 | 17 | @Injectable() 18 | export class RefundService { 19 | constructor(private readonly yookassaService: YookassaService) {} 20 | 21 | async getRefundDetails() { 22 | const refundId = '123456'; // Уникальный ID возврата 23 | 24 | const refund = await this.yookassaService.getRefundDetails(refundId); 25 | 26 | return refund; 27 | } 28 | } 29 | ``` 30 | 31 | ### Обработка ответа от API 32 | 33 | Ответ от Yookassa содержит подробную информацию о возврате, такую как его статус, сумма и описание. Пример ответа: 34 | 35 | ```json 36 | { 37 | "id": "2f1d2280-0015-5000-b000-1c02972ec0ef", // Уникальный идентификатор возврата 38 | "payment_id": "123456", // Идентификатор платежа, к которому привязан возврат 39 | "status": "succeeded", // Статус возврата 40 | "created_at": "2025-01-18T02:15:28.461Z", // Дата и время создания возврата 41 | "amount": { 42 | "value": "529.00", // Сумма возврата 43 | "currency": "RUB" // Валюта возврата 44 | }, 45 | "description": "Возврат на заказ с ID 123456" // Описание возврата 46 | } 47 | ``` 48 | 49 | 50 | -------------------------------------------------------------------------------- /apps/www/src/content/docs/refunds/list.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Список возвратов 3 | description: Шаги для получения списка всех возвратов по платежам 4 | --- 5 | 6 | В этом разделе мы рассмотрим, как получить список всех возвратов. Этот функционал полезен для отображения истории возвратов. 7 | 8 | 9 | 10 | ### Вызов метода для получения списка возвратов 11 | 12 | Метод getRefunds позволяет получать список всех возвратов. Вы можете использовать его для фильтрации возвратов по датам, а также задавать ограничение на количество отображаемых возвратов на странице (пагинация). 13 | 14 | Функция имеет следующие параметры: 15 | 16 |
    17 |
  • 18 | limit (число) — максимальное количество возвратов, которое будет 19 | возвращено на одну страницу. 20 |
  • 21 |
  • 22 | from (строка) — начальная дата в формате YYYY-MM-DD для фильтрации 23 | возвратов по дате. 24 |
  • 25 |
  • 26 | to (строка) — конечная дата в формате YYYY-MM-DD для фильтрации 27 | возвратов по дате. 28 |
  • 29 |
30 | 31 | ```typescript 32 | import { YookassaService } from 'nestjs-yookassa'; 33 | 34 | @Injectable() 35 | export class RefundService { 36 | constructor(private readonly yookassaService: YookassaService) {} 37 | 38 | async getRefundsList() { 39 | const limit = 2; // Ограничение на количество возвратов 40 | const from = '2025-01-01'; // Начальная дата фильтра 41 | const to = '2025-01-31'; // Конечная дата фильтра 42 | 43 | const refunds = await this.yookassaService.getRefunds(limit, from, to); 44 | 45 | return refunds 46 | } 47 | } 48 | ``` 49 | 50 | ### Обработка ответа от API 51 | 52 | Ответ от API содержит массив объектов RefundDetails, где каждый объект представляет собой информацию о возврате. Пример ответа может быть следующим: 53 | 54 | ```json 55 | { 56 | "type": "list", // Тип ответа, в данном случае список 57 | "next_cursor": "2f1d20e1-0016-5000-8000-12fc2af7f19b", // Указатель на следующую страницу (для пагинации) 58 | "items": [ 59 | { 60 | "id": "2f1d29e9-0015-5000-a000-1e7e28fedd75", 61 | "payment_id": "2f1d28e4-000f-5000-a000-15f2d944be24", 62 | "status": "succeeded", 63 | "created_at": "2025-01-18T02:47:05.077Z", 64 | "amount": { 65 | "value": "529.00", 66 | "currency": "RUB" 67 | }, 68 | "description": "Возврат на заказ с ID 2f1d28e4-000f-5000-a000-15f2d944be24" 69 | }, 70 | { 71 | "id": "2f1d2280-0015-5000-b000-1c02972ec0ef", 72 | "payment_id": "2f1d224b-000f-5000-b000-12fc94fd0013", 73 | "status": "succeeded", 74 | "created_at": "2025-01-18T02:15:28.461Z", 75 | "amount": { 76 | "value": "529.00", 77 | "currency": "RUB" 78 | }, 79 | "description": "Возврат на заказ с ID 2f1d224b-000f-5000-b000-12fc94fd0013" 80 | } 81 | ] 82 | } 83 | ``` 84 | 85 |
86 | -------------------------------------------------------------------------------- /apps/www/src/lib/source.ts: -------------------------------------------------------------------------------- 1 | import { loader } from 'fumadocs-core/source' 2 | import { createMDXSource } from 'fumadocs-mdx' 3 | 4 | import { docs, meta } from '@/source' 5 | 6 | export const source = loader({ 7 | baseUrl: '/docs', 8 | source: createMDXSource(docs, meta) 9 | }) 10 | -------------------------------------------------------------------------------- /apps/www/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx' 2 | import { twMerge } from 'tailwind-merge' 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /apps/www/src/providers/theme-provider.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { ThemeProvider as NextThemesProvider } from 'next-themes' 4 | import { ComponentProps } from 'react' 5 | 6 | export function ThemeProvider({ 7 | children, 8 | ...props 9 | }: ComponentProps) { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /apps/www/src/styles/globals.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | @import "tw-animate-css"; 3 | 4 | @import 'fumadocs-ui/css/neutral.css'; 5 | @import 'fumadocs-ui/css/preset.css'; 6 | 7 | @custom-variant dark (&:is(.dark *)); 8 | 9 | :root { 10 | --background: oklch(1 0 0); 11 | --foreground: oklch(0.145 0 0); 12 | --card: oklch(1 0 0); 13 | --card-foreground: oklch(0.145 0 0); 14 | --popover: oklch(1 0 0); 15 | --popover-foreground: oklch(0.145 0 0); 16 | --primary: oklch(0.205 0 0); 17 | --primary-foreground: oklch(0.985 0 0); 18 | --secondary: oklch(0.97 0 0); 19 | --secondary-foreground: oklch(0.205 0 0); 20 | --muted: oklch(0.97 0 0); 21 | --muted-foreground: oklch(0.556 0 0); 22 | --accent: oklch(0.97 0 0); 23 | --accent-foreground: oklch(0.205 0 0); 24 | --destructive: oklch(0.577 0.245 27.325); 25 | --destructive-foreground: oklch(0.577 0.245 27.325); 26 | --border: oklch(0.922 0 0); 27 | --input: oklch(0.922 0 0); 28 | --ring: oklch(0.708 0 0); 29 | --chart-1: oklch(0.646 0.222 41.116); 30 | --chart-2: oklch(0.6 0.118 184.704); 31 | --chart-3: oklch(0.398 0.07 227.392); 32 | --chart-4: oklch(0.828 0.189 84.429); 33 | --chart-5: oklch(0.769 0.188 70.08); 34 | --radius: 0.625rem; 35 | --sidebar: oklch(0.985 0 0); 36 | --sidebar-foreground: oklch(0.145 0 0); 37 | --sidebar-primary: oklch(0.205 0 0); 38 | --sidebar-primary-foreground: oklch(0.985 0 0); 39 | --sidebar-accent: oklch(0.97 0 0); 40 | --sidebar-accent-foreground: oklch(0.205 0 0); 41 | --sidebar-border: oklch(0.922 0 0); 42 | --sidebar-ring: oklch(0.708 0 0); 43 | } 44 | 45 | .dark { 46 | --background: oklch(0.145 0 0); 47 | --foreground: oklch(0.985 0 0); 48 | --card: oklch(0.145 0 0); 49 | --card-foreground: oklch(0.985 0 0); 50 | --popover: oklch(0.145 0 0); 51 | --popover-foreground: oklch(0.985 0 0); 52 | --primary: oklch(0.985 0 0); 53 | --primary-foreground: oklch(0.205 0 0); 54 | --secondary: oklch(0.269 0 0); 55 | --secondary-foreground: oklch(0.985 0 0); 56 | --muted: oklch(0.269 0 0); 57 | --muted-foreground: oklch(0.708 0 0); 58 | --accent: oklch(0.269 0 0); 59 | --accent-foreground: oklch(0.985 0 0); 60 | --destructive: oklch(0.396 0.141 25.723); 61 | --destructive-foreground: oklch(0.637 0.237 25.331); 62 | --border: oklch(0.269 0 0); 63 | --input: oklch(0.269 0 0); 64 | --ring: oklch(0.439 0 0); 65 | --chart-1: oklch(0.488 0.243 264.376); 66 | --chart-2: oklch(0.696 0.17 162.48); 67 | --chart-3: oklch(0.769 0.188 70.08); 68 | --chart-4: oklch(0.627 0.265 303.9); 69 | --chart-5: oklch(0.645 0.246 16.439); 70 | --sidebar: oklch(0.205 0 0); 71 | --sidebar-foreground: oklch(0.985 0 0); 72 | --sidebar-primary: oklch(0.488 0.243 264.376); 73 | --sidebar-primary-foreground: oklch(0.985 0 0); 74 | --sidebar-accent: oklch(0.269 0 0); 75 | --sidebar-accent-foreground: oklch(0.985 0 0); 76 | --sidebar-border: oklch(0.269 0 0); 77 | --sidebar-ring: oklch(0.439 0 0); 78 | } 79 | 80 | @theme inline { 81 | --color-background: var(--background); 82 | --color-foreground: var(--foreground); 83 | --color-card: var(--card); 84 | --color-card-foreground: var(--card-foreground); 85 | --color-popover: var(--popover); 86 | --color-popover-foreground: var(--popover-foreground); 87 | --color-primary: var(--primary); 88 | --color-primary-foreground: var(--primary-foreground); 89 | --color-secondary: var(--secondary); 90 | --color-secondary-foreground: var(--secondary-foreground); 91 | --color-muted: var(--muted); 92 | --color-muted-foreground: var(--muted-foreground); 93 | --color-accent: var(--accent); 94 | --color-accent-foreground: var(--accent-foreground); 95 | --color-destructive: var(--destructive); 96 | --color-destructive-foreground: var(--destructive-foreground); 97 | --color-border: var(--border); 98 | --color-input: var(--input); 99 | --color-ring: var(--ring); 100 | --color-chart-1: var(--chart-1); 101 | --color-chart-2: var(--chart-2); 102 | --color-chart-3: var(--chart-3); 103 | --color-chart-4: var(--chart-4); 104 | --color-chart-5: var(--chart-5); 105 | --radius-sm: calc(var(--radius) - 4px); 106 | --radius-md: calc(var(--radius) - 2px); 107 | --radius-lg: var(--radius); 108 | --radius-xl: calc(var(--radius) + 4px); 109 | --color-sidebar: var(--sidebar); 110 | --color-sidebar-foreground: var(--sidebar-foreground); 111 | --color-sidebar-primary: var(--sidebar-primary); 112 | --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 113 | --color-sidebar-accent: var(--sidebar-accent); 114 | --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 115 | --color-sidebar-border: var(--sidebar-border); 116 | --color-sidebar-ring: var(--sidebar-ring); 117 | } 118 | 119 | @layer base { 120 | * { 121 | @apply border-border; 122 | } 123 | 124 | html { 125 | @apply scroll-smooth; 126 | } 127 | 128 | body { 129 | @apply bg-background text-foreground; 130 | 131 | font-family: var(--font-geist-sans), sans-serif; 132 | } 133 | } -------------------------------------------------------------------------------- /apps/www/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "baseUrl": ".", 16 | "paths": { 17 | "@/*": ["./src/*"], 18 | "@/source": ["./.source/index.ts"] 19 | }, 20 | "plugins": [ 21 | { 22 | "name": "next" 23 | } 24 | ], 25 | "target": "ES2017" 26 | }, 27 | "include": [ 28 | "next-env.d.ts", 29 | "**/*.ts", 30 | "**/*.tsx", 31 | ".next/types/**/*.ts", 32 | ".contentlayer/generated" 33 | ], 34 | "exclude": ["node_modules"] 35 | } 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nestjs-yookassa", 3 | "version": "0.0.4", 4 | "private": true, 5 | "license": "MIT", 6 | "author": { 7 | "name": "TeaCoder", 8 | "url": "https://teacoder.ru" 9 | }, 10 | "workspaces": [ 11 | "apps/*", 12 | "packages/*" 13 | ], 14 | "scripts": { 15 | "dev": "turbo run dev", 16 | "build": "turbo run build", 17 | "dev:www": "turbo run dev --filter=www", 18 | "build:www": "turbo run build --filter=www", 19 | "build:packages": "turbo run build --filter=packages/*", 20 | "publish:packages": "npm run build:packages && lerna publish", 21 | "update": "npm update", 22 | "upgrade:all": "npm i -g npm-check-updates && ncu -u && npm install" 23 | }, 24 | "devDependencies": { 25 | "turbo": "^2.3.1" 26 | }, 27 | "packageManager": "pnpm@9.14.4", 28 | "engines": { 29 | "node": ">= 18.17.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module', 6 | }, 7 | plugins: ['@typescript-eslint/eslint-plugin'], 8 | extends: [ 9 | 'plugin:@typescript-eslint/eslint-recommended', 10 | 'plugin:@typescript-eslint/recommended', 11 | 'prettier', 12 | 'prettier/@typescript-eslint', 13 | ], 14 | root: true, 15 | env: { 16 | node: true, 17 | jest: true, 18 | }, 19 | rules: { 20 | '@typescript-eslint/interface-name-prefix': 'off', 21 | '@typescript-eslint/explicit-function-return-type': 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | '@typescript-eslint/no-use-before-define': 'off', 24 | '@typescript-eslint/no-non-null-assertion': 'off', 25 | }, 26 | }; -------------------------------------------------------------------------------- /packages/nestjs-yookassa/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | node_modules 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | pnpm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # OS 14 | .DS_Store 15 | 16 | # Tests 17 | /coverage 18 | /.nyc_output 19 | 20 | # IDEs and editors 21 | /.idea 22 | .project 23 | .classpath 24 | .c9/ 25 | *.launch 26 | .settings/ 27 | *.sublime-workspace 28 | 29 | # IDE - VSCode 30 | .vscode/* 31 | !.vscode/settings.json 32 | !.vscode/tasks.json 33 | !.vscode/launch.json 34 | !.vscode/extensions.json -------------------------------------------------------------------------------- /packages/nestjs-yookassa/.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | .github 4 | lib 5 | .vitepress/cache 6 | .vitepress/dist 7 | docs-api 8 | .commitlintrc.json 9 | .eslintrc.js 10 | .prettierrc 11 | package-lock.json 12 | renovate.json 13 | tsconfig.json 14 | tsconfig.typedoc.json -------------------------------------------------------------------------------- /packages/nestjs-yookassa/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "none", 3 | "tabWidth": 4, 4 | "useTabs": true, 5 | "semi": false, 6 | "singleQuote": true, 7 | "jsxSingleQuote": true, 8 | "arrowParens": "avoid" 9 | } 10 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/README.md: -------------------------------------------------------------------------------- 1 | # NestJS Yookassa 2 | 3 | С помощью этого модуля вы сможете легко создавать и управлять платежами, получать подробную информацию о транзакциях и многое другое. 4 | 5 | Документация со всеми подробностями и примерами доступна на [nestjs-yookassa.ru](https://nestjs-yookassa.ru) 6 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces'; 2 | export * from './services'; 3 | export * from './yookassa.constants'; 4 | export * from './yookassa.module'; 5 | export * from './yookassa.service'; 6 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 14 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 15 | }; 16 | Object.defineProperty(exports, "__esModule", { value: true }); 17 | __exportStar(require("./interfaces"), exports); 18 | __exportStar(require("./services"), exports); 19 | __exportStar(require("./yookassa.constants"), exports); 20 | __exportStar(require("./yookassa.module"), exports); 21 | __exportStar(require("./yookassa.service"), exports); 22 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/common.interface.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Перечисление поддерживаемых локалей. 3 | * Каждая локаль представляет собой комбинацию языка и страны. 4 | * @enum {string} 5 | */ 6 | export declare enum LocaleEnum { 7 | /** 8 | * Русский язык. 9 | */ 10 | ru_RU = "ru_RU", 11 | /** 12 | * Английский язык. 13 | */ 14 | en_US = "en_US" 15 | } 16 | /** 17 | * Перечисление поддерживаемых валют. 18 | * Каждая валюта представлена в виде трехбуквенного кода. 19 | * @enum {string} 20 | */ 21 | export declare enum CurrencyEnum { 22 | USD = "USD",// Доллар США 23 | CAD = "CAD",// Канадский доллар 24 | EUR = "EUR",// Евро 25 | AED = "AED",// Дирхам ОАЭ 26 | AFN = "AFN",// Афгани 27 | ALL = "ALL",// Албанский лек 28 | AMD = "AMD",// Армянский драм 29 | ARS = "ARS",// Аргентинский песо 30 | AUD = "AUD",// Австралийский доллар 31 | AZN = "AZN",// Азербайджанский манат 32 | BAM = "BAM",// Конвертируемая марка (Босния и Герцеговина) 33 | BDT = "BDT",// Бангладешская така 34 | BGN = "BGN",// Болгарский лев 35 | BHD = "BHD",// Бахрейнский динар 36 | BIF = "BIF",// Бурундийский франк 37 | BND = "BND",// Брунейский доллар 38 | BOB = "BOB",// Боливийский боливиано 39 | BRL = "BRL",// Бразильский реал 40 | BWP = "BWP",// Ботсванская пула 41 | BYN = "BYN",// Белорусский рубль 42 | BZD = "BZD",// Белизский доллар 43 | CDF = "CDF",// Конголезский франк 44 | CHF = "CHF",// Швейцарский франк 45 | CLP = "CLP",// Чилийский песо 46 | CNY = "CNY",// Китайский юань 47 | COP = "COP",// Колумбийский песо 48 | CRC = "CRC",// Коста-риканский колон 49 | CVE = "CVE",// Эскудо Кабо-Верде 50 | CZK = "CZK",// Чешская крона 51 | DJF = "DJF",// Франк Джибути 52 | DKK = "DKK",// Датская крона 53 | DOP = "DOP",// Доминиканский песо 54 | DZD = "DZD",// Алжирский динар 55 | EEK = "EEK",// Эстонская крона 56 | EGP = "EGP",// Египетский фунт 57 | ERN = "ERN",// Эритрейская накфа 58 | ETB = "ETB",// Эфиопский бирр 59 | GBP = "GBP",// Фунт стерлингов 60 | GEL = "GEL",// Грузинский лари 61 | GHS = "GHS",// Ганский седи 62 | GNF = "GNF",// Гвинейский франк 63 | GTQ = "GTQ",// Гватемальский кетсаль 64 | HKD = "HKD",// Гонконгский доллар 65 | HNL = "HNL",// Гондурасская лемпира 66 | HRK = "HRK",// Хорватская куна 67 | HUF = "HUF",// Венгерский форинт 68 | IDR = "IDR",// Индонезийская рупия 69 | ILS = "ILS",// Израильский шекель 70 | INR = "INR",// Индийская рупия 71 | IQD = "IQD",// Иракский динар 72 | IRR = "IRR",// Иранский риал 73 | ISK = "ISK",// Исландская крона 74 | JMD = "JMD",// Ямайский доллар 75 | JOD = "JOD",// Иорданский динар 76 | JPY = "JPY",// Японская иена 77 | KES = "KES",// Кенийский шиллинг 78 | KHR = "KHR",// Камбоджийский риель 79 | KMF = "KMF",// Франк Коморских островов 80 | KRW = "KRW",// Южнокорейская вона 81 | KWD = "KWD",// Кувейтский динар 82 | KZT = "KZT",// Казахстанский тенге 83 | LBP = "LBP",// Ливанский фунт 84 | LKR = "LKR",// Шри-ланкийская рупия 85 | LTL = "LTL",// Литовский лит 86 | LVL = "LVL",// Латвийский лат 87 | LYD = "LYD",// Ливийский динар 88 | MAD = "MAD",// Марокканский дирхам 89 | MDL = "MDL",// Молдавский лей 90 | MGA = "MGA",// Мадагаскарский ариари 91 | MKD = "MKD",// Македонский денар 92 | MMK = "MMK",// Мьянмский кьят 93 | MOP = "MOP",// Патака Макао 94 | MUR = "MUR",// Маврикийская рупия 95 | MXN = "MXN",// Мексиканское песо 96 | MYR = "MYR",// Малайзийский ринггит 97 | MZN = "MZN",// Мозамбикское метикал 98 | NAD = "NAD",// Намибийский доллар 99 | NGN = "NGN",// Нигерийская найра 100 | NIO = "NIO",// Никарагуанская кордоба 101 | NOK = "NOK",// Норвежская крона 102 | NPR = "NPR",// Непальская рупия 103 | NZD = "NZD",// Новозеландский доллар 104 | OMR = "OMR",// Оманский риал 105 | PAB = "PAB",// Панамский балбоа 106 | PEN = "PEN",// Перуанский соль 107 | PHP = "PHP",// Филиппинское песо 108 | PKR = "PKR",// Пакистанская рупия 109 | PLN = "PLN",// Польский злотый 110 | PYG = "PYG",// Парагвайский гуарани 111 | QAR = "QAR",// Катарский риал 112 | RON = "RON",// Румынский лей 113 | RSD = "RSD",// Сербский динар 114 | RUB = "RUB",// Российский рубль 115 | RWF = "RWF",// Руандийский франк 116 | SAR = "SAR",// Саудовский риал 117 | SDG = "SDG",// Суданский фунт 118 | SEK = "SEK",// Шведская крона 119 | SGD = "SGD",// Сингапурский доллар 120 | SOS = "SOS",// Сомалийский шиллинг 121 | SYP = "SYP",// Сирийский фунт 122 | THB = "THB",// Таиландский бат 123 | TND = "TND",// Тунисский динар 124 | TOP = "TOP",// Тонгана паанга 125 | TRY = "TRY",// Турецкая лира 126 | TTD = "TTD",// Тринидад и Тобаго доллар 127 | TWD = "TWD",// Новый тайваньский доллар 128 | TZS = "TZS",// Танзанийский шиллинг 129 | UAH = "UAH",// Украинская гривна 130 | UGX = "UGX",// Угандийский шиллинг 131 | UYU = "UYU",// Уругвайское песо 132 | UZS = "UZS",// Узбекский сум 133 | VEF = "VEF",// Венесуэльский боливар 134 | VND = "VND",// Вьетнамский донг 135 | XAF = "XAF",// Франк Центральноафриканского CFA 136 | XOF = "XOF",// Франк Западноафриканского CFA 137 | YER = "YER",// Йеменский риал 138 | ZAR = "ZAR",// Южноафриканский рэнд 139 | ZMK = "ZMK",// Замбийская квача 140 | ZWL = "ZWL" 141 | } 142 | /** 143 | * Тип, представляющий сумму и валюту для платежа. 144 | */ 145 | export interface Amount { 146 | /** 147 | * Значение суммы. 148 | */ 149 | value: number; 150 | /** 151 | * Валюта суммы, представленная кодом валюты из перечисления `CurrencyEnum`. 152 | */ 153 | currency: CurrencyEnum; 154 | } 155 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/common.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.CurrencyEnum = exports.LocaleEnum = void 0; 4 | /** 5 | * Перечисление поддерживаемых локалей. 6 | * Каждая локаль представляет собой комбинацию языка и страны. 7 | * @enum {string} 8 | */ 9 | var LocaleEnum; 10 | (function (LocaleEnum) { 11 | /** 12 | * Русский язык. 13 | */ 14 | LocaleEnum["ru_RU"] = "ru_RU"; 15 | /** 16 | * Английский язык. 17 | */ 18 | LocaleEnum["en_US"] = "en_US"; 19 | })(LocaleEnum || (exports.LocaleEnum = LocaleEnum = {})); 20 | /** 21 | * Перечисление поддерживаемых валют. 22 | * Каждая валюта представлена в виде трехбуквенного кода. 23 | * @enum {string} 24 | */ 25 | var CurrencyEnum; 26 | (function (CurrencyEnum) { 27 | CurrencyEnum["USD"] = "USD"; 28 | CurrencyEnum["CAD"] = "CAD"; 29 | CurrencyEnum["EUR"] = "EUR"; 30 | CurrencyEnum["AED"] = "AED"; 31 | CurrencyEnum["AFN"] = "AFN"; 32 | CurrencyEnum["ALL"] = "ALL"; 33 | CurrencyEnum["AMD"] = "AMD"; 34 | CurrencyEnum["ARS"] = "ARS"; 35 | CurrencyEnum["AUD"] = "AUD"; 36 | CurrencyEnum["AZN"] = "AZN"; 37 | CurrencyEnum["BAM"] = "BAM"; 38 | CurrencyEnum["BDT"] = "BDT"; 39 | CurrencyEnum["BGN"] = "BGN"; 40 | CurrencyEnum["BHD"] = "BHD"; 41 | CurrencyEnum["BIF"] = "BIF"; 42 | CurrencyEnum["BND"] = "BND"; 43 | CurrencyEnum["BOB"] = "BOB"; 44 | CurrencyEnum["BRL"] = "BRL"; 45 | CurrencyEnum["BWP"] = "BWP"; 46 | CurrencyEnum["BYN"] = "BYN"; 47 | CurrencyEnum["BZD"] = "BZD"; 48 | CurrencyEnum["CDF"] = "CDF"; 49 | CurrencyEnum["CHF"] = "CHF"; 50 | CurrencyEnum["CLP"] = "CLP"; 51 | CurrencyEnum["CNY"] = "CNY"; 52 | CurrencyEnum["COP"] = "COP"; 53 | CurrencyEnum["CRC"] = "CRC"; 54 | CurrencyEnum["CVE"] = "CVE"; 55 | CurrencyEnum["CZK"] = "CZK"; 56 | CurrencyEnum["DJF"] = "DJF"; 57 | CurrencyEnum["DKK"] = "DKK"; 58 | CurrencyEnum["DOP"] = "DOP"; 59 | CurrencyEnum["DZD"] = "DZD"; 60 | CurrencyEnum["EEK"] = "EEK"; 61 | CurrencyEnum["EGP"] = "EGP"; 62 | CurrencyEnum["ERN"] = "ERN"; 63 | CurrencyEnum["ETB"] = "ETB"; 64 | CurrencyEnum["GBP"] = "GBP"; 65 | CurrencyEnum["GEL"] = "GEL"; 66 | CurrencyEnum["GHS"] = "GHS"; 67 | CurrencyEnum["GNF"] = "GNF"; 68 | CurrencyEnum["GTQ"] = "GTQ"; 69 | CurrencyEnum["HKD"] = "HKD"; 70 | CurrencyEnum["HNL"] = "HNL"; 71 | CurrencyEnum["HRK"] = "HRK"; 72 | CurrencyEnum["HUF"] = "HUF"; 73 | CurrencyEnum["IDR"] = "IDR"; 74 | CurrencyEnum["ILS"] = "ILS"; 75 | CurrencyEnum["INR"] = "INR"; 76 | CurrencyEnum["IQD"] = "IQD"; 77 | CurrencyEnum["IRR"] = "IRR"; 78 | CurrencyEnum["ISK"] = "ISK"; 79 | CurrencyEnum["JMD"] = "JMD"; 80 | CurrencyEnum["JOD"] = "JOD"; 81 | CurrencyEnum["JPY"] = "JPY"; 82 | CurrencyEnum["KES"] = "KES"; 83 | CurrencyEnum["KHR"] = "KHR"; 84 | CurrencyEnum["KMF"] = "KMF"; 85 | CurrencyEnum["KRW"] = "KRW"; 86 | CurrencyEnum["KWD"] = "KWD"; 87 | CurrencyEnum["KZT"] = "KZT"; 88 | CurrencyEnum["LBP"] = "LBP"; 89 | CurrencyEnum["LKR"] = "LKR"; 90 | CurrencyEnum["LTL"] = "LTL"; 91 | CurrencyEnum["LVL"] = "LVL"; 92 | CurrencyEnum["LYD"] = "LYD"; 93 | CurrencyEnum["MAD"] = "MAD"; 94 | CurrencyEnum["MDL"] = "MDL"; 95 | CurrencyEnum["MGA"] = "MGA"; 96 | CurrencyEnum["MKD"] = "MKD"; 97 | CurrencyEnum["MMK"] = "MMK"; 98 | CurrencyEnum["MOP"] = "MOP"; 99 | CurrencyEnum["MUR"] = "MUR"; 100 | CurrencyEnum["MXN"] = "MXN"; 101 | CurrencyEnum["MYR"] = "MYR"; 102 | CurrencyEnum["MZN"] = "MZN"; 103 | CurrencyEnum["NAD"] = "NAD"; 104 | CurrencyEnum["NGN"] = "NGN"; 105 | CurrencyEnum["NIO"] = "NIO"; 106 | CurrencyEnum["NOK"] = "NOK"; 107 | CurrencyEnum["NPR"] = "NPR"; 108 | CurrencyEnum["NZD"] = "NZD"; 109 | CurrencyEnum["OMR"] = "OMR"; 110 | CurrencyEnum["PAB"] = "PAB"; 111 | CurrencyEnum["PEN"] = "PEN"; 112 | CurrencyEnum["PHP"] = "PHP"; 113 | CurrencyEnum["PKR"] = "PKR"; 114 | CurrencyEnum["PLN"] = "PLN"; 115 | CurrencyEnum["PYG"] = "PYG"; 116 | CurrencyEnum["QAR"] = "QAR"; 117 | CurrencyEnum["RON"] = "RON"; 118 | CurrencyEnum["RSD"] = "RSD"; 119 | CurrencyEnum["RUB"] = "RUB"; 120 | CurrencyEnum["RWF"] = "RWF"; 121 | CurrencyEnum["SAR"] = "SAR"; 122 | CurrencyEnum["SDG"] = "SDG"; 123 | CurrencyEnum["SEK"] = "SEK"; 124 | CurrencyEnum["SGD"] = "SGD"; 125 | CurrencyEnum["SOS"] = "SOS"; 126 | CurrencyEnum["SYP"] = "SYP"; 127 | CurrencyEnum["THB"] = "THB"; 128 | CurrencyEnum["TND"] = "TND"; 129 | CurrencyEnum["TOP"] = "TOP"; 130 | CurrencyEnum["TRY"] = "TRY"; 131 | CurrencyEnum["TTD"] = "TTD"; 132 | CurrencyEnum["TWD"] = "TWD"; 133 | CurrencyEnum["TZS"] = "TZS"; 134 | CurrencyEnum["UAH"] = "UAH"; 135 | CurrencyEnum["UGX"] = "UGX"; 136 | CurrencyEnum["UYU"] = "UYU"; 137 | CurrencyEnum["UZS"] = "UZS"; 138 | CurrencyEnum["VEF"] = "VEF"; 139 | CurrencyEnum["VND"] = "VND"; 140 | CurrencyEnum["XAF"] = "XAF"; 141 | CurrencyEnum["XOF"] = "XOF"; 142 | CurrencyEnum["YER"] = "YER"; 143 | CurrencyEnum["ZAR"] = "ZAR"; 144 | CurrencyEnum["ZMK"] = "ZMK"; 145 | CurrencyEnum["ZWL"] = "ZWL"; // Зимбабвийский доллар 146 | })(CurrencyEnum || (exports.CurrencyEnum = CurrencyEnum = {})); 147 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/confirmation.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { LocaleEnum } from './common.interface'; 2 | /** 3 | * Тип подтверждения, который может быть одним из нескольких типов. 4 | * @type {ConfirmationRedirect | ConfirmationEmbedded | ConfirmationQR | ConfirmationExternal | ConfirmationMobileApp} 5 | */ 6 | export type Confirmation = ConfirmationEmbedded | ConfirmationExternal | ConfirmationMobileApp | ConfirmationQR | ConfirmationRedirect; 7 | /** 8 | * Перечисление типов подтверждений платежа. 9 | * Эти типы могут быть использованы для различных способов подтверждения транзакций. 10 | * @enum {string} 11 | */ 12 | export declare enum ConfirmationEnum { 13 | /** 14 | * Встроенная форма подтверждения. 15 | */ 16 | embedded = "embedded", 17 | /** 18 | * Внешняя форма подтверждения. 19 | */ 20 | external = "external", 21 | /** 22 | * Подтверждение через мобильное приложение. 23 | */ 24 | mobile_application = "mobile_application", 25 | /** 26 | * Подтверждение через QR код. 27 | */ 28 | qr = "qr", 29 | /** 30 | * Подтверждение через редирект на внешний сайт. 31 | */ 32 | redirect = "redirect" 33 | } 34 | /** 35 | * Тип для подтверждения через встроенную форму. 36 | * Используется при встроенном подтверждении внутри текущего приложения. 37 | */ 38 | export interface ConfirmationEmbedded { 39 | /** 40 | * Тип подтверждения — встроенная форма. 41 | */ 42 | type: ConfirmationEnum.embedded; 43 | /** 44 | * Локализация, которая должна быть использована. 45 | * Необязательное поле. 46 | */ 47 | locale?: LocaleEnum; 48 | } 49 | /** 50 | * Тип для подтверждения через внешний источник. 51 | */ 52 | export interface ConfirmationExternal { 53 | /** 54 | * Тип подтверждения — внешний источник. 55 | */ 56 | type: ConfirmationEnum.external; 57 | /** 58 | * Локализация, которая должна быть использована. 59 | * Необязательное поле. 60 | */ 61 | locale?: LocaleEnum; 62 | } 63 | /** 64 | * Тип для подтверждения через мобильное приложение. 65 | */ 66 | export interface ConfirmationMobileApp { 67 | /** 68 | * Тип подтверждения — мобильное приложение. 69 | */ 70 | type: ConfirmationEnum.mobile_application; 71 | /** 72 | * Локализация, которая должна быть использована. 73 | * Необязательное поле. 74 | */ 75 | locale?: LocaleEnum; 76 | /** 77 | * URL возврата после подтверждения. 78 | */ 79 | return_url: string; 80 | } 81 | /** 82 | * Тип для подтверждения через QR код. 83 | */ 84 | export interface ConfirmationQR { 85 | /** 86 | * Тип подтверждения — QR код. 87 | */ 88 | type: ConfirmationEnum.qr; 89 | /** 90 | * Локализация, которая должна быть использована. 91 | * Необязательное поле. 92 | */ 93 | locale?: LocaleEnum; 94 | /** 95 | * URL возврата после подтверждения. 96 | */ 97 | return_url: string; 98 | } 99 | /** 100 | * Тип для подтверждения через редирект. 101 | * Используется при необходимости перенаправить пользователя на внешний URL для подтверждения. 102 | */ 103 | export interface ConfirmationRedirect { 104 | /** 105 | * Тип подтверждения — редирект. 106 | */ 107 | type: ConfirmationEnum.redirect; 108 | /** 109 | * Принудительное подтверждение. 110 | * Необязательное поле. 111 | */ 112 | enforce?: boolean; 113 | /** 114 | * Локализация, которая должна быть использована. 115 | * Необязательное поле. 116 | */ 117 | locale?: LocaleEnum; 118 | /** 119 | * URL возврата после подтверждения. 120 | */ 121 | return_url: string; 122 | } 123 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/confirmation.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.ConfirmationEnum = void 0; 4 | /** 5 | * Перечисление типов подтверждений платежа. 6 | * Эти типы могут быть использованы для различных способов подтверждения транзакций. 7 | * @enum {string} 8 | */ 9 | var ConfirmationEnum; 10 | (function (ConfirmationEnum) { 11 | /** 12 | * Встроенная форма подтверждения. 13 | */ 14 | ConfirmationEnum["embedded"] = "embedded"; 15 | /** 16 | * Внешняя форма подтверждения. 17 | */ 18 | ConfirmationEnum["external"] = "external"; 19 | /** 20 | * Подтверждение через мобильное приложение. 21 | */ 22 | ConfirmationEnum["mobile_application"] = "mobile_application"; 23 | /** 24 | * Подтверждение через QR код. 25 | */ 26 | ConfirmationEnum["qr"] = "qr"; 27 | /** 28 | * Подтверждение через редирект на внешний сайт. 29 | */ 30 | ConfirmationEnum["redirect"] = "redirect"; 31 | })(ConfirmationEnum || (exports.ConfirmationEnum = ConfirmationEnum = {})); 32 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './common.interface'; 2 | export * from './yookassa-options.interface'; 3 | export * from './confirmation.interface'; 4 | export * from './payment-details.interface'; 5 | export * from './payment-method.interface'; 6 | export * from './payment-request.interface'; 7 | export * from './refund-details.interface'; 8 | export * from './refund-request.interface'; 9 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 14 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 15 | }; 16 | Object.defineProperty(exports, "__esModule", { value: true }); 17 | __exportStar(require("./common.interface"), exports); 18 | __exportStar(require("./yookassa-options.interface"), exports); 19 | // export * from './receipt-details.interface' 20 | // export * from './receipt-request.interface' 21 | __exportStar(require("./confirmation.interface"), exports); 22 | __exportStar(require("./payment-details.interface"), exports); 23 | __exportStar(require("./payment-method.interface"), exports); 24 | __exportStar(require("./payment-request.interface"), exports); 25 | __exportStar(require("./refund-details.interface"), exports); 26 | __exportStar(require("./refund-request.interface"), exports); 27 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/payment-details.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.TransferStatusEnum = exports.CancellationReasonEnum = exports.CancellationPartyEnum = exports.PaymentStatusEnum = void 0; 4 | /** 5 | * Перечисление возможных статусов платежа. 6 | * @enum {string} 7 | */ 8 | var PaymentStatusEnum; 9 | (function (PaymentStatusEnum) { 10 | /** 11 | * Платеж ожидает обработки. 12 | */ 13 | PaymentStatusEnum["PENDING"] = "pending"; 14 | /** 15 | * Платеж ожидает захвата. 16 | */ 17 | PaymentStatusEnum["WAITING_FOR_CAPTURE"] = "waiting_for_capture"; 18 | /** 19 | * Платеж успешно завершен. 20 | */ 21 | PaymentStatusEnum["SUCCEEDED"] = "succeeded"; 22 | /** 23 | * Платеж отменен. 24 | */ 25 | PaymentStatusEnum["CANCELED"] = "canceled"; 26 | })(PaymentStatusEnum || (exports.PaymentStatusEnum = PaymentStatusEnum = {})); 27 | /** 28 | * Инициаторы отмены платежа. 29 | */ 30 | var CancellationPartyEnum; 31 | (function (CancellationPartyEnum) { 32 | /** 33 | * Продавец товаров и услуг (вы). 34 | */ 35 | CancellationPartyEnum["MERCHANT"] = "merchant"; 36 | /** 37 | * ЮKassa. 38 | */ 39 | CancellationPartyEnum["YOO_MONEY"] = "yoo_money"; 40 | /** 41 | * Любые участники процесса платежа, кроме ЮKassa и продавца 42 | * (например, эмитент, сторонний платежный сервис). 43 | */ 44 | CancellationPartyEnum["PAYMENT_NETWORK"] = "payment_network"; 45 | })(CancellationPartyEnum || (exports.CancellationPartyEnum = CancellationPartyEnum = {})); 46 | /** 47 | * Причины отмены платежа. 48 | */ 49 | var CancellationReasonEnum; 50 | (function (CancellationReasonEnum) { 51 | /** Не пройдена аутентификация по 3-D Secure. */ 52 | CancellationReasonEnum["THREE_D_SECURE_FAILED"] = "3d_secure_failed"; 53 | /** Оплата данным платежным средством отклонена по неизвестным причинам. */ 54 | CancellationReasonEnum["CALL_ISSUER"] = "call_issuer"; 55 | /** Платеж отменен по API при оплате в две стадии. */ 56 | CancellationReasonEnum["CANCELED_BY_MERCHANT"] = "canceled_by_merchant"; 57 | /** Истек срок действия банковской карты. */ 58 | CancellationReasonEnum["CARD_EXPIRED"] = "card_expired"; 59 | /** Запрет оплаты банковской картой, выпущенной в этой стране. */ 60 | CancellationReasonEnum["COUNTRY_FORBIDDEN"] = "country_forbidden"; 61 | /** Закончился срок жизни сделки (для безопасной сделки). */ 62 | CancellationReasonEnum["DEAL_EXPIRED"] = "deal_expired"; 63 | /** Истек срок списания оплаты у двухстадийного платежа. */ 64 | CancellationReasonEnum["EXPIRED_ON_CAPTURE"] = "expired_on_capture"; 65 | /** Истек срок оплаты: пользователь не подтвердил платеж вовремя. */ 66 | CancellationReasonEnum["EXPIRED_ON_CONFIRMATION"] = "expired_on_confirmation"; 67 | /** Платеж заблокирован из-за подозрения в мошенничестве. */ 68 | CancellationReasonEnum["FRAUD_SUSPECTED"] = "fraud_suspected"; 69 | /** Причина не детализирована. */ 70 | CancellationReasonEnum["GENERAL_DECLINE"] = "general_decline"; 71 | /** Превышены ограничения на платежи для кошелька ЮMoney. */ 72 | CancellationReasonEnum["IDENTIFICATION_REQUIRED"] = "identification_required"; 73 | /** Не хватает денег для оплаты. */ 74 | CancellationReasonEnum["INSUFFICIENT_FUNDS"] = "insufficient_funds"; 75 | /** Технические неполадки на стороне ЮKassa. */ 76 | CancellationReasonEnum["INTERNAL_TIMEOUT"] = "internal_timeout"; 77 | /** Неправильно указан номер карты. */ 78 | CancellationReasonEnum["INVALID_CARD_NUMBER"] = "invalid_card_number"; 79 | /** Неправильно указан код CVV2 (CVC2, CID). */ 80 | CancellationReasonEnum["INVALID_CSC"] = "invalid_csc"; 81 | /** Организация, выпустившая платежное средство, недоступна. */ 82 | CancellationReasonEnum["ISSUER_UNAVAILABLE"] = "issuer_unavailable"; 83 | /** Исчерпан лимит платежей для данного платежного средства или магазина. */ 84 | CancellationReasonEnum["PAYMENT_METHOD_LIMIT_EXCEEDED"] = "payment_method_limit_exceeded"; 85 | /** Запрещены операции данным платежным средством. */ 86 | CancellationReasonEnum["PAYMENT_METHOD_RESTRICTED"] = "payment_method_restricted"; 87 | /** Пользователь отозвал разрешение на автоплатежи. */ 88 | CancellationReasonEnum["PERMISSION_REVOKED"] = "permission_revoked"; 89 | /** Нельзя заплатить с номера телефона этого мобильного оператора. */ 90 | CancellationReasonEnum["UNSUPPORTED_MOBILE_OPERATOR"] = "unsupported_mobile_operator"; 91 | })(CancellationReasonEnum || (exports.CancellationReasonEnum = CancellationReasonEnum = {})); 92 | /** 93 | * Статусы распределения денег между магазинами. 94 | */ 95 | var TransferStatusEnum; 96 | (function (TransferStatusEnum) { 97 | /** Ожидает обработки. */ 98 | TransferStatusEnum["PENDING"] = "pending"; 99 | /** Ожидает подтверждения списания. */ 100 | TransferStatusEnum["WAITING_FOR_CAPTURE"] = "waiting_for_capture"; 101 | /** Успешно завершено. */ 102 | TransferStatusEnum["SUCCEEDED"] = "succeeded"; 103 | /** Отменено. */ 104 | TransferStatusEnum["CANCELED"] = "canceled"; 105 | })(TransferStatusEnum || (exports.TransferStatusEnum = TransferStatusEnum = {})); 106 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/payment-method.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface'; 2 | /** 3 | * Тип для метода оплаты, который может быть одним из нескольких типов. 4 | * @type {PaymentMethodSberLoan | PaymentMethodMobileBalance | PaymentMethodCard | PaymentMethodCash | PaymentMethodSbp | PaymentMethodB2bSberbank | PaymentMethodElectronicСertificate | PaymentMethodYooMoney | PaymentMethodSberbank | PaymentMethodTinkoffBank} 5 | */ 6 | export type PaymentMethod = PaymentMethodSberLoan | PaymentMethodMobileBalance | PaymentMethodCard | PaymentMethodCash | PaymentMethodSbp | PaymentMethodB2bSberbank | PaymentMethodElectronicСertificate | PaymentMethodYooMoney | PaymentMethodSberbank | PaymentMethodTinkoffBank; 7 | /** 8 | * Перечисление возможных методов оплаты. 9 | * Каждый метод оплаты представлен уникальным типом. 10 | * @enum {string} 11 | */ 12 | export declare enum PaymentMethodsEnum { 13 | /** 14 | * «Покупки в кредит» от СберБанка 15 | */ 16 | sber_loan = "sber_loan", 17 | /** 18 | * Баланс мобильного телефона 19 | */ 20 | mobile_balance = "mobile_balance", 21 | /** 22 | * Банковская карта 23 | */ 24 | bank_card = "bank_card", 25 | /** 26 | * Наличные 27 | */ 28 | cash = "cash", 29 | /** 30 | * Система быстрых платежей 31 | */ 32 | sbp = "sbp", 33 | /** 34 | * B2B Сбербанк 35 | */ 36 | b2b_sberbank = "b2b_sberbank", 37 | /** 38 | * Электронный сертификат 39 | */ 40 | electronic_certificate = "electronic_certificate", 41 | /** 42 | * YooMoney 43 | */ 44 | yoo_money = "yoo_money", 45 | /** 46 | * Сбербанк 47 | */ 48 | sberbank = "sberbank", 49 | /** 50 | * Альфа-Банк 51 | */ 52 | alfabank = "alfabank", 53 | /** 54 | * Тинькофф Банк 55 | */ 56 | tinkoff_bank = "tinkoff_bank" 57 | } 58 | export interface PaymentMethodSberLoan { 59 | /** 60 | * Тип метода — «Покупки в кредит» от СберБанка 61 | */ 62 | type: PaymentMethodsEnum.sber_loan; 63 | } 64 | /** 65 | * Тип, представляющий способ оплаты через баланс мобильного телефона. 66 | */ 67 | export interface PaymentMethodMobileBalance { 68 | /** 69 | * Тип метода — мобильный баланс 70 | */ 71 | type: PaymentMethodsEnum.mobile_balance; 72 | /** 73 | * Номер телефона, с которого будет списана сумма. 74 | * Указывается в формате ITU-T E.164, например 79000000000. 75 | */ 76 | phone: string; 77 | } 78 | /** 79 | * Тип, представляющий способ оплаты с использованием банковской карты. 80 | */ 81 | export interface PaymentMethodCard { 82 | /** 83 | * Тип метода — банковская карта 84 | */ 85 | type: PaymentMethodsEnum.bank_card; 86 | /** 87 | * Данные банковской карты (необходимы, если вы собираете данные карты пользователей на своей стороне). 88 | */ 89 | card?: { 90 | /** 91 | * Номер карты. 92 | */ 93 | number: string; 94 | /** 95 | * Год истечения срока действия карты. 96 | * Необязательное поле. 97 | */ 98 | expiry_year?: string; 99 | /** 100 | * Месяц истечения срока действия. 101 | */ 102 | expiry_month: string; 103 | /** 104 | * Имя владельца карты. 105 | * Необязательное поле. 106 | */ 107 | cardholder?: string; 108 | /** 109 | * Код безопасности карты (CVC). 110 | * Необязательное поле. 111 | */ 112 | csc?: string; 113 | }; 114 | } 115 | /** 116 | * Тип для подтверждения через наличные. 117 | */ 118 | export interface PaymentMethodCash { 119 | /** 120 | * Тип метода — Наличные 121 | */ 122 | type: PaymentMethodsEnum.cash; 123 | /** 124 | * Номер телефона для подтверждения наличных платежей. 125 | * Необязательное поле. 126 | */ 127 | phone?: string; 128 | } 129 | /** 130 | * Тип для подтверждения через СБП (Система быстрых платежей). 131 | */ 132 | export interface PaymentMethodSbp { 133 | /** 134 | * Тип метода — Система быстрых платежей 135 | */ 136 | type: PaymentMethodsEnum.sbp; 137 | } 138 | /** 139 | * Тип для подтверждения через B2B Сбербанк. 140 | */ 141 | export interface PaymentMethodB2bSberbank { 142 | /** 143 | * Тип метода — B2B Сбербанк 144 | */ 145 | type: PaymentMethodsEnum.b2b_sberbank; 146 | /** 147 | * Назначение платежа. 148 | */ 149 | payment_purpose: string; 150 | /** 151 | * Данные о НДС. 152 | */ 153 | vat_data: { 154 | /** 155 | * Тип НДС. 156 | */ 157 | type: 'mixed' | 'calculated' | 'untaxed'; 158 | rate: number; 159 | /** 160 | * Сумма НДС. 161 | * Необязательное поле. 162 | */ 163 | amount?: Amount; 164 | }; 165 | } 166 | /** 167 | * Тип для подтверждения с использованием электронного сертификата (ФЭС НСПК). 168 | */ 169 | export interface PaymentMethodElectronicСertificate { 170 | /** 171 | * Тип метода оплаты — электронный сертификат. 172 | * Значение: `electronic_certificate`. 173 | */ 174 | type: PaymentMethodsEnum.electronic_certificate; 175 | /** 176 | * Корзина покупки — список товаров, которые можно оплатить по сертификату. 177 | * Необходимо передавать только при оплате на готовой странице ЮKassa. 178 | */ 179 | articles?: { 180 | /** 181 | * Порядковый номер товара в корзине (от 1 до 999 включительно). 182 | */ 183 | article_number: number; 184 | /** 185 | * Код ТРУ. Формат: NNNNNNNNN.NNNNNNNNNYYYYMMMMZZZ 186 | * Пример: 329921120.06001010200080001643 187 | */ 188 | tru_code: string; 189 | /** 190 | * Код товара в вашей системе. 191 | * Максимум 128 символов. 192 | */ 193 | article_code?: string; 194 | /** 195 | * Название товара в вашей системе. 196 | * Отображается на форме ЮKassa. 197 | * Максимум 128 символов. 198 | */ 199 | article_name: string; 200 | /** 201 | * Количество единиц товара. Целое положительное число. 202 | */ 203 | quantity: number; 204 | /** 205 | * Цена за единицу товара. 206 | */ 207 | price: { 208 | /** 209 | * Сумма в валюте. Дробное значение с точкой в качестве разделителя. 210 | * Пример: "1000.00" 211 | */ 212 | value: string; 213 | /** 214 | * Трехбуквенный код валюты по ISO-4217. 215 | * Пример: "RUB" 216 | */ 217 | currency: string; 218 | }; 219 | }[]; 220 | /** 221 | * Произвольные дополнительные данные. 222 | * Максимум 16 ключей, имя ключа — до 32 символов, значение — до 512 символов. 223 | */ 224 | metadata?: Record; 225 | /** 226 | * Данные банковской карты (если вы собираете данные карты на своей стороне). 227 | */ 228 | card?: { 229 | /** 230 | * Номер банковской карты. 231 | */ 232 | number: string; 233 | /** 234 | * Год окончания срока действия карты (формат: YYYY). 235 | */ 236 | expiry_year: string; 237 | /** 238 | * Месяц окончания срока действия карты (формат: MM). 239 | */ 240 | expiry_month: string; 241 | /** 242 | * Имя владельца карты. 243 | */ 244 | cardholder?: string; 245 | /** 246 | * CVC/CVV код (3–4 цифры). 247 | */ 248 | csc?: string; 249 | }; 250 | /** 251 | * Данные от ФЭС НСПК для оплаты по электронному сертификату. 252 | * Обязательное поле при оплате со сбором данных на вашей стороне. 253 | */ 254 | electronic_certificate?: { 255 | /** 256 | * Сумма, которую необходимо списать с электронного сертификата. 257 | * Значение из поля `totalCertAmount`, полученного при предварительном одобрении (Pre-Auth). 258 | */ 259 | amount: Amount; 260 | /** 261 | * Идентификатор корзины покупки в НСПК. 262 | * Значение `purchaseBasketId`, полученное в ответе от ФЭС НСПК при Pre-Auth. 263 | */ 264 | basket_id: string; 265 | }; 266 | } 267 | /** 268 | * Тип для подтверждения с использованием YooMoney. 269 | */ 270 | export interface PaymentMethodYooMoney { 271 | /** 272 | * Тип метода — YooMoney 273 | */ 274 | type: PaymentMethodsEnum.yoo_money; 275 | } 276 | /** 277 | * Тип для подтверждения через Сбербанк. 278 | */ 279 | export interface PaymentMethodSberbank { 280 | /** 281 | * Тип метода — Сбербанк 282 | */ 283 | type: PaymentMethodsEnum.sberbank; 284 | /** 285 | * Номер телефона в Сбербанке. 286 | * Необязательное поле. 287 | */ 288 | phone?: string; 289 | } 290 | /** 291 | * Тип для подтверждения через Тинькофф Банк. 292 | */ 293 | export interface PaymentMethodTinkoffBank { 294 | /** 295 | * Тип метода — Тинькофф Банк 296 | */ 297 | type: PaymentMethodsEnum.tinkoff_bank; 298 | } 299 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/payment-method.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.PaymentMethodsEnum = void 0; 4 | /** 5 | * Перечисление возможных методов оплаты. 6 | * Каждый метод оплаты представлен уникальным типом. 7 | * @enum {string} 8 | */ 9 | var PaymentMethodsEnum; 10 | (function (PaymentMethodsEnum) { 11 | /** 12 | * «Покупки в кредит» от СберБанка 13 | */ 14 | PaymentMethodsEnum["sber_loan"] = "sber_loan"; 15 | /** 16 | * Баланс мобильного телефона 17 | */ 18 | PaymentMethodsEnum["mobile_balance"] = "mobile_balance"; 19 | /** 20 | * Банковская карта 21 | */ 22 | PaymentMethodsEnum["bank_card"] = "bank_card"; 23 | /** 24 | * Наличные 25 | */ 26 | PaymentMethodsEnum["cash"] = "cash"; 27 | /** 28 | * Система быстрых платежей 29 | */ 30 | PaymentMethodsEnum["sbp"] = "sbp"; 31 | /** 32 | * B2B Сбербанк 33 | */ 34 | PaymentMethodsEnum["b2b_sberbank"] = "b2b_sberbank"; 35 | /** 36 | * Электронный сертификат 37 | */ 38 | PaymentMethodsEnum["electronic_certificate"] = "electronic_certificate"; 39 | /** 40 | * YooMoney 41 | */ 42 | PaymentMethodsEnum["yoo_money"] = "yoo_money"; 43 | /** 44 | * Сбербанк 45 | */ 46 | PaymentMethodsEnum["sberbank"] = "sberbank"; 47 | /** 48 | * Альфа-Банк 49 | */ 50 | PaymentMethodsEnum["alfabank"] = "alfabank"; 51 | /** 52 | * Тинькофф Банк 53 | */ 54 | PaymentMethodsEnum["tinkoff_bank"] = "tinkoff_bank"; 55 | })(PaymentMethodsEnum || (exports.PaymentMethodsEnum = PaymentMethodsEnum = {})); 56 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/payment-request.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface'; 2 | import type { Confirmation } from './confirmation.interface'; 3 | import type { PaymentMethod } from './payment-method.interface'; 4 | /** 5 | * Информация о пассажире авиабилета 6 | */ 7 | export interface AirlinePassenger { 8 | /** 9 | * Имя пассажира. Используются только латинские буквы, например SERGEI. 10 | */ 11 | first_name: string; 12 | /** 13 | * Фамилия пассажира. Используются только латинские буквы, например IVANOV. 14 | */ 15 | last_name: string; 16 | } 17 | /** 18 | * Информация о перелёте 19 | */ 20 | export interface AirlineLeg { 21 | /** 22 | * Код аэропорта вылета по справочнику IATA, например LED. 23 | */ 24 | departure_airport: string; 25 | /** 26 | * Код аэропорта прибытия по справочнику IATA, например AMS. 27 | */ 28 | destination_airport: string; 29 | /** 30 | * Дата вылета в формате YYYY-MM-DD (ISO 8601). 31 | */ 32 | departure_date: string; 33 | /** 34 | * Код авиакомпании по справочнику IATA. Необязательное поле. 35 | */ 36 | carrier_code?: string; 37 | } 38 | /** 39 | * Объект с данными для продажи авиабилетов. 40 | * Используется только для платежей банковской картой. 41 | */ 42 | export interface AirlineInfo { 43 | /** 44 | * Уникальный номер билета. Обязателен, если известен при создании платежа. 45 | */ 46 | ticket_number?: string; 47 | /** 48 | * Номер бронирования. Обязателен, если не передан ticket_number. 49 | */ 50 | booking_reference?: string; 51 | /** 52 | * Список пассажиров. Необязательное поле. 53 | */ 54 | passengers?: AirlinePassenger[]; 55 | /** 56 | * Список перелётов. Необязательное поле. 57 | */ 58 | legs?: AirlineLeg[]; 59 | } 60 | /** 61 | * Тип, представляющий запрос на создание платежа. 62 | */ 63 | export interface PaymentCreateRequest { 64 | /** 65 | * Сумма платежа. 66 | */ 67 | amount: Amount; 68 | /** 69 | * Описание платежа. 70 | * Необязательное поле. 71 | */ 72 | description?: string; 73 | /** 74 | * Чек, который будет прикреплен к платежу. 75 | * Необязательное поле. 76 | */ 77 | /** 78 | * Информация о получателе платежа. 79 | * Необязательное поле. 80 | */ 81 | recipient?: { 82 | /** 83 | * Идентификатор получателя в платежной системе. 84 | */ 85 | gateway_id: string; 86 | }; 87 | /** 88 | * Одноразовый токен для проведения оплаты, сформированный с помощью Checkout.js или мобильного SDK 89 | * Необязательное поле. 90 | */ 91 | payment_token?: string; 92 | /** 93 | * Идентификатор сохраненного способа оплаты 94 | * Необязательное поле. 95 | */ 96 | payment_method_id?: string; 97 | /** 98 | * Метод платежа. 99 | * Необязательное поле. 100 | */ 101 | payment_method_data?: PaymentMethod; 102 | /** 103 | * Тип подтверждения для платежа. 104 | */ 105 | confirmation: Confirmation; 106 | /** 107 | * Нужно ли сохранять метод платежа для будущих платежей. 108 | * Необязательное поле. 109 | */ 110 | save_payment_method?: boolean; 111 | /** 112 | * Указывает, следует ли сразу захватывать платеж. 113 | * Необязательное поле, по умолчанию false. 114 | */ 115 | capture?: boolean; 116 | /** 117 | * IPv4 или IPv6-адрес пользователя. 118 | */ 119 | client_ip?: string; 120 | /** 121 | * Дополнительные метаданные, связанные с платежом. 122 | * Необязательное поле. 123 | */ 124 | metadata?: object; 125 | /** 126 | * Объект с данными для продажи авиабилетов. 127 | * Используется только для платежей банковской картой. 128 | * Необязательное поле. 129 | */ 130 | airline?: AirlineInfo; 131 | /** 132 | * Идентификатор клиента в системе продавца. 133 | * Необязательное поле. 134 | */ 135 | merchant_customer_id?: string; 136 | } 137 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/payment-request.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/receipt-details.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface'; 2 | /** 3 | * Перечисление кодов НДС (налога на добавленную стоимость). 4 | * Эти коды соответствуют различным ставкам НДС. 5 | * @enum {number} 6 | */ 7 | export declare enum VatCodesEnum { 8 | /** 9 | * Без НДС. 10 | */ 11 | 'ndsNone' = 1, 12 | /** 13 | * НДС 0%. 14 | */ 15 | 'nds0' = 2, 16 | /** 17 | * НДС 10%. 18 | */ 19 | 'nds10' = 3, 20 | /** 21 | * НДС 20%. 22 | */ 23 | 'nds20' = 4, 24 | /** 25 | * НДС 10/110 (для некоторых товаров). 26 | */ 27 | 'nds10/110' = 5, 28 | /** 29 | * НДС 20/120 (для некоторых товаров). 30 | */ 31 | 'nds20/120' = 6 32 | } 33 | /** 34 | * Перечисление кодов систем налогообложения. 35 | * Каждая система налогообложения имеет свой код. 36 | * @enum {number} 37 | */ 38 | export declare enum TaxSystemCodesEnum { 39 | /** 40 | * Общая система налогообложения. 41 | */ 42 | 'OSN' = 1, 43 | /** 44 | * Упрощенная система налогообложения 6%. 45 | */ 46 | 'USN6' = 2, 47 | /** 48 | * Упрощенная система налогообложения 15%. 49 | */ 50 | 'USN15' = 3, 51 | /** 52 | * Единый налог на вмененный доход. 53 | */ 54 | 'ENVD' = 4, 55 | /** 56 | * Единый сельскохозяйственный налог. 57 | */ 58 | 'ESN' = 5, 59 | /** 60 | * Патентная система налогообложения. 61 | */ 62 | 'PSN' = 6 63 | } 64 | /** 65 | * Перечисление состояний регистрации чека. 66 | * @enum {string} 67 | */ 68 | export declare enum ReceiptRegistrationEnum { 69 | /** 70 | * Ожидает регистрации 71 | */ 72 | pending = "pending", 73 | /** 74 | * Успешно зарегистрирован 75 | */ 76 | succeeded = "succeeded", 77 | /** 78 | * Регистрация отменена 79 | */ 80 | canceled = "canceled" 81 | } 82 | export interface ReceiptItem { 83 | description: string; 84 | quantity: number; 85 | amount: Amount; 86 | vat_code: VatCodesEnum; 87 | payment_mode: string; 88 | payment_subject: string; 89 | country_of_origin_code?: string; 90 | } 91 | export interface Settlement { 92 | type: 'prepayment' | 'full_payment' | 'advance' | 'credit'; 93 | amount: Amount; 94 | } 95 | export interface ReceiptDetails { 96 | id: string; 97 | type: 'payment' | 'refund'; 98 | payment_id?: string; 99 | refund_id?: string; 100 | status: ReceiptRegistrationEnum; 101 | fiscal_document_number?: string; 102 | fiscal_storage_number?: string; 103 | fiscal_attribute?: string; 104 | registered_at?: string; 105 | fiscal_provider_id?: string; 106 | tax_system_code?: TaxSystemCodesEnum; 107 | items: ReceiptItem[]; 108 | settlements?: Settlement[]; 109 | } 110 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/receipt-details.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.ReceiptRegistrationEnum = exports.TaxSystemCodesEnum = exports.VatCodesEnum = void 0; 4 | /** 5 | * Перечисление кодов НДС (налога на добавленную стоимость). 6 | * Эти коды соответствуют различным ставкам НДС. 7 | * @enum {number} 8 | */ 9 | var VatCodesEnum; 10 | (function (VatCodesEnum) { 11 | /** 12 | * Без НДС. 13 | */ 14 | VatCodesEnum[VatCodesEnum["ndsNone"] = 1] = "ndsNone"; 15 | /** 16 | * НДС 0%. 17 | */ 18 | VatCodesEnum[VatCodesEnum["nds0"] = 2] = "nds0"; 19 | /** 20 | * НДС 10%. 21 | */ 22 | VatCodesEnum[VatCodesEnum["nds10"] = 3] = "nds10"; 23 | /** 24 | * НДС 20%. 25 | */ 26 | VatCodesEnum[VatCodesEnum["nds20"] = 4] = "nds20"; 27 | /** 28 | * НДС 10/110 (для некоторых товаров). 29 | */ 30 | VatCodesEnum[VatCodesEnum["nds10/110"] = 5] = "nds10/110"; 31 | /** 32 | * НДС 20/120 (для некоторых товаров). 33 | */ 34 | VatCodesEnum[VatCodesEnum["nds20/120"] = 6] = "nds20/120"; 35 | })(VatCodesEnum || (exports.VatCodesEnum = VatCodesEnum = {})); 36 | /** 37 | * Перечисление кодов систем налогообложения. 38 | * Каждая система налогообложения имеет свой код. 39 | * @enum {number} 40 | */ 41 | var TaxSystemCodesEnum; 42 | (function (TaxSystemCodesEnum) { 43 | /** 44 | * Общая система налогообложения. 45 | */ 46 | TaxSystemCodesEnum[TaxSystemCodesEnum["OSN"] = 1] = "OSN"; 47 | /** 48 | * Упрощенная система налогообложения 6%. 49 | */ 50 | TaxSystemCodesEnum[TaxSystemCodesEnum["USN6"] = 2] = "USN6"; 51 | /** 52 | * Упрощенная система налогообложения 15%. 53 | */ 54 | TaxSystemCodesEnum[TaxSystemCodesEnum["USN15"] = 3] = "USN15"; 55 | /** 56 | * Единый налог на вмененный доход. 57 | */ 58 | TaxSystemCodesEnum[TaxSystemCodesEnum["ENVD"] = 4] = "ENVD"; 59 | /** 60 | * Единый сельскохозяйственный налог. 61 | */ 62 | TaxSystemCodesEnum[TaxSystemCodesEnum["ESN"] = 5] = "ESN"; 63 | /** 64 | * Патентная система налогообложения. 65 | */ 66 | TaxSystemCodesEnum[TaxSystemCodesEnum["PSN"] = 6] = "PSN"; 67 | })(TaxSystemCodesEnum || (exports.TaxSystemCodesEnum = TaxSystemCodesEnum = {})); 68 | /** 69 | * Перечисление состояний регистрации чека. 70 | * @enum {string} 71 | */ 72 | var ReceiptRegistrationEnum; 73 | (function (ReceiptRegistrationEnum) { 74 | /** 75 | * Ожидает регистрации 76 | */ 77 | ReceiptRegistrationEnum["pending"] = "pending"; 78 | /** 79 | * Успешно зарегистрирован 80 | */ 81 | ReceiptRegistrationEnum["succeeded"] = "succeeded"; 82 | /** 83 | * Регистрация отменена 84 | */ 85 | ReceiptRegistrationEnum["canceled"] = "canceled"; 86 | })(ReceiptRegistrationEnum || (exports.ReceiptRegistrationEnum = ReceiptRegistrationEnum = {})); 87 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/receipt-request.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { ReceiptItem, Settlement } from './receipt-details.interface'; 2 | export interface Customer { 3 | full_name?: string; 4 | inn?: string; 5 | email?: string; 6 | phone?: string; 7 | } 8 | export interface ReceiptCreateRequest { 9 | customer: Customer; 10 | payment_id: string; 11 | type: 'payment' | 'refund'; 12 | send: boolean; 13 | items: ReceiptItem[]; 14 | settlements: Settlement[]; 15 | } 16 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/receipt-request.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/refund-details.interface.d.ts: -------------------------------------------------------------------------------- 1 | import { Amount } from './common.interface'; 2 | import { ReceiptRegistrationEnum } from './receipt-details.interface'; 3 | export declare enum RefundStatusEnum { 4 | /** 5 | * Платеж в процессе. 6 | */ 7 | pending = "pending", 8 | /** 9 | * Платеж выполнен успешно. 10 | */ 11 | succeeded = "succeeded", 12 | /** 13 | * Платеж отменен. 14 | */ 15 | canceled = "canceled" 16 | } 17 | /** 18 | * Детали отмены платежа. 19 | */ 20 | interface CancellationDetails { 21 | /** 22 | * Сторона, инициировавшая отмену. 23 | */ 24 | party: string; 25 | /** 26 | * Причина отмены. 27 | */ 28 | reason: string; 29 | } 30 | /** 31 | * Источник, с которого был произведен возврат. 32 | */ 33 | interface Source { 34 | /** 35 | * Идентификатор счета. 36 | */ 37 | account_id: string; 38 | /** 39 | * Сумма возврата. 40 | */ 41 | amount: Amount; 42 | } 43 | /** 44 | * Сумма, удержанная в качестве комиссии платформы. 45 | */ 46 | interface PlatformFeeAmount { 47 | /** 48 | * Значение комиссии. 49 | */ 50 | value: string; 51 | /** 52 | * Валюта комиссии. 53 | */ 54 | currency: string; 55 | } 56 | /** 57 | * Сделка, для которой был выполнен возврат. 58 | */ 59 | interface Deal { 60 | /** 61 | * Идентификатор сделки. 62 | */ 63 | id: string; 64 | } 65 | /** 66 | * Метод возврата средств. 67 | */ 68 | export interface RefundMethod { 69 | /** 70 | * Тип метода возврата. 71 | */ 72 | type: string; 73 | /** 74 | * Идентификатор операции в системе SBP (для специфичных методов). 75 | * Необязательное поле. 76 | */ 77 | sbp_operation_id?: string; 78 | } 79 | export interface RefundDetails { 80 | /** 81 | * Идентификатор возврата. 82 | */ 83 | id: string; 84 | /** 85 | * Статус возврата. 86 | */ 87 | status: RefundStatusEnum; 88 | /** 89 | * Детали отмены, если возврат был отменен. 90 | * Необязательное поле. 91 | */ 92 | cancellation_details?: CancellationDetails; 93 | /** 94 | * Регистрируется ли чек при возврате. 95 | * Необязательное поле. 96 | */ 97 | receipt_registration?: ReceiptRegistrationEnum; 98 | /** 99 | * Время создания возврата. 100 | */ 101 | created_at: string; 102 | /** 103 | * Сумма возврата. 104 | */ 105 | amount: Amount; 106 | /** 107 | * Описание возврата. 108 | * Необязательное поле. 109 | */ 110 | description?: string; 111 | /** 112 | * Источники, из которых поступили средства для возврата. 113 | * Необязательное поле. 114 | */ 115 | sources?: Source[]; 116 | /** 117 | * Платежная комиссия, удержанная платформой. 118 | * Необязательное поле. 119 | */ 120 | platform_fee_amount?: PlatformFeeAmount; 121 | /** 122 | * Информация о сделке, связанной с возвратом. 123 | * Необязательное поле. 124 | */ 125 | deal?: Deal; 126 | /** 127 | * Способ возврата. 128 | * Необязательное поле. 129 | */ 130 | refund_method?: RefundMethod; 131 | } 132 | export {}; 133 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/refund-details.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.RefundStatusEnum = void 0; 4 | var RefundStatusEnum; 5 | (function (RefundStatusEnum) { 6 | /** 7 | * Платеж в процессе. 8 | */ 9 | RefundStatusEnum["pending"] = "pending"; 10 | /** 11 | * Платеж выполнен успешно. 12 | */ 13 | RefundStatusEnum["succeeded"] = "succeeded"; 14 | /** 15 | * Платеж отменен. 16 | */ 17 | RefundStatusEnum["canceled"] = "canceled"; 18 | })(RefundStatusEnum || (exports.RefundStatusEnum = RefundStatusEnum = {})); 19 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/refund-request.interface.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Тип, представляющий запрос на создание возврата. 3 | */ 4 | export interface RefundCreateRequest { 5 | /** 6 | * Идентификатор платежа, для которого создается возврат. 7 | */ 8 | payment_id: string; 9 | /** 10 | * Описание возврата. 11 | * Необязательное поле. 12 | */ 13 | description?: string; 14 | } 15 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/refund-request.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/yookassa-options.interface.d.ts: -------------------------------------------------------------------------------- 1 | import type { FactoryProvider, ModuleMetadata } from '@nestjs/common'; 2 | export declare const YookassaOptionsSymbol: unique symbol; 3 | /** 4 | * Тип, представляющий параметры для настройки YooKassa. 5 | */ 6 | export type YookassaOptions = { 7 | /** 8 | * Идентификатор магазина в YooKassa. 9 | */ 10 | shopId: string; 11 | /** 12 | * Ключ API для аутентификации в YooKassa. 13 | */ 14 | apiKey: string; 15 | }; 16 | /** 17 | * Тип для асинхронной настройки YooKassa. 18 | */ 19 | export type YookassaAsyncOptions = Pick & Pick, 'useFactory' | 'inject'>; 20 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/interfaces/yookassa-options.interface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.YookassaOptionsSymbol = void 0; 4 | exports.YookassaOptionsSymbol = Symbol(); 5 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './payment.service'; 2 | export * from './refund.service'; 3 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 14 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 15 | }; 16 | Object.defineProperty(exports, "__esModule", { value: true }); 17 | __exportStar(require("./payment.service"), exports); 18 | __exportStar(require("./refund.service"), exports); 19 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/payment.service.d.ts: -------------------------------------------------------------------------------- 1 | import { type PaymentCreateRequest, type PaymentDetails, type YookassaOptions } from '../interfaces'; 2 | import { HttpService } from '@nestjs/axios'; 3 | export declare class PaymentService { 4 | private readonly options; 5 | private readonly httpService; 6 | constructor(options: YookassaOptions, httpService: HttpService); 7 | create(paymentData: PaymentCreateRequest): Promise; 8 | getAll(limit?: number, from?: string, to?: string): Promise; 9 | getOne(paymentId: string): Promise; 10 | capture(paymentId: string): Promise; 11 | cancel(paymentId: string): Promise; 12 | private getAuthHeader; 13 | } 14 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/payment.service.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 6 | return c > 3 && r && Object.defineProperty(target, key, r), r; 7 | }; 8 | var __metadata = (this && this.__metadata) || function (k, v) { 9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 10 | }; 11 | var __param = (this && this.__param) || function (paramIndex, decorator) { 12 | return function (target, key) { decorator(target, key, paramIndex); } 13 | }; 14 | Object.defineProperty(exports, "__esModule", { value: true }); 15 | exports.PaymentService = void 0; 16 | const common_1 = require("@nestjs/common"); 17 | const interfaces_1 = require("../interfaces"); 18 | const axios_1 = require("@nestjs/axios"); 19 | const rxjs_1 = require("rxjs"); 20 | const uuid_1 = require("uuid"); 21 | const yookassa_constants_1 = require("../yookassa.constants"); 22 | let PaymentService = class PaymentService { 23 | constructor(options, httpService) { 24 | this.options = options; 25 | this.httpService = httpService; 26 | } 27 | async create(paymentData) { 28 | var _a, _b; 29 | const idempotenceKey = (0, uuid_1.v4)(); 30 | try { 31 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${yookassa_constants_1.YOOKASSA_API_URL}payments`, paymentData, { 32 | headers: { 33 | Authorization: this.getAuthHeader(), 34 | 'Content-Type': 'application/json', 35 | 'Idempotence-Key': idempotenceKey 36 | } 37 | })); 38 | return response.data; 39 | } 40 | catch (error) { 41 | throw new common_1.HttpException(((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.description) || 42 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 43 | } 44 | } 45 | async getAll(limit = 10, from = '', to = '') { 46 | try { 47 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${yookassa_constants_1.YOOKASSA_API_URL}payments`, { 48 | headers: { 49 | Authorization: this.getAuthHeader() 50 | }, 51 | params: { 52 | limit, 53 | from, 54 | to 55 | } 56 | })); 57 | return response.data; 58 | } 59 | catch (error) { 60 | throw new common_1.HttpException(error.response.data.description || 61 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 62 | } 63 | } 64 | async getOne(paymentId) { 65 | try { 66 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${yookassa_constants_1.YOOKASSA_API_URL}payments/${paymentId}`, { 67 | headers: { 68 | Authorization: this.getAuthHeader() 69 | } 70 | })); 71 | return response.data; 72 | } 73 | catch (error) { 74 | throw new common_1.HttpException(error.response.data.description || 75 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 76 | } 77 | } 78 | async capture(paymentId) { 79 | const idempotenceKey = (0, uuid_1.v4)(); 80 | try { 81 | const { amount } = await this.getOne(paymentId); 82 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${yookassa_constants_1.YOOKASSA_API_URL}payments/${paymentId}/capture`, { amount }, { 83 | headers: { 84 | Authorization: this.getAuthHeader(), 85 | 'Content-Type': 'application/json', 86 | 'Idempotence-Key': idempotenceKey 87 | } 88 | })); 89 | return response.data; 90 | } 91 | catch (error) { 92 | throw new common_1.HttpException(error.response.data.description || 93 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 94 | } 95 | } 96 | async cancel(paymentId) { 97 | const idempotenceKey = (0, uuid_1.v4)(); 98 | try { 99 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${yookassa_constants_1.YOOKASSA_API_URL}payments/${paymentId}/cancel`, {}, { 100 | headers: { 101 | Authorization: this.getAuthHeader(), 102 | 'Content-Type': 'application/json', 103 | 'Idempotence-Key': idempotenceKey 104 | } 105 | })); 106 | return response.data; 107 | } 108 | catch (error) { 109 | throw new common_1.HttpException(error.response.data.description || 110 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 111 | } 112 | } 113 | getAuthHeader() { 114 | return `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}`; 115 | } 116 | }; 117 | exports.PaymentService = PaymentService; 118 | exports.PaymentService = PaymentService = __decorate([ 119 | (0, common_1.Injectable)(), 120 | __param(0, (0, common_1.Inject)(interfaces_1.YookassaOptionsSymbol)), 121 | __metadata("design:paramtypes", [Object, axios_1.HttpService]) 122 | ], PaymentService); 123 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/refund.service.d.ts: -------------------------------------------------------------------------------- 1 | import { type RefundCreateRequest, type RefundDetails, type YookassaOptions } from '../interfaces'; 2 | import { HttpService } from '@nestjs/axios'; 3 | import { PaymentService } from './payment.service'; 4 | export declare class RefundService { 5 | private readonly options; 6 | private readonly httpService; 7 | private readonly paymentService; 8 | constructor(options: YookassaOptions, httpService: HttpService, paymentService: PaymentService); 9 | create(refundData: RefundCreateRequest): Promise; 10 | getAll(limit?: number, from?: string, to?: string): Promise; 11 | getOne(refundId: string): Promise; 12 | private getAuthHeader; 13 | } 14 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/services/refund.service.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 6 | return c > 3 && r && Object.defineProperty(target, key, r), r; 7 | }; 8 | var __metadata = (this && this.__metadata) || function (k, v) { 9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 10 | }; 11 | var __param = (this && this.__param) || function (paramIndex, decorator) { 12 | return function (target, key) { decorator(target, key, paramIndex); } 13 | }; 14 | Object.defineProperty(exports, "__esModule", { value: true }); 15 | exports.RefundService = void 0; 16 | const common_1 = require("@nestjs/common"); 17 | const interfaces_1 = require("../interfaces"); 18 | const axios_1 = require("@nestjs/axios"); 19 | const payment_service_1 = require("./payment.service"); 20 | const rxjs_1 = require("rxjs"); 21 | const uuid_1 = require("uuid"); 22 | const yookassa_constants_1 = require("../yookassa.constants"); 23 | let RefundService = class RefundService { 24 | constructor(options, httpService, paymentService) { 25 | this.options = options; 26 | this.httpService = httpService; 27 | this.paymentService = paymentService; 28 | } 29 | async create(refundData) { 30 | var _a, _b; 31 | const idempotenceKey = (0, uuid_1.v4)(); 32 | try { 33 | const { amount } = await this.paymentService.getOne(refundData.payment_id); 34 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${yookassa_constants_1.YOOKASSA_API_URL}refunds`, { 35 | payment_id: refundData.payment_id, 36 | amount, 37 | description: refundData.description 38 | }, { 39 | headers: { 40 | Authorization: this.getAuthHeader(), 41 | 'Content-Type': 'application/json', 42 | 'Idempotence-Key': idempotenceKey 43 | } 44 | })); 45 | return response.data; 46 | } 47 | catch (error) { 48 | throw new common_1.HttpException(((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.description) || 49 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 50 | } 51 | } 52 | async getAll(limit = 10, from = '', to = '') { 53 | try { 54 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${yookassa_constants_1.YOOKASSA_API_URL}refunds`, { 55 | headers: { 56 | Authorization: `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 57 | }, 58 | params: { 59 | limit, 60 | from, 61 | to 62 | } 63 | })); 64 | return response.data; 65 | } 66 | catch (error) { 67 | throw new common_1.HttpException(error.response.data.description || 68 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 69 | } 70 | } 71 | async getOne(refundId) { 72 | try { 73 | const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${yookassa_constants_1.YOOKASSA_API_URL}refunds/${refundId}`, { 74 | headers: { 75 | Authorization: `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 76 | } 77 | })); 78 | return response.data; 79 | } 80 | catch (error) { 81 | throw new common_1.HttpException(error.response.data.description || 82 | 'Ошибка при выполнении запроса', common_1.HttpStatus.BAD_REQUEST); 83 | } 84 | } 85 | getAuthHeader() { 86 | return `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}`; 87 | } 88 | }; 89 | exports.RefundService = RefundService; 90 | exports.RefundService = RefundService = __decorate([ 91 | (0, common_1.Injectable)(), 92 | __param(0, (0, common_1.Inject)(interfaces_1.YookassaOptionsSymbol)), 93 | __metadata("design:paramtypes", [Object, axios_1.HttpService, 94 | payment_service_1.PaymentService]) 95 | ], RefundService); 96 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.constants.d.ts: -------------------------------------------------------------------------------- 1 | export declare const YOOKASSA_API_URL = "https://api.yookassa.ru/v3/"; 2 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.constants.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.YOOKASSA_API_URL = void 0; 4 | exports.YOOKASSA_API_URL = 'https://api.yookassa.ru/v3/'; 5 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.module.d.ts: -------------------------------------------------------------------------------- 1 | import { type DynamicModule } from '@nestjs/common'; 2 | import { type YookassaAsyncOptions, type YookassaOptions } from './interfaces'; 3 | export declare class YookassaModule { 4 | /** 5 | * Метод для регистрации модуля с синхронными параметрами. 6 | * Этот метод используется для конфигурации модуля с заранее заданными параметрами. 7 | * @param {YookassaOptions} options - Настройки для конфигурации YooKassa. 8 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 9 | * 10 | * @example 11 | * ```ts 12 | * YookassaModule.forRoot({ 13 | * shopId: 'your_shop_id', 14 | * apiKey: 'your_api_key', 15 | * }); 16 | * ``` 17 | */ 18 | static forRoot(options: YookassaOptions): DynamicModule; 19 | /** 20 | * Метод для регистрации модуля с асинхронной конфигурацией. 21 | * Этот метод используется для конфигурации модуля с параметрами, которые будут переданы через фабричную функцию. 22 | * @param {YookassaAsyncOptions} options - Асинхронные параметры для конфигурации YooKassa. 23 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 24 | * 25 | * @example 26 | * ```ts 27 | * YookassaModule.forRootAsync({ 28 | * imports: [ConfigModule], 29 | * useFactory: async (configService: ConfigService) => ({ 30 | * shopId: configService.getOrThrow('YOOKASSA_SHOP_ID'), 31 | * apiKey: configService.getOrThrow('YOOKASSA_API_KEY') 32 | * }), 33 | * inject: [ConfigService] 34 | * }); 35 | * ``` 36 | */ 37 | static forRootAsync(options: YookassaAsyncOptions): DynamicModule; 38 | } 39 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 6 | return c > 3 && r && Object.defineProperty(target, key, r), r; 7 | }; 8 | var YookassaModule_1; 9 | Object.defineProperty(exports, "__esModule", { value: true }); 10 | exports.YookassaModule = void 0; 11 | const axios_1 = require("@nestjs/axios"); 12 | const common_1 = require("@nestjs/common"); 13 | const interfaces_1 = require("./interfaces"); 14 | const yookassa_service_1 = require("./yookassa.service"); 15 | const payment_service_1 = require("./services/payment.service"); 16 | const refund_service_1 = require("./services/refund.service"); 17 | let YookassaModule = YookassaModule_1 = class YookassaModule { 18 | /** 19 | * Метод для регистрации модуля с синхронными параметрами. 20 | * Этот метод используется для конфигурации модуля с заранее заданными параметрами. 21 | * @param {YookassaOptions} options - Настройки для конфигурации YooKassa. 22 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 23 | * 24 | * @example 25 | * ```ts 26 | * YookassaModule.forRoot({ 27 | * shopId: 'your_shop_id', 28 | * apiKey: 'your_api_key', 29 | * }); 30 | * ``` 31 | */ 32 | static forRoot(options) { 33 | return { 34 | module: YookassaModule_1, 35 | imports: [axios_1.HttpModule], 36 | providers: [ 37 | { 38 | provide: interfaces_1.YookassaOptionsSymbol, 39 | useValue: options 40 | }, 41 | payment_service_1.PaymentService, 42 | refund_service_1.RefundService, 43 | yookassa_service_1.YookassaService 44 | ], 45 | exports: [yookassa_service_1.YookassaService], 46 | global: true 47 | }; 48 | } 49 | /** 50 | * Метод для регистрации модуля с асинхронной конфигурацией. 51 | * Этот метод используется для конфигурации модуля с параметрами, которые будут переданы через фабричную функцию. 52 | * @param {YookassaAsyncOptions} options - Асинхронные параметры для конфигурации YooKassa. 53 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 54 | * 55 | * @example 56 | * ```ts 57 | * YookassaModule.forRootAsync({ 58 | * imports: [ConfigModule], 59 | * useFactory: async (configService: ConfigService) => ({ 60 | * shopId: configService.getOrThrow('YOOKASSA_SHOP_ID'), 61 | * apiKey: configService.getOrThrow('YOOKASSA_API_KEY') 62 | * }), 63 | * inject: [ConfigService] 64 | * }); 65 | * ``` 66 | */ 67 | static forRootAsync(options) { 68 | return { 69 | module: YookassaModule_1, 70 | imports: [axios_1.HttpModule, ...(options.imports || [])], 71 | providers: [ 72 | { 73 | provide: interfaces_1.YookassaOptionsSymbol, 74 | useFactory: options.useFactory, 75 | inject: options.inject || [] 76 | }, 77 | payment_service_1.PaymentService, 78 | refund_service_1.RefundService, 79 | yookassa_service_1.YookassaService 80 | ], 81 | exports: [yookassa_service_1.YookassaService], 82 | global: true 83 | }; 84 | } 85 | }; 86 | exports.YookassaModule = YookassaModule; 87 | exports.YookassaModule = YookassaModule = YookassaModule_1 = __decorate([ 88 | (0, common_1.Global)(), 89 | (0, common_1.Module)({}) 90 | ], YookassaModule); 91 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.service.d.ts: -------------------------------------------------------------------------------- 1 | import { PaymentService, RefundService } from './services'; 2 | import { PaymentCreateRequest, RefundCreateRequest } from './interfaces'; 3 | export declare class YookassaService { 4 | private readonly paymentService; 5 | private readonly refundService; 6 | constructor(paymentService: PaymentService, refundService: RefundService); 7 | /** 8 | * Создает платеж через YooKassa. 9 | * Этот метод отправляет запрос на создание нового платежа с данными из `paymentData`. 10 | * Возвращает информацию о созданном платеже. 11 | * 12 | * @param {PaymentCreateRequest} paymentData - Данные для создания платежа. 13 | * @returns {Promise} Ответ от API с деталями платежа. 14 | * 15 | * @example 16 | * ```ts 17 | * const paymentData: PaymentCreateRequest = { 18 | * amount: { 19 | * value: 1000, 20 | * currency: 'RUB' 21 | * }, 22 | * description: 'Test payment', 23 | * payment_method_data: { 24 | * type: PaymentMethodsEnum.yoo_money, 25 | * }, 26 | * confirmation: { 27 | * type: 'redirect', 28 | * return_url: 'https://example.com/thanks' 29 | * }, 30 | * capture: false, 31 | * }; 32 | * const paymentResponse = await this.yookassaService.createPayment(paymentData); 33 | * console.log(paymentResponse); 34 | * ``` 35 | */ 36 | createPayment(paymentData: PaymentCreateRequest): Promise; 37 | /** 38 | * Получает список платежей. 39 | * Этот метод используется для получения списка всех платежей с возможностью пагинации. 40 | * 41 | * @param {number} limit - Максимальное количество платежей на страницу. 42 | * @param {string} from - Начальная дата для фильтрации. 43 | * @param {string} to - Конечная дата для фильтрации. 44 | * @returns {Promise} Список платежей. 45 | * 46 | * @example 47 | * ```ts 48 | * const payments = await this.yookassaService.getPayments(10, '2025-01-01', '2025-01-17'); 49 | * console.log(payments); 50 | * ``` 51 | */ 52 | getPayments(limit?: number, from?: string, to?: string): Promise; 53 | /** 54 | * Получает детали платежа по его ID. 55 | * Этот метод позволяет получить подробную информацию о платеже, включая его статус, сумму и другие данные. 56 | * 57 | * @param {string} paymentId - Уникальный идентификатор платежа, для которого нужно получить детали. 58 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже. 59 | * 60 | * @example 61 | * ```ts 62 | * const paymentId = '123456'; 63 | * const paymentDetails = await this.yookassaService.getPaymentDetails(paymentId); 64 | * console.log(paymentDetails); 65 | * ``` 66 | */ 67 | getPaymentDetails(paymentId: string): Promise; 68 | /** 69 | * Выполняет захват платежа. 70 | * Этот метод используется для захвата средств с карты клиента после того, как был создан платеж. 71 | * Обычно это делается, когда заказ подтвержден, и продавец готов забрать средства. 72 | * Возвращает обновленные детали платежа после захвата средств. 73 | * 74 | * @param {string} paymentId - Уникальный идентификатор платежа, который нужно захватить. 75 | * @param {Amount} amount - Сумма, которую необходимо захватить. Если сумма равна нулю, захватится полная сумма платежа. 76 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже после захвата. 77 | * 78 | * @example 79 | * ```ts 80 | * const paymentId = '123456'; 81 | * const amount: Amount = { 82 | * value: 1000, 83 | * currency: 'RUB', 84 | * }; 85 | * const paymentDetails = await this.yookassaService.capturePayment(paymentId, amount); 86 | * console.log(paymentDetails); 87 | * ``` 88 | */ 89 | capturePayment(paymentId: string): Promise; 90 | /** 91 | * Отменяет платеж. 92 | * Этот метод используется для отмены платежа. 93 | * 94 | * @param {string} paymentId - ID платежа. 95 | * @returns {Promise} Детали отмененного платежа. 96 | * 97 | * @example 98 | * ```ts 99 | * const paymentId = '123456'; 100 | * const canceledPaymentDetails = await this.yookassaService.cancelPayment(paymentId); 101 | * console.log(canceledPaymentDetails); 102 | * ``` 103 | */ 104 | cancelPayment(paymentId: string): Promise; 105 | /** 106 | * Создает возврат средств по указанному платежу. 107 | * Этот метод отправляет запрос на создание возврата с данными из `refundData`. 108 | * 109 | * @param {RefundCreateRequest} refundData - Данные для создания возврата. 110 | * @returns {Promise} Ответ от API с деталями созданного возврата. 111 | * 112 | * @example 113 | * ```ts 114 | * const refundData: RefundCreateRequest = { 115 | * payment_id: '123456', 116 | * description: 'Возврат за отмененный заказ', 117 | * }; 118 | * const refundResponse = await this.yookassaService.createRefund(refundData); 119 | * console.log(refundResponse); 120 | * ``` 121 | */ 122 | createRefund(refundData: RefundCreateRequest): Promise; 123 | /** 124 | * Получает список всех возвратов. 125 | * Возвращает массив объектов с информацией о возвратах. 126 | * 127 | * @param {number} limit - Максимальное количество платежей на страницу. 128 | * @param {string} from - Начальная дата для фильтрации. 129 | * @param {string} to - Конечная дата для фильтрации. 130 | * @returns {Promise} Массив объектов с деталями возвратов. 131 | * 132 | * @example 133 | * ```ts 134 | * const refunds = await this.yookassaService.getRefunds(10, '2025-01-01', '2025-01-17'); 135 | * console.log(refunds); 136 | * ``` 137 | */ 138 | getRefunds(limit?: number, from?: string, to?: string): Promise; 139 | /** 140 | * Получает детали возврата по его ID. 141 | * Этот метод возвращает подробную информацию о возврате, включая его статус и сумму. 142 | * 143 | * @param {string} refundId - Уникальный идентификатор возврата. 144 | * @returns {Promise} Объект с деталями возврата. 145 | * 146 | * @example 147 | * ```ts 148 | * const refundId = 'refund-id'; 149 | * const refundDetails = await this.yookassaService.getRefundDetails(refundId); 150 | * console.log(refundDetails); 151 | * ``` 152 | * @throws {NotFoundException} Если возврат с указанным ID не найден. 153 | */ 154 | getRefundDetails(refundId: string): Promise; 155 | } 156 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/dist/yookassa.service.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 6 | return c > 3 && r && Object.defineProperty(target, key, r), r; 7 | }; 8 | var __metadata = (this && this.__metadata) || function (k, v) { 9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 10 | }; 11 | Object.defineProperty(exports, "__esModule", { value: true }); 12 | exports.YookassaService = void 0; 13 | const common_1 = require("@nestjs/common"); 14 | const services_1 = require("./services"); 15 | let YookassaService = class YookassaService { 16 | constructor(paymentService, refundService) { 17 | this.paymentService = paymentService; 18 | this.refundService = refundService; 19 | } 20 | /** 21 | * Создает платеж через YooKassa. 22 | * Этот метод отправляет запрос на создание нового платежа с данными из `paymentData`. 23 | * Возвращает информацию о созданном платеже. 24 | * 25 | * @param {PaymentCreateRequest} paymentData - Данные для создания платежа. 26 | * @returns {Promise} Ответ от API с деталями платежа. 27 | * 28 | * @example 29 | * ```ts 30 | * const paymentData: PaymentCreateRequest = { 31 | * amount: { 32 | * value: 1000, 33 | * currency: 'RUB' 34 | * }, 35 | * description: 'Test payment', 36 | * payment_method_data: { 37 | * type: PaymentMethodsEnum.yoo_money, 38 | * }, 39 | * confirmation: { 40 | * type: 'redirect', 41 | * return_url: 'https://example.com/thanks' 42 | * }, 43 | * capture: false, 44 | * }; 45 | * const paymentResponse = await this.yookassaService.createPayment(paymentData); 46 | * console.log(paymentResponse); 47 | * ``` 48 | */ 49 | async createPayment(paymentData) { 50 | return await this.paymentService.create(paymentData); 51 | } 52 | /** 53 | * Получает список платежей. 54 | * Этот метод используется для получения списка всех платежей с возможностью пагинации. 55 | * 56 | * @param {number} limit - Максимальное количество платежей на страницу. 57 | * @param {string} from - Начальная дата для фильтрации. 58 | * @param {string} to - Конечная дата для фильтрации. 59 | * @returns {Promise} Список платежей. 60 | * 61 | * @example 62 | * ```ts 63 | * const payments = await this.yookassaService.getPayments(10, '2025-01-01', '2025-01-17'); 64 | * console.log(payments); 65 | * ``` 66 | */ 67 | async getPayments(limit, from, to) { 68 | return await this.paymentService.getAll(limit, from, to); 69 | } 70 | /** 71 | * Получает детали платежа по его ID. 72 | * Этот метод позволяет получить подробную информацию о платеже, включая его статус, сумму и другие данные. 73 | * 74 | * @param {string} paymentId - Уникальный идентификатор платежа, для которого нужно получить детали. 75 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже. 76 | * 77 | * @example 78 | * ```ts 79 | * const paymentId = '123456'; 80 | * const paymentDetails = await this.yookassaService.getPaymentDetails(paymentId); 81 | * console.log(paymentDetails); 82 | * ``` 83 | */ 84 | async getPaymentDetails(paymentId) { 85 | return await this.paymentService.getOne(paymentId); 86 | } 87 | /** 88 | * Выполняет захват платежа. 89 | * Этот метод используется для захвата средств с карты клиента после того, как был создан платеж. 90 | * Обычно это делается, когда заказ подтвержден, и продавец готов забрать средства. 91 | * Возвращает обновленные детали платежа после захвата средств. 92 | * 93 | * @param {string} paymentId - Уникальный идентификатор платежа, который нужно захватить. 94 | * @param {Amount} amount - Сумма, которую необходимо захватить. Если сумма равна нулю, захватится полная сумма платежа. 95 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже после захвата. 96 | * 97 | * @example 98 | * ```ts 99 | * const paymentId = '123456'; 100 | * const amount: Amount = { 101 | * value: 1000, 102 | * currency: 'RUB', 103 | * }; 104 | * const paymentDetails = await this.yookassaService.capturePayment(paymentId, amount); 105 | * console.log(paymentDetails); 106 | * ``` 107 | */ 108 | async capturePayment(paymentId) { 109 | return await this.paymentService.capture(paymentId); 110 | } 111 | /** 112 | * Отменяет платеж. 113 | * Этот метод используется для отмены платежа. 114 | * 115 | * @param {string} paymentId - ID платежа. 116 | * @returns {Promise} Детали отмененного платежа. 117 | * 118 | * @example 119 | * ```ts 120 | * const paymentId = '123456'; 121 | * const canceledPaymentDetails = await this.yookassaService.cancelPayment(paymentId); 122 | * console.log(canceledPaymentDetails); 123 | * ``` 124 | */ 125 | async cancelPayment(paymentId) { 126 | return await this.paymentService.cancel(paymentId); 127 | } 128 | /** 129 | * Создает возврат средств по указанному платежу. 130 | * Этот метод отправляет запрос на создание возврата с данными из `refundData`. 131 | * 132 | * @param {RefundCreateRequest} refundData - Данные для создания возврата. 133 | * @returns {Promise} Ответ от API с деталями созданного возврата. 134 | * 135 | * @example 136 | * ```ts 137 | * const refundData: RefundCreateRequest = { 138 | * payment_id: '123456', 139 | * description: 'Возврат за отмененный заказ', 140 | * }; 141 | * const refundResponse = await this.yookassaService.createRefund(refundData); 142 | * console.log(refundResponse); 143 | * ``` 144 | */ 145 | async createRefund(refundData) { 146 | return await this.refundService.create(refundData); 147 | } 148 | /** 149 | * Получает список всех возвратов. 150 | * Возвращает массив объектов с информацией о возвратах. 151 | * 152 | * @param {number} limit - Максимальное количество платежей на страницу. 153 | * @param {string} from - Начальная дата для фильтрации. 154 | * @param {string} to - Конечная дата для фильтрации. 155 | * @returns {Promise} Массив объектов с деталями возвратов. 156 | * 157 | * @example 158 | * ```ts 159 | * const refunds = await this.yookassaService.getRefunds(10, '2025-01-01', '2025-01-17'); 160 | * console.log(refunds); 161 | * ``` 162 | */ 163 | async getRefunds(limit, from, to) { 164 | return await this.refundService.getAll(limit, from, to); 165 | } 166 | /** 167 | * Получает детали возврата по его ID. 168 | * Этот метод возвращает подробную информацию о возврате, включая его статус и сумму. 169 | * 170 | * @param {string} refundId - Уникальный идентификатор возврата. 171 | * @returns {Promise} Объект с деталями возврата. 172 | * 173 | * @example 174 | * ```ts 175 | * const refundId = 'refund-id'; 176 | * const refundDetails = await this.yookassaService.getRefundDetails(refundId); 177 | * console.log(refundDetails); 178 | * ``` 179 | * @throws {NotFoundException} Если возврат с указанным ID не найден. 180 | */ 181 | async getRefundDetails(refundId) { 182 | return await this.refundService.getOne(refundId); 183 | } 184 | }; 185 | exports.YookassaService = YookassaService; 186 | exports.YookassaService = YookassaService = __decorate([ 187 | (0, common_1.Injectable)(), 188 | __metadata("design:paramtypes", [services_1.PaymentService, 189 | services_1.RefundService]) 190 | ], YookassaService); 191 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nestjs-yookassa", 3 | "version": "1.1.20", 4 | "description": "A NestJS library for integrating with YooKassa API", 5 | "keywords": [ 6 | "nest", 7 | "nestjs", 8 | "nestjs-module", 9 | "yookassa", 10 | "payment" 11 | ], 12 | "homepage": "https://nestjs-yookassa.ru", 13 | "repository": "git@github.com:teacoder-team/nestjs-yookassa.git", 14 | "license": "MIT", 15 | "author": { 16 | "name": "TeaCoder", 17 | "url": "https://teacoder.ru" 18 | }, 19 | "contributors": [ 20 | { 21 | "name": "Vadim Nechaev", 22 | "email": "help@teacoder.ru" 23 | } 24 | ], 25 | "main": "./dist/index.js", 26 | "types": "./dist/index.d.ts", 27 | "files": [ 28 | "dist" 29 | ], 30 | "scripts": { 31 | "build": "tsc -p tsconfig.json", 32 | "precommit": "lint-staged", 33 | "prepublish:npm": "npm run build", 34 | "publish:npm": "npm publish --access public" 35 | }, 36 | "dependencies": { 37 | "@nestjs/axios": "^3.1.2", 38 | "axios": "^1.7.7", 39 | "rxjs": "^7.8.1", 40 | "uuid": "^11.0.3" 41 | }, 42 | "husky": { 43 | "hooks": { 44 | "pre-commit": "lint-staged", 45 | "commit-msg": "commitlint -c .commitlintrc.json -E HUSKY_GIT_PARAMS" 46 | } 47 | }, 48 | "devDependencies": { 49 | "@nestjs/cli": "^10.0.0", 50 | "@nestjs/common": "^10.4.8", 51 | "@nestjs/core": "^10.4.8", 52 | "@nestjs/testing": "^10.0.0", 53 | "@types/express": "^4.17.17", 54 | "@types/jest": "^29.5.2", 55 | "@types/node": "^20.3.1", 56 | "@types/supertest": "^2.0.12", 57 | "@typescript-eslint/eslint-plugin": "^6.0.0", 58 | "@typescript-eslint/parser": "^6.0.0", 59 | "eslint": "^8.42.0", 60 | "eslint-config-prettier": "^9.0.0", 61 | "eslint-plugin-prettier": "^5.0.0", 62 | "husky": "^9.1.7", 63 | "jest": "^29.5.0", 64 | "prettier": "^3.0.0", 65 | "reflect-metadata": "^0.1.13", 66 | "source-map-support": "^0.5.21", 67 | "supertest": "^6.3.3", 68 | "ts-jest": "^29.1.0", 69 | "ts-loader": "^9.4.3", 70 | "ts-node": "^10.9.1", 71 | "tsconfig-paths": "^4.2.0", 72 | "typescript": "^5.1.3" 73 | }, 74 | "peerDependencies": { 75 | "@nestjs/common": "^9.0.0 || ^10.0.0", 76 | "@nestjs/core": "^9.0.0 || ^10.0.0", 77 | "reflect-metadata": "^0.2.2", 78 | "typescript": "^4.1.2 || ^5.0.0" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces' 2 | export * from './services' 3 | 4 | export * from './yookassa.constants' 5 | export * from './yookassa.module' 6 | export * from './yookassa.service' 7 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/common.interface.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Перечисление поддерживаемых локалей. 3 | * Каждая локаль представляет собой комбинацию языка и страны. 4 | * @enum {string} 5 | */ 6 | export enum LocaleEnum { 7 | /** 8 | * Русский язык. 9 | */ 10 | ru_RU = 'ru_RU', 11 | 12 | /** 13 | * Английский язык. 14 | */ 15 | en_US = 'en_US' 16 | } 17 | 18 | /** 19 | * Перечисление поддерживаемых валют. 20 | * Каждая валюта представлена в виде трехбуквенного кода. 21 | * @enum {string} 22 | */ 23 | export enum CurrencyEnum { 24 | USD = 'USD', // Доллар США 25 | CAD = 'CAD', // Канадский доллар 26 | EUR = 'EUR', // Евро 27 | AED = 'AED', // Дирхам ОАЭ 28 | AFN = 'AFN', // Афгани 29 | ALL = 'ALL', // Албанский лек 30 | AMD = 'AMD', // Армянский драм 31 | ARS = 'ARS', // Аргентинский песо 32 | AUD = 'AUD', // Австралийский доллар 33 | AZN = 'AZN', // Азербайджанский манат 34 | BAM = 'BAM', // Конвертируемая марка (Босния и Герцеговина) 35 | BDT = 'BDT', // Бангладешская така 36 | BGN = 'BGN', // Болгарский лев 37 | BHD = 'BHD', // Бахрейнский динар 38 | BIF = 'BIF', // Бурундийский франк 39 | BND = 'BND', // Брунейский доллар 40 | BOB = 'BOB', // Боливийский боливиано 41 | BRL = 'BRL', // Бразильский реал 42 | BWP = 'BWP', // Ботсванская пула 43 | BYN = 'BYN', // Белорусский рубль 44 | BZD = 'BZD', // Белизский доллар 45 | CDF = 'CDF', // Конголезский франк 46 | CHF = 'CHF', // Швейцарский франк 47 | CLP = 'CLP', // Чилийский песо 48 | CNY = 'CNY', // Китайский юань 49 | COP = 'COP', // Колумбийский песо 50 | CRC = 'CRC', // Коста-риканский колон 51 | CVE = 'CVE', // Эскудо Кабо-Верде 52 | CZK = 'CZK', // Чешская крона 53 | DJF = 'DJF', // Франк Джибути 54 | DKK = 'DKK', // Датская крона 55 | DOP = 'DOP', // Доминиканский песо 56 | DZD = 'DZD', // Алжирский динар 57 | EEK = 'EEK', // Эстонская крона 58 | EGP = 'EGP', // Египетский фунт 59 | ERN = 'ERN', // Эритрейская накфа 60 | ETB = 'ETB', // Эфиопский бирр 61 | GBP = 'GBP', // Фунт стерлингов 62 | GEL = 'GEL', // Грузинский лари 63 | GHS = 'GHS', // Ганский седи 64 | GNF = 'GNF', // Гвинейский франк 65 | GTQ = 'GTQ', // Гватемальский кетсаль 66 | HKD = 'HKD', // Гонконгский доллар 67 | HNL = 'HNL', // Гондурасская лемпира 68 | HRK = 'HRK', // Хорватская куна 69 | HUF = 'HUF', // Венгерский форинт 70 | IDR = 'IDR', // Индонезийская рупия 71 | ILS = 'ILS', // Израильский шекель 72 | INR = 'INR', // Индийская рупия 73 | IQD = 'IQD', // Иракский динар 74 | IRR = 'IRR', // Иранский риал 75 | ISK = 'ISK', // Исландская крона 76 | JMD = 'JMD', // Ямайский доллар 77 | JOD = 'JOD', // Иорданский динар 78 | JPY = 'JPY', // Японская иена 79 | KES = 'KES', // Кенийский шиллинг 80 | KHR = 'KHR', // Камбоджийский риель 81 | KMF = 'KMF', // Франк Коморских островов 82 | KRW = 'KRW', // Южнокорейская вона 83 | KWD = 'KWD', // Кувейтский динар 84 | KZT = 'KZT', // Казахстанский тенге 85 | LBP = 'LBP', // Ливанский фунт 86 | LKR = 'LKR', // Шри-ланкийская рупия 87 | LTL = 'LTL', // Литовский лит 88 | LVL = 'LVL', // Латвийский лат 89 | LYD = 'LYD', // Ливийский динар 90 | MAD = 'MAD', // Марокканский дирхам 91 | MDL = 'MDL', // Молдавский лей 92 | MGA = 'MGA', // Мадагаскарский ариари 93 | MKD = 'MKD', // Македонский денар 94 | MMK = 'MMK', // Мьянмский кьят 95 | MOP = 'MOP', // Патака Макао 96 | MUR = 'MUR', // Маврикийская рупия 97 | MXN = 'MXN', // Мексиканское песо 98 | MYR = 'MYR', // Малайзийский ринггит 99 | MZN = 'MZN', // Мозамбикское метикал 100 | NAD = 'NAD', // Намибийский доллар 101 | NGN = 'NGN', // Нигерийская найра 102 | NIO = 'NIO', // Никарагуанская кордоба 103 | NOK = 'NOK', // Норвежская крона 104 | NPR = 'NPR', // Непальская рупия 105 | NZD = 'NZD', // Новозеландский доллар 106 | OMR = 'OMR', // Оманский риал 107 | PAB = 'PAB', // Панамский балбоа 108 | PEN = 'PEN', // Перуанский соль 109 | PHP = 'PHP', // Филиппинское песо 110 | PKR = 'PKR', // Пакистанская рупия 111 | PLN = 'PLN', // Польский злотый 112 | PYG = 'PYG', // Парагвайский гуарани 113 | QAR = 'QAR', // Катарский риал 114 | RON = 'RON', // Румынский лей 115 | RSD = 'RSD', // Сербский динар 116 | RUB = 'RUB', // Российский рубль 117 | RWF = 'RWF', // Руандийский франк 118 | SAR = 'SAR', // Саудовский риал 119 | SDG = 'SDG', // Суданский фунт 120 | SEK = 'SEK', // Шведская крона 121 | SGD = 'SGD', // Сингапурский доллар 122 | SOS = 'SOS', // Сомалийский шиллинг 123 | SYP = 'SYP', // Сирийский фунт 124 | THB = 'THB', // Таиландский бат 125 | TND = 'TND', // Тунисский динар 126 | TOP = 'TOP', // Тонгана паанга 127 | TRY = 'TRY', // Турецкая лира 128 | TTD = 'TTD', // Тринидад и Тобаго доллар 129 | TWD = 'TWD', // Новый тайваньский доллар 130 | TZS = 'TZS', // Танзанийский шиллинг 131 | UAH = 'UAH', // Украинская гривна 132 | UGX = 'UGX', // Угандийский шиллинг 133 | UYU = 'UYU', // Уругвайское песо 134 | UZS = 'UZS', // Узбекский сум 135 | VEF = 'VEF', // Венесуэльский боливар 136 | VND = 'VND', // Вьетнамский донг 137 | XAF = 'XAF', // Франк Центральноафриканского CFA 138 | XOF = 'XOF', // Франк Западноафриканского CFA 139 | YER = 'YER', // Йеменский риал 140 | ZAR = 'ZAR', // Южноафриканский рэнд 141 | ZMK = 'ZMK', // Замбийская квача 142 | ZWL = 'ZWL' // Зимбабвийский доллар 143 | } 144 | 145 | /** 146 | * Тип, представляющий сумму и валюту для платежа. 147 | */ 148 | export interface Amount { 149 | /** 150 | * Значение суммы. 151 | */ 152 | value: number 153 | /** 154 | * Валюта суммы, представленная кодом валюты из перечисления `CurrencyEnum`. 155 | */ 156 | currency: CurrencyEnum 157 | } 158 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/confirmation.interface.ts: -------------------------------------------------------------------------------- 1 | import type { LocaleEnum } from './common.interface' 2 | 3 | /** 4 | * Тип подтверждения, который может быть одним из нескольких типов. 5 | * @type {ConfirmationRedirect | ConfirmationEmbedded | ConfirmationQR | ConfirmationExternal | ConfirmationMobileApp} 6 | */ 7 | export type Confirmation = 8 | | ConfirmationEmbedded 9 | | ConfirmationExternal 10 | | ConfirmationMobileApp 11 | | ConfirmationQR 12 | | ConfirmationRedirect 13 | 14 | /** 15 | * Перечисление типов подтверждений платежа. 16 | * Эти типы могут быть использованы для различных способов подтверждения транзакций. 17 | * @enum {string} 18 | */ 19 | export enum ConfirmationEnum { 20 | /** 21 | * Встроенная форма подтверждения. 22 | */ 23 | embedded = 'embedded', 24 | 25 | /** 26 | * Внешняя форма подтверждения. 27 | */ 28 | external = 'external', 29 | 30 | /** 31 | * Подтверждение через мобильное приложение. 32 | */ 33 | mobile_application = 'mobile_application', 34 | 35 | /** 36 | * Подтверждение через QR код. 37 | */ 38 | qr = 'qr', 39 | 40 | /** 41 | * Подтверждение через редирект на внешний сайт. 42 | */ 43 | redirect = 'redirect' 44 | } 45 | 46 | /** 47 | * Тип для подтверждения через встроенную форму. 48 | * Используется при встроенном подтверждении внутри текущего приложения. 49 | */ 50 | export interface ConfirmationEmbedded { 51 | /** 52 | * Тип подтверждения — встроенная форма. 53 | */ 54 | type: ConfirmationEnum.embedded 55 | 56 | /** 57 | * Локализация, которая должна быть использована. 58 | * Необязательное поле. 59 | */ 60 | locale?: LocaleEnum 61 | } 62 | 63 | /** 64 | * Тип для подтверждения через внешний источник. 65 | */ 66 | export interface ConfirmationExternal { 67 | /** 68 | * Тип подтверждения — внешний источник. 69 | */ 70 | type: ConfirmationEnum.external 71 | 72 | /** 73 | * Локализация, которая должна быть использована. 74 | * Необязательное поле. 75 | */ 76 | locale?: LocaleEnum 77 | } 78 | 79 | /** 80 | * Тип для подтверждения через мобильное приложение. 81 | */ 82 | export interface ConfirmationMobileApp { 83 | /** 84 | * Тип подтверждения — мобильное приложение. 85 | */ 86 | type: ConfirmationEnum.mobile_application 87 | 88 | /** 89 | * Локализация, которая должна быть использована. 90 | * Необязательное поле. 91 | */ 92 | locale?: LocaleEnum 93 | 94 | /** 95 | * URL возврата после подтверждения. 96 | */ 97 | return_url: string 98 | } 99 | 100 | /** 101 | * Тип для подтверждения через QR код. 102 | */ 103 | export interface ConfirmationQR { 104 | /** 105 | * Тип подтверждения — QR код. 106 | */ 107 | type: ConfirmationEnum.qr 108 | 109 | /** 110 | * Локализация, которая должна быть использована. 111 | * Необязательное поле. 112 | */ 113 | locale?: LocaleEnum 114 | 115 | /** 116 | * URL возврата после подтверждения. 117 | */ 118 | return_url: string 119 | } 120 | 121 | /** 122 | * Тип для подтверждения через редирект. 123 | * Используется при необходимости перенаправить пользователя на внешний URL для подтверждения. 124 | */ 125 | export interface ConfirmationRedirect { 126 | /** 127 | * Тип подтверждения — редирект. 128 | */ 129 | type: ConfirmationEnum.redirect 130 | 131 | /** 132 | * Принудительное подтверждение. 133 | * Необязательное поле. 134 | */ 135 | enforce?: boolean 136 | 137 | /** 138 | * Локализация, которая должна быть использована. 139 | * Необязательное поле. 140 | */ 141 | locale?: LocaleEnum 142 | 143 | /** 144 | * URL возврата после подтверждения. 145 | */ 146 | return_url: string 147 | } 148 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common.interface' 2 | export * from './yookassa-options.interface' 3 | 4 | // export * from './receipt-details.interface' 5 | // export * from './receipt-request.interface' 6 | 7 | export * from './confirmation.interface' 8 | export * from './payment-details.interface' 9 | export * from './payment-method.interface' 10 | export * from './payment-request.interface' 11 | 12 | export * from './refund-details.interface' 13 | export * from './refund-request.interface' 14 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/payment-details.interface.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface' 2 | import type { Confirmation } from './confirmation.interface' 3 | import type { PaymentMethod } from './payment-method.interface' 4 | import type { ReceiptRegistrationEnum } from './receipt-details.interface' 5 | 6 | /** 7 | * Перечисление возможных статусов платежа. 8 | * @enum {string} 9 | */ 10 | export enum PaymentStatusEnum { 11 | /** 12 | * Платеж ожидает обработки. 13 | */ 14 | PENDING = 'pending', 15 | 16 | /** 17 | * Платеж ожидает захвата. 18 | */ 19 | WAITING_FOR_CAPTURE = 'waiting_for_capture', 20 | 21 | /** 22 | * Платеж успешно завершен. 23 | */ 24 | SUCCEEDED = 'succeeded', 25 | 26 | /** 27 | * Платеж отменен. 28 | */ 29 | CANCELED = 'canceled' 30 | } 31 | 32 | /** 33 | * Инициаторы отмены платежа. 34 | */ 35 | export enum CancellationPartyEnum { 36 | /** 37 | * Продавец товаров и услуг (вы). 38 | */ 39 | MERCHANT = 'merchant', 40 | 41 | /** 42 | * ЮKassa. 43 | */ 44 | YOO_MONEY = 'yoo_money', 45 | 46 | /** 47 | * Любые участники процесса платежа, кроме ЮKassa и продавца 48 | * (например, эмитент, сторонний платежный сервис). 49 | */ 50 | PAYMENT_NETWORK = 'payment_network' 51 | } 52 | 53 | /** 54 | * Причины отмены платежа. 55 | */ 56 | export enum CancellationReasonEnum { 57 | /** Не пройдена аутентификация по 3-D Secure. */ 58 | THREE_D_SECURE_FAILED = '3d_secure_failed', 59 | 60 | /** Оплата данным платежным средством отклонена по неизвестным причинам. */ 61 | CALL_ISSUER = 'call_issuer', 62 | 63 | /** Платеж отменен по API при оплате в две стадии. */ 64 | CANCELED_BY_MERCHANT = 'canceled_by_merchant', 65 | 66 | /** Истек срок действия банковской карты. */ 67 | CARD_EXPIRED = 'card_expired', 68 | 69 | /** Запрет оплаты банковской картой, выпущенной в этой стране. */ 70 | COUNTRY_FORBIDDEN = 'country_forbidden', 71 | 72 | /** Закончился срок жизни сделки (для безопасной сделки). */ 73 | DEAL_EXPIRED = 'deal_expired', 74 | 75 | /** Истек срок списания оплаты у двухстадийного платежа. */ 76 | EXPIRED_ON_CAPTURE = 'expired_on_capture', 77 | 78 | /** Истек срок оплаты: пользователь не подтвердил платеж вовремя. */ 79 | EXPIRED_ON_CONFIRMATION = 'expired_on_confirmation', 80 | 81 | /** Платеж заблокирован из-за подозрения в мошенничестве. */ 82 | FRAUD_SUSPECTED = 'fraud_suspected', 83 | 84 | /** Причина не детализирована. */ 85 | GENERAL_DECLINE = 'general_decline', 86 | 87 | /** Превышены ограничения на платежи для кошелька ЮMoney. */ 88 | IDENTIFICATION_REQUIRED = 'identification_required', 89 | 90 | /** Не хватает денег для оплаты. */ 91 | INSUFFICIENT_FUNDS = 'insufficient_funds', 92 | 93 | /** Технические неполадки на стороне ЮKassa. */ 94 | INTERNAL_TIMEOUT = 'internal_timeout', 95 | 96 | /** Неправильно указан номер карты. */ 97 | INVALID_CARD_NUMBER = 'invalid_card_number', 98 | 99 | /** Неправильно указан код CVV2 (CVC2, CID). */ 100 | INVALID_CSC = 'invalid_csc', 101 | 102 | /** Организация, выпустившая платежное средство, недоступна. */ 103 | ISSUER_UNAVAILABLE = 'issuer_unavailable', 104 | 105 | /** Исчерпан лимит платежей для данного платежного средства или магазина. */ 106 | PAYMENT_METHOD_LIMIT_EXCEEDED = 'payment_method_limit_exceeded', 107 | 108 | /** Запрещены операции данным платежным средством. */ 109 | PAYMENT_METHOD_RESTRICTED = 'payment_method_restricted', 110 | 111 | /** Пользователь отозвал разрешение на автоплатежи. */ 112 | PERMISSION_REVOKED = 'permission_revoked', 113 | 114 | /** Нельзя заплатить с номера телефона этого мобильного оператора. */ 115 | UNSUPPORTED_MOBILE_OPERATOR = 'unsupported_mobile_operator' 116 | } 117 | 118 | /** 119 | * Информация об отмене платежа. 120 | * Содержит комментарий к статусу canceled: кто отменил платеж и по какой причине. 121 | */ 122 | export interface CancellationDetails { 123 | /** 124 | * Участник процесса платежа, который принял решение об отмене транзакции. 125 | */ 126 | party: CancellationPartyEnum 127 | 128 | /** 129 | * Причина отмены платежа. 130 | */ 131 | reason: CancellationReasonEnum 132 | } 133 | 134 | /** 135 | * Статусы распределения денег между магазинами. 136 | */ 137 | export enum TransferStatusEnum { 138 | /** Ожидает обработки. */ 139 | PENDING = 'pending', 140 | 141 | /** Ожидает подтверждения списания. */ 142 | WAITING_FOR_CAPTURE = 'waiting_for_capture', 143 | 144 | /** Успешно завершено. */ 145 | SUCCEEDED = 'succeeded', 146 | 147 | /** Отменено. */ 148 | CANCELED = 'canceled' 149 | } 150 | 151 | /** 152 | * Операция распределения платежа — перечисление денег магазину. 153 | */ 154 | export interface Settlement { 155 | /** 156 | * Тип операции. Всегда "payout". 157 | */ 158 | type: 'payout' 159 | 160 | /** 161 | * Сумма вознаграждения продавца. 162 | */ 163 | amount: Amount 164 | 165 | /** 166 | * Идентификатор покупателя в вашей системе, 167 | * например электронная почта или номер телефона. 168 | * Не более 200 символов. 169 | * Необязательное поле. 170 | */ 171 | merchant_customer_id?: string 172 | } 173 | 174 | /** 175 | * Данные о сделке, в составе которой проходит платеж. 176 | */ 177 | interface Deal { 178 | /** 179 | * Идентификатор сделки. 180 | */ 181 | id: string 182 | 183 | /** 184 | * Данные о распределении денег (массив операций). 185 | */ 186 | settlements: Settlement[] 187 | } 188 | 189 | /** 190 | * Данные о счете, в рамках которого проведен платеж. 191 | */ 192 | export interface InvoiceDetails { 193 | /** 194 | * Идентификатор счета в ЮKassa. 195 | * Необязательное поле. 196 | */ 197 | id?: string 198 | } 199 | 200 | /** 201 | * Данные о распределении денег — сколько и в какой магазин нужно перевести. 202 | */ 203 | export interface Transfer { 204 | /** 205 | * Идентификатор магазина, в пользу которого принимается оплата. 206 | */ 207 | account_id: string 208 | 209 | /** 210 | * Сумма, которую необходимо перечислить магазину. 211 | */ 212 | amount: Amount 213 | 214 | /** 215 | * Статус распределения денег между магазинами. 216 | */ 217 | status: TransferStatusEnum 218 | 219 | /** 220 | * Комиссия за проданные товары и услуги, удерживаемая с магазина в вашу пользу. 221 | * Необязательное поле. 222 | */ 223 | platform_fee_amount?: Amount 224 | 225 | /** 226 | * Описание транзакции (не более 128 символов), 227 | * которое продавец увидит в личном кабинете ЮKassa. 228 | * Например: «Заказ маркетплейса №72». 229 | * Необязательное поле. 230 | */ 231 | description?: string 232 | 233 | /** 234 | * Дополнительные данные для вашей системы, 235 | * передаются в виде набора пар «ключ-значение», 236 | * максимум 16 ключей, имя ключа не более 32 символов, 237 | * значение ключа не более 512 символов. 238 | * Необязательное поле. 239 | */ 240 | metadata?: Record 241 | } 242 | 243 | /** 244 | * Данные о прохождении аутентификации по 3‑D Secure. 245 | */ 246 | export interface ThreeDSecure { 247 | /** 248 | * Отображение пользователю формы для прохождения аутентификации по 3‑D Secure. 249 | * true — форма была показана пользователю, 250 | * false — платеж проходил без аутентификации по 3‑D Secure. 251 | */ 252 | applied: boolean 253 | } 254 | 255 | /** 256 | * Данные об авторизации платежа при оплате банковской картой. 257 | * Присутствуют только для способов оплаты: банковская карта, Mir Pay, SberPay, T-Pay. 258 | */ 259 | export interface AuthorizationDetails { 260 | /** 261 | * Retrieval Reference Number — идентификатор банковской транзакции. 262 | * Необязательное поле. 263 | */ 264 | rrn?: string 265 | 266 | /** 267 | * Код авторизации, выдается эмитентом и подтверждает проведение авторизации. 268 | * Необязательное поле. 269 | */ 270 | auth_code?: string 271 | 272 | /** 273 | * Данные о прохождении пользователем аутентификации по 3‑D Secure. 274 | */ 275 | three_d_secure: ThreeDSecure 276 | 277 | /** 278 | * Данные о распределении денег — сколько и в какой магазин нужно перевести. 279 | * Присутствует, если используется Сплитование платежей. 280 | * Необязательное поле. 281 | */ 282 | transfers?: Transfer[] 283 | 284 | /** 285 | * Данные о сделке, в составе которой проходит платеж. 286 | * Присутствует, если проводится Безопасная сделка. 287 | * Необязательное поле. 288 | */ 289 | deal?: Deal 290 | 291 | /** 292 | * Данные о выставленном счете, в рамках которого проведен платеж. 293 | * Необязательное поле. 294 | */ 295 | invoice_details?: InvoiceDetails 296 | } 297 | 298 | /** 299 | * Тип, представляющий информацию о платеже. 300 | */ 301 | export interface PaymentDetails { 302 | /** 303 | * Идентификатор платежа. 304 | */ 305 | id: string 306 | 307 | /** 308 | * Статус платежа. 309 | */ 310 | status: PaymentStatusEnum 311 | 312 | /** 313 | * Сумма платежа. 314 | */ 315 | amount: Amount 316 | 317 | /** 318 | * Сумма, полученная от платежа. 319 | * Необязательное поле. 320 | */ 321 | income_amount?: Amount 322 | 323 | /** 324 | * Описание платежа. 325 | * Необязательное поле. 326 | */ 327 | description?: string 328 | 329 | /** 330 | * Информация о получателе платежа. 331 | */ 332 | recipient: { 333 | /** 334 | * Идентификатор аккаунта получателя. 335 | */ 336 | account_id: string 337 | 338 | /** 339 | * Идентификатор шлюза получателя. 340 | */ 341 | gateway_id: string 342 | } 343 | 344 | /** 345 | * Метод платежа. 346 | * Необязательное поле. 347 | */ 348 | payment_method?: PaymentMethod 349 | 350 | /** 351 | * Время захвата платежа. 352 | * Необязательное поле. 353 | */ 354 | captured_at?: string 355 | 356 | /** 357 | * Время создания платежа. 358 | */ 359 | created_at: string 360 | 361 | /** 362 | * Время истечения срока действия платежа. 363 | * Необязательное поле. 364 | */ 365 | expires_at?: string 366 | 367 | /** 368 | * Подтверждение платежа. 369 | * Необязательное поле. 370 | */ 371 | confirmation?: Confirmation 372 | 373 | /** 374 | * Является ли платеж тестовым. 375 | */ 376 | test: boolean 377 | 378 | /** 379 | * Сумма возврата, если она есть. 380 | * Необязательное поле. 381 | */ 382 | refunded_amount?: Amount 383 | 384 | /** 385 | * Был ли платеж произведен. 386 | */ 387 | paid: boolean 388 | 389 | /** 390 | * Может ли платеж быть возвращен. 391 | */ 392 | refundable: boolean 393 | 394 | /** 395 | * Статус регистрации чека. 396 | * Необязательное поле. 397 | */ 398 | receipt_registration?: ReceiptRegistrationEnum 399 | 400 | /** 401 | * Дополнительные метаданные платежа. 402 | * Необязательное поле. 403 | */ 404 | metadata?: object 405 | 406 | /** 407 | * Информация об отмене платежа. 408 | * Необязательное поле. 409 | */ 410 | cancellation_details?: CancellationDetails 411 | 412 | /** 413 | * Данные об авторизации платежа при оплате банковской картой. 414 | * Присутствуют только для способов оплаты: банковская карта, Mir Pay, SberPay, T-Pay. 415 | * Необязательное поле. 416 | */ 417 | authorization_details?: AuthorizationDetails 418 | 419 | /** 420 | * Данные о распределении денег — сколько и в какой магазин нужно перевести. 421 | * Необязательное поле. 422 | */ 423 | transfers?: Transfer 424 | 425 | /** 426 | * Данные о сделке, в составе которой проходит платеж. 427 | * Необязательное поле. 428 | */ 429 | deal?: Deal 430 | 431 | /** 432 | * Идентификатор покупателя в вашей системе, например электронная почта или номер телефона. 433 | * Необязательное поле. 434 | */ 435 | merchant_customer_id?: string 436 | } 437 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/payment-method.interface.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface' 2 | 3 | /** 4 | * Тип для метода оплаты, который может быть одним из нескольких типов. 5 | * @type {PaymentMethodSberLoan | PaymentMethodMobileBalance | PaymentMethodCard | PaymentMethodCash | PaymentMethodSbp | PaymentMethodB2bSberbank | PaymentMethodElectronicСertificate | PaymentMethodYooMoney | PaymentMethodSberbank | PaymentMethodTinkoffBank} 6 | */ 7 | export type PaymentMethod = 8 | | PaymentMethodSberLoan 9 | | PaymentMethodMobileBalance 10 | | PaymentMethodCard 11 | | PaymentMethodCash 12 | | PaymentMethodSbp 13 | | PaymentMethodB2bSberbank 14 | | PaymentMethodElectronicСertificate 15 | | PaymentMethodYooMoney 16 | | PaymentMethodSberbank 17 | | PaymentMethodTinkoffBank 18 | 19 | /** 20 | * Перечисление возможных методов оплаты. 21 | * Каждый метод оплаты представлен уникальным типом. 22 | * @enum {string} 23 | */ 24 | export enum PaymentMethodsEnum { 25 | /** 26 | * «Покупки в кредит» от СберБанка 27 | */ 28 | sber_loan = 'sber_loan', 29 | 30 | /** 31 | * Баланс мобильного телефона 32 | */ 33 | mobile_balance = 'mobile_balance', 34 | 35 | /** 36 | * Банковская карта 37 | */ 38 | bank_card = 'bank_card', 39 | 40 | /** 41 | * Наличные 42 | */ 43 | cash = 'cash', 44 | 45 | /** 46 | * Система быстрых платежей 47 | */ 48 | sbp = 'sbp', 49 | 50 | /** 51 | * B2B Сбербанк 52 | */ 53 | b2b_sberbank = 'b2b_sberbank', 54 | 55 | /** 56 | * Электронный сертификат 57 | */ 58 | electronic_certificate = 'electronic_certificate', 59 | 60 | /** 61 | * YooMoney 62 | */ 63 | yoo_money = 'yoo_money', 64 | 65 | /** 66 | * Сбербанк 67 | */ 68 | sberbank = 'sberbank', 69 | 70 | /** 71 | * Альфа-Банк 72 | */ 73 | alfabank = 'alfabank', 74 | 75 | /** 76 | * Тинькофф Банк 77 | */ 78 | tinkoff_bank = 'tinkoff_bank' 79 | } 80 | 81 | export interface PaymentMethodSberLoan { 82 | /** 83 | * Тип метода — «Покупки в кредит» от СберБанка 84 | */ 85 | type: PaymentMethodsEnum.sber_loan 86 | } 87 | 88 | /** 89 | * Тип, представляющий способ оплаты через баланс мобильного телефона. 90 | */ 91 | export interface PaymentMethodMobileBalance { 92 | /** 93 | * Тип метода — мобильный баланс 94 | */ 95 | type: PaymentMethodsEnum.mobile_balance 96 | /** 97 | * Номер телефона, с которого будет списана сумма. 98 | * Указывается в формате ITU-T E.164, например 79000000000. 99 | */ 100 | phone: string 101 | } 102 | 103 | /** 104 | * Тип, представляющий способ оплаты с использованием банковской карты. 105 | */ 106 | export interface PaymentMethodCard { 107 | /** 108 | * Тип метода — банковская карта 109 | */ 110 | type: PaymentMethodsEnum.bank_card 111 | 112 | /** 113 | * Данные банковской карты (необходимы, если вы собираете данные карты пользователей на своей стороне). 114 | */ 115 | card?: { 116 | /** 117 | * Номер карты. 118 | */ 119 | number: string 120 | 121 | /** 122 | * Год истечения срока действия карты. 123 | * Необязательное поле. 124 | */ 125 | expiry_year?: string 126 | 127 | /** 128 | * Месяц истечения срока действия. 129 | */ 130 | expiry_month: string 131 | 132 | /** 133 | * Имя владельца карты. 134 | * Необязательное поле. 135 | */ 136 | cardholder?: string 137 | 138 | /** 139 | * Код безопасности карты (CVC). 140 | * Необязательное поле. 141 | */ 142 | csc?: string 143 | } 144 | } 145 | 146 | /** 147 | * Тип для подтверждения через наличные. 148 | */ 149 | export interface PaymentMethodCash { 150 | /** 151 | * Тип метода — Наличные 152 | */ 153 | type: PaymentMethodsEnum.cash 154 | /** 155 | * Номер телефона для подтверждения наличных платежей. 156 | * Необязательное поле. 157 | */ 158 | phone?: string 159 | } 160 | 161 | /** 162 | * Тип для подтверждения через СБП (Система быстрых платежей). 163 | */ 164 | export interface PaymentMethodSbp { 165 | /** 166 | * Тип метода — Система быстрых платежей 167 | */ 168 | type: PaymentMethodsEnum.sbp 169 | } 170 | 171 | /** 172 | * Тип для подтверждения через B2B Сбербанк. 173 | */ 174 | export interface PaymentMethodB2bSberbank { 175 | /** 176 | * Тип метода — B2B Сбербанк 177 | */ 178 | type: PaymentMethodsEnum.b2b_sberbank 179 | 180 | /** 181 | * Назначение платежа. 182 | */ 183 | payment_purpose: string 184 | 185 | /** 186 | * Данные о НДС. 187 | */ 188 | vat_data: { 189 | /** 190 | * Тип НДС. 191 | */ 192 | type: 'mixed' | 'calculated' | 'untaxed' 193 | rate: number 194 | 195 | /** 196 | * Сумма НДС. 197 | * Необязательное поле. 198 | */ 199 | amount?: Amount 200 | } 201 | } 202 | 203 | /** 204 | * Тип для подтверждения с использованием электронного сертификата (ФЭС НСПК). 205 | */ 206 | export interface PaymentMethodElectronicСertificate { 207 | /** 208 | * Тип метода оплаты — электронный сертификат. 209 | * Значение: `electronic_certificate`. 210 | */ 211 | type: PaymentMethodsEnum.electronic_certificate 212 | 213 | /** 214 | * Корзина покупки — список товаров, которые можно оплатить по сертификату. 215 | * Необходимо передавать только при оплате на готовой странице ЮKassa. 216 | */ 217 | articles?: { 218 | /** 219 | * Порядковый номер товара в корзине (от 1 до 999 включительно). 220 | */ 221 | article_number: number 222 | 223 | /** 224 | * Код ТРУ. Формат: NNNNNNNNN.NNNNNNNNNYYYYMMMMZZZ 225 | * Пример: 329921120.06001010200080001643 226 | */ 227 | tru_code: string 228 | 229 | /** 230 | * Код товара в вашей системе. 231 | * Максимум 128 символов. 232 | */ 233 | article_code?: string 234 | 235 | /** 236 | * Название товара в вашей системе. 237 | * Отображается на форме ЮKassa. 238 | * Максимум 128 символов. 239 | */ 240 | article_name: string 241 | 242 | /** 243 | * Количество единиц товара. Целое положительное число. 244 | */ 245 | quantity: number 246 | 247 | /** 248 | * Цена за единицу товара. 249 | */ 250 | price: { 251 | /** 252 | * Сумма в валюте. Дробное значение с точкой в качестве разделителя. 253 | * Пример: "1000.00" 254 | */ 255 | value: string 256 | 257 | /** 258 | * Трехбуквенный код валюты по ISO-4217. 259 | * Пример: "RUB" 260 | */ 261 | currency: string 262 | } 263 | }[] 264 | 265 | /** 266 | * Произвольные дополнительные данные. 267 | * Максимум 16 ключей, имя ключа — до 32 символов, значение — до 512 символов. 268 | */ 269 | metadata?: Record 270 | 271 | /** 272 | * Данные банковской карты (если вы собираете данные карты на своей стороне). 273 | */ 274 | card?: { 275 | /** 276 | * Номер банковской карты. 277 | */ 278 | number: string 279 | 280 | /** 281 | * Год окончания срока действия карты (формат: YYYY). 282 | */ 283 | expiry_year: string 284 | 285 | /** 286 | * Месяц окончания срока действия карты (формат: MM). 287 | */ 288 | expiry_month: string 289 | 290 | /** 291 | * Имя владельца карты. 292 | */ 293 | cardholder?: string 294 | 295 | /** 296 | * CVC/CVV код (3–4 цифры). 297 | */ 298 | csc?: string 299 | } 300 | 301 | /** 302 | * Данные от ФЭС НСПК для оплаты по электронному сертификату. 303 | * Обязательное поле при оплате со сбором данных на вашей стороне. 304 | */ 305 | electronic_certificate?: { 306 | /** 307 | * Сумма, которую необходимо списать с электронного сертификата. 308 | * Значение из поля `totalCertAmount`, полученного при предварительном одобрении (Pre-Auth). 309 | */ 310 | amount: Amount 311 | 312 | /** 313 | * Идентификатор корзины покупки в НСПК. 314 | * Значение `purchaseBasketId`, полученное в ответе от ФЭС НСПК при Pre-Auth. 315 | */ 316 | basket_id: string 317 | } 318 | } 319 | 320 | /** 321 | * Тип для подтверждения с использованием YooMoney. 322 | */ 323 | export interface PaymentMethodYooMoney { 324 | /** 325 | * Тип метода — YooMoney 326 | */ 327 | type: PaymentMethodsEnum.yoo_money 328 | } 329 | 330 | /** 331 | * Тип для подтверждения через Сбербанк. 332 | */ 333 | export interface PaymentMethodSberbank { 334 | /** 335 | * Тип метода — Сбербанк 336 | */ 337 | type: PaymentMethodsEnum.sberbank 338 | 339 | /** 340 | * Номер телефона в Сбербанке. 341 | * Необязательное поле. 342 | */ 343 | phone?: string 344 | } 345 | 346 | /** 347 | * Тип для подтверждения через Тинькофф Банк. 348 | */ 349 | export interface PaymentMethodTinkoffBank { 350 | /** 351 | * Тип метода — Тинькофф Банк 352 | */ 353 | type: PaymentMethodsEnum.tinkoff_bank 354 | } 355 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/payment-request.interface.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface' 2 | import type { Confirmation } from './confirmation.interface' 3 | import type { PaymentMethod } from './payment-method.interface' 4 | 5 | /** 6 | * Информация о пассажире авиабилета 7 | */ 8 | export interface AirlinePassenger { 9 | /** 10 | * Имя пассажира. Используются только латинские буквы, например SERGEI. 11 | */ 12 | first_name: string 13 | 14 | /** 15 | * Фамилия пассажира. Используются только латинские буквы, например IVANOV. 16 | */ 17 | last_name: string 18 | } 19 | 20 | /** 21 | * Информация о перелёте 22 | */ 23 | export interface AirlineLeg { 24 | /** 25 | * Код аэропорта вылета по справочнику IATA, например LED. 26 | */ 27 | departure_airport: string 28 | 29 | /** 30 | * Код аэропорта прибытия по справочнику IATA, например AMS. 31 | */ 32 | destination_airport: string 33 | 34 | /** 35 | * Дата вылета в формате YYYY-MM-DD (ISO 8601). 36 | */ 37 | departure_date: string 38 | 39 | /** 40 | * Код авиакомпании по справочнику IATA. Необязательное поле. 41 | */ 42 | carrier_code?: string 43 | } 44 | 45 | /** 46 | * Объект с данными для продажи авиабилетов. 47 | * Используется только для платежей банковской картой. 48 | */ 49 | export interface AirlineInfo { 50 | /** 51 | * Уникальный номер билета. Обязателен, если известен при создании платежа. 52 | */ 53 | ticket_number?: string 54 | 55 | /** 56 | * Номер бронирования. Обязателен, если не передан ticket_number. 57 | */ 58 | booking_reference?: string 59 | 60 | /** 61 | * Список пассажиров. Необязательное поле. 62 | */ 63 | passengers?: AirlinePassenger[] 64 | 65 | /** 66 | * Список перелётов. Необязательное поле. 67 | */ 68 | legs?: AirlineLeg[] 69 | } 70 | 71 | /** 72 | * Тип, представляющий запрос на создание платежа. 73 | */ 74 | export interface PaymentCreateRequest { 75 | /** 76 | * Сумма платежа. 77 | */ 78 | amount: Amount 79 | 80 | /** 81 | * Описание платежа. 82 | * Необязательное поле. 83 | */ 84 | description?: string 85 | 86 | /** 87 | * Чек, который будет прикреплен к платежу. 88 | * Необязательное поле. 89 | */ 90 | // receipt?: { 91 | // customer: Customer 92 | // items: ReceiptItem[] 93 | // } 94 | 95 | /** 96 | * Информация о получателе платежа. 97 | * Необязательное поле. 98 | */ 99 | recipient?: { 100 | /** 101 | * Идентификатор получателя в платежной системе. 102 | */ 103 | gateway_id: string 104 | } 105 | 106 | /** 107 | * Одноразовый токен для проведения оплаты, сформированный с помощью Checkout.js или мобильного SDK 108 | * Необязательное поле. 109 | */ 110 | payment_token?: string 111 | 112 | /** 113 | * Идентификатор сохраненного способа оплаты 114 | * Необязательное поле. 115 | */ 116 | payment_method_id?: string 117 | 118 | /** 119 | * Метод платежа. 120 | * Необязательное поле. 121 | */ 122 | payment_method_data?: PaymentMethod 123 | 124 | /** 125 | * Тип подтверждения для платежа. 126 | */ 127 | confirmation: Confirmation 128 | 129 | /** 130 | * Нужно ли сохранять метод платежа для будущих платежей. 131 | * Необязательное поле. 132 | */ 133 | save_payment_method?: boolean 134 | 135 | /** 136 | * Указывает, следует ли сразу захватывать платеж. 137 | * Необязательное поле, по умолчанию false. 138 | */ 139 | capture?: boolean 140 | 141 | /** 142 | * IPv4 или IPv6-адрес пользователя. 143 | */ 144 | client_ip?: string 145 | 146 | /** 147 | * Дополнительные метаданные, связанные с платежом. 148 | * Необязательное поле. 149 | */ 150 | metadata?: object 151 | 152 | /** 153 | * Объект с данными для продажи авиабилетов. 154 | * Используется только для платежей банковской картой. 155 | * Необязательное поле. 156 | */ 157 | airline?: AirlineInfo 158 | 159 | /** 160 | * Идентификатор клиента в системе продавца. 161 | * Необязательное поле. 162 | */ 163 | merchant_customer_id?: string 164 | } 165 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/receipt-details.interface.ts: -------------------------------------------------------------------------------- 1 | import type { Amount } from './common.interface' 2 | 3 | /** 4 | * Перечисление кодов НДС (налога на добавленную стоимость). 5 | * Эти коды соответствуют различным ставкам НДС. 6 | * @enum {number} 7 | */ 8 | export enum VatCodesEnum { 9 | /** 10 | * Без НДС. 11 | */ 12 | 'ndsNone' = 1, 13 | 14 | /** 15 | * НДС 0%. 16 | */ 17 | 'nds0' = 2, 18 | 19 | /** 20 | * НДС 10%. 21 | */ 22 | 'nds10' = 3, 23 | 24 | /** 25 | * НДС 20%. 26 | */ 27 | 'nds20' = 4, 28 | 29 | /** 30 | * НДС 10/110 (для некоторых товаров). 31 | */ 32 | 'nds10/110' = 5, 33 | 34 | /** 35 | * НДС 20/120 (для некоторых товаров). 36 | */ 37 | 'nds20/120' = 6 38 | } 39 | 40 | /** 41 | * Перечисление кодов систем налогообложения. 42 | * Каждая система налогообложения имеет свой код. 43 | * @enum {number} 44 | */ 45 | export enum TaxSystemCodesEnum { 46 | /** 47 | * Общая система налогообложения. 48 | */ 49 | 'OSN' = 1, 50 | 51 | /** 52 | * Упрощенная система налогообложения 6%. 53 | */ 54 | 'USN6' = 2, 55 | 56 | /** 57 | * Упрощенная система налогообложения 15%. 58 | */ 59 | 'USN15' = 3, 60 | 61 | /** 62 | * Единый налог на вмененный доход. 63 | */ 64 | 'ENVD' = 4, 65 | 66 | /** 67 | * Единый сельскохозяйственный налог. 68 | */ 69 | 'ESN' = 5, 70 | 71 | /** 72 | * Патентная система налогообложения. 73 | */ 74 | 'PSN' = 6 75 | } 76 | 77 | /** 78 | * Перечисление состояний регистрации чека. 79 | * @enum {string} 80 | */ 81 | export enum ReceiptRegistrationEnum { 82 | /** 83 | * Ожидает регистрации 84 | */ 85 | pending = 'pending', 86 | 87 | /** 88 | * Успешно зарегистрирован 89 | */ 90 | succeeded = 'succeeded', 91 | 92 | /** 93 | * Регистрация отменена 94 | */ 95 | canceled = 'canceled' 96 | } 97 | 98 | export interface ReceiptItem { 99 | description: string 100 | quantity: number 101 | amount: Amount 102 | vat_code: VatCodesEnum 103 | payment_mode: string // Вынести в enum 104 | payment_subject: string // Вынести в enum 105 | country_of_origin_code?: string 106 | } 107 | 108 | export interface Settlement { 109 | type: 'prepayment' | 'full_payment' | 'advance' | 'credit' 110 | amount: Amount 111 | } 112 | 113 | export interface ReceiptDetails { 114 | id: string 115 | type: 'payment' | 'refund' 116 | payment_id?: string 117 | refund_id?: string 118 | status: ReceiptRegistrationEnum 119 | fiscal_document_number?: string 120 | fiscal_storage_number?: string 121 | fiscal_attribute?: string 122 | registered_at?: string 123 | fiscal_provider_id?: string 124 | tax_system_code?: TaxSystemCodesEnum 125 | items: ReceiptItem[] 126 | settlements?: Settlement[] 127 | } 128 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/receipt-request.interface.ts: -------------------------------------------------------------------------------- 1 | import type { ReceiptItem, Settlement } from './receipt-details.interface' 2 | 3 | export interface Customer { 4 | full_name?: string 5 | inn?: string 6 | email?: string 7 | phone?: string 8 | } 9 | 10 | export interface ReceiptCreateRequest { 11 | customer: Customer 12 | payment_id: string 13 | type: 'payment' | 'refund' 14 | send: boolean 15 | items: ReceiptItem[] 16 | settlements: Settlement[] 17 | } 18 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/refund-details.interface.ts: -------------------------------------------------------------------------------- 1 | import { Amount } from './common.interface' 2 | import { ReceiptRegistrationEnum } from './receipt-details.interface' 3 | 4 | export enum RefundStatusEnum { 5 | /** 6 | * Платеж в процессе. 7 | */ 8 | pending = 'pending', 9 | 10 | /** 11 | * Платеж выполнен успешно. 12 | */ 13 | succeeded = 'succeeded', 14 | 15 | /** 16 | * Платеж отменен. 17 | */ 18 | canceled = 'canceled' 19 | } 20 | 21 | /** 22 | * Детали отмены платежа. 23 | */ 24 | interface CancellationDetails { 25 | /** 26 | * Сторона, инициировавшая отмену. 27 | */ 28 | party: string 29 | 30 | /** 31 | * Причина отмены. 32 | */ 33 | reason: string 34 | } 35 | 36 | /** 37 | * Источник, с которого был произведен возврат. 38 | */ 39 | interface Source { 40 | /** 41 | * Идентификатор счета. 42 | */ 43 | account_id: string 44 | 45 | /** 46 | * Сумма возврата. 47 | */ 48 | amount: Amount 49 | } 50 | 51 | /** 52 | * Сумма, удержанная в качестве комиссии платформы. 53 | */ 54 | interface PlatformFeeAmount { 55 | /** 56 | * Значение комиссии. 57 | */ 58 | value: string 59 | 60 | /** 61 | * Валюта комиссии. 62 | */ 63 | currency: string 64 | } 65 | 66 | /** 67 | * Сделка, для которой был выполнен возврат. 68 | */ 69 | interface Deal { 70 | /** 71 | * Идентификатор сделки. 72 | */ 73 | id: string 74 | } 75 | 76 | /** 77 | * Метод возврата средств. 78 | */ 79 | export interface RefundMethod { 80 | /** 81 | * Тип метода возврата. 82 | */ 83 | type: string 84 | 85 | /** 86 | * Идентификатор операции в системе SBP (для специфичных методов). 87 | * Необязательное поле. 88 | */ 89 | sbp_operation_id?: string 90 | } 91 | 92 | export interface RefundDetails { 93 | /** 94 | * Идентификатор возврата. 95 | */ 96 | id: string 97 | 98 | /** 99 | * Статус возврата. 100 | */ 101 | status: RefundStatusEnum 102 | 103 | /** 104 | * Детали отмены, если возврат был отменен. 105 | * Необязательное поле. 106 | */ 107 | cancellation_details?: CancellationDetails 108 | 109 | /** 110 | * Регистрируется ли чек при возврате. 111 | * Необязательное поле. 112 | */ 113 | receipt_registration?: ReceiptRegistrationEnum 114 | 115 | /** 116 | * Время создания возврата. 117 | */ 118 | created_at: string 119 | 120 | /** 121 | * Сумма возврата. 122 | */ 123 | amount: Amount 124 | 125 | /** 126 | * Описание возврата. 127 | * Необязательное поле. 128 | */ 129 | description?: string 130 | 131 | /** 132 | * Источники, из которых поступили средства для возврата. 133 | * Необязательное поле. 134 | */ 135 | sources?: Source[] 136 | 137 | /** 138 | * Платежная комиссия, удержанная платформой. 139 | * Необязательное поле. 140 | */ 141 | platform_fee_amount?: PlatformFeeAmount 142 | 143 | /** 144 | * Информация о сделке, связанной с возвратом. 145 | * Необязательное поле. 146 | */ 147 | deal?: Deal 148 | 149 | /** 150 | * Способ возврата. 151 | * Необязательное поле. 152 | */ 153 | refund_method?: RefundMethod 154 | } 155 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/refund-request.interface.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Тип, представляющий запрос на создание возврата. 3 | */ 4 | export interface RefundCreateRequest { 5 | /** 6 | * Идентификатор платежа, для которого создается возврат. 7 | */ 8 | payment_id: string 9 | 10 | /** 11 | * Описание возврата. 12 | * Необязательное поле. 13 | */ 14 | description?: string 15 | } 16 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/interfaces/yookassa-options.interface.ts: -------------------------------------------------------------------------------- 1 | import type { FactoryProvider, ModuleMetadata } from '@nestjs/common' 2 | 3 | export const YookassaOptionsSymbol = Symbol() 4 | 5 | /** 6 | * Тип, представляющий параметры для настройки YooKassa. 7 | */ 8 | export type YookassaOptions = { 9 | /** 10 | * Идентификатор магазина в YooKassa. 11 | */ 12 | shopId: string 13 | /** 14 | * Ключ API для аутентификации в YooKassa. 15 | */ 16 | apiKey: string 17 | } 18 | 19 | /** 20 | * Тип для асинхронной настройки YooKassa. 21 | */ 22 | export type YookassaAsyncOptions = Pick & 23 | Pick, 'useFactory' | 'inject'> 24 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './payment.service' 2 | export * from './refund.service' 3 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/services/payment.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common' 2 | import { 3 | type PaymentCreateRequest, 4 | type PaymentDetails, 5 | type YookassaOptions, 6 | YookassaOptionsSymbol 7 | } from '../interfaces' 8 | import { HttpService } from '@nestjs/axios' 9 | import { firstValueFrom } from 'rxjs' 10 | import { v4 as uuidv4 } from 'uuid' 11 | import { YOOKASSA_API_URL } from '../yookassa.constants' 12 | 13 | @Injectable() 14 | export class PaymentService { 15 | public constructor( 16 | @Inject(YookassaOptionsSymbol) 17 | private readonly options: YookassaOptions, 18 | private readonly httpService: HttpService 19 | ) {} 20 | 21 | public async create( 22 | paymentData: PaymentCreateRequest 23 | ): Promise { 24 | const idempotenceKey = uuidv4() 25 | 26 | try { 27 | const response = await firstValueFrom( 28 | this.httpService.post( 29 | `${YOOKASSA_API_URL}payments`, 30 | paymentData, 31 | { 32 | headers: { 33 | Authorization: this.getAuthHeader(), 34 | 'Content-Type': 'application/json', 35 | 'Idempotence-Key': idempotenceKey 36 | } 37 | } 38 | ) 39 | ) 40 | return response.data 41 | } catch (error) { 42 | throw new HttpException( 43 | error.response?.data?.description || 44 | 'Ошибка при выполнении запроса', 45 | HttpStatus.BAD_REQUEST 46 | ) 47 | } 48 | } 49 | 50 | public async getAll( 51 | limit: number = 10, 52 | from: string = '', 53 | to: string = '' 54 | ): Promise { 55 | try { 56 | const response = await firstValueFrom( 57 | this.httpService.get( 58 | `${YOOKASSA_API_URL}payments`, 59 | { 60 | headers: { 61 | Authorization: this.getAuthHeader() 62 | }, 63 | params: { 64 | limit, 65 | from, 66 | to 67 | } 68 | } 69 | ) 70 | ) 71 | 72 | return response.data 73 | } catch (error) { 74 | throw new HttpException( 75 | error.response.data.description || 76 | 'Ошибка при выполнении запроса', 77 | HttpStatus.BAD_REQUEST 78 | ) 79 | } 80 | } 81 | 82 | public async getOne(paymentId: string): Promise { 83 | try { 84 | const response = await firstValueFrom( 85 | this.httpService.get( 86 | `${YOOKASSA_API_URL}payments/${paymentId}`, 87 | { 88 | headers: { 89 | Authorization: this.getAuthHeader() 90 | } 91 | } 92 | ) 93 | ) 94 | 95 | return response.data 96 | } catch (error) { 97 | throw new HttpException( 98 | error.response.data.description || 99 | 'Ошибка при выполнении запроса', 100 | HttpStatus.BAD_REQUEST 101 | ) 102 | } 103 | } 104 | 105 | public async capture(paymentId: string): Promise { 106 | const idempotenceKey = uuidv4() 107 | 108 | try { 109 | const { amount } = await this.getOne(paymentId) 110 | 111 | const response = await firstValueFrom( 112 | this.httpService.post( 113 | `${YOOKASSA_API_URL}payments/${paymentId}/capture`, 114 | { amount }, 115 | { 116 | headers: { 117 | Authorization: this.getAuthHeader(), 118 | 'Content-Type': 'application/json', 119 | 'Idempotence-Key': idempotenceKey 120 | } 121 | } 122 | ) 123 | ) 124 | 125 | return response.data 126 | } catch (error) { 127 | throw new HttpException( 128 | error.response.data.description || 129 | 'Ошибка при выполнении запроса', 130 | HttpStatus.BAD_REQUEST 131 | ) 132 | } 133 | } 134 | 135 | public async cancel(paymentId: string): Promise { 136 | const idempotenceKey = uuidv4() 137 | 138 | try { 139 | const response = await firstValueFrom( 140 | this.httpService.post( 141 | `${YOOKASSA_API_URL}payments/${paymentId}/cancel`, 142 | {}, 143 | { 144 | headers: { 145 | Authorization: this.getAuthHeader(), 146 | 'Content-Type': 'application/json', 147 | 'Idempotence-Key': idempotenceKey 148 | } 149 | } 150 | ) 151 | ) 152 | return response.data 153 | } catch (error) { 154 | throw new HttpException( 155 | error.response.data.description || 156 | 'Ошибка при выполнении запроса', 157 | HttpStatus.BAD_REQUEST 158 | ) 159 | } 160 | } 161 | 162 | private getAuthHeader() { 163 | return `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/services/refund.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common' 2 | import { 3 | type RefundCreateRequest, 4 | type RefundDetails, 5 | type YookassaOptions, 6 | YookassaOptionsSymbol 7 | } from '../interfaces' 8 | import { HttpService } from '@nestjs/axios' 9 | import { PaymentService } from './payment.service' 10 | import { firstValueFrom } from 'rxjs' 11 | import { v4 as uuidv4 } from 'uuid' 12 | import { YOOKASSA_API_URL } from '../yookassa.constants' 13 | 14 | @Injectable() 15 | export class RefundService { 16 | public constructor( 17 | @Inject(YookassaOptionsSymbol) 18 | private readonly options: YookassaOptions, 19 | private readonly httpService: HttpService, 20 | private readonly paymentService: PaymentService 21 | ) {} 22 | 23 | public async create( 24 | refundData: RefundCreateRequest 25 | ): Promise { 26 | const idempotenceKey = uuidv4() 27 | 28 | try { 29 | const { amount } = await this.paymentService.getOne( 30 | refundData.payment_id 31 | ) 32 | 33 | const response = await firstValueFrom( 34 | this.httpService.post( 35 | `${YOOKASSA_API_URL}refunds`, 36 | { 37 | payment_id: refundData.payment_id, 38 | amount, 39 | description: refundData.description 40 | }, 41 | { 42 | headers: { 43 | Authorization: this.getAuthHeader(), 44 | 'Content-Type': 'application/json', 45 | 'Idempotence-Key': idempotenceKey 46 | } 47 | } 48 | ) 49 | ) 50 | return response.data 51 | } catch (error) { 52 | throw new HttpException( 53 | error.response?.data?.description || 54 | 'Ошибка при выполнении запроса', 55 | HttpStatus.BAD_REQUEST 56 | ) 57 | } 58 | } 59 | 60 | public async getAll( 61 | limit: number = 10, 62 | from: string = '', 63 | to: string = '' 64 | ): Promise { 65 | try { 66 | const response = await firstValueFrom( 67 | this.httpService.get( 68 | `${YOOKASSA_API_URL}refunds`, 69 | { 70 | headers: { 71 | Authorization: `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 72 | }, 73 | params: { 74 | limit, 75 | from, 76 | to 77 | } 78 | } 79 | ) 80 | ) 81 | 82 | return response.data 83 | } catch (error) { 84 | throw new HttpException( 85 | error.response.data.description || 86 | 'Ошибка при выполнении запроса', 87 | HttpStatus.BAD_REQUEST 88 | ) 89 | } 90 | } 91 | 92 | public async getOne(refundId: string): Promise { 93 | try { 94 | const response = await firstValueFrom( 95 | this.httpService.get( 96 | `${YOOKASSA_API_URL}refunds/${refundId}`, 97 | { 98 | headers: { 99 | Authorization: `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 100 | } 101 | } 102 | ) 103 | ) 104 | 105 | return response.data 106 | } catch (error) { 107 | throw new HttpException( 108 | error.response.data.description || 109 | 'Ошибка при выполнении запроса', 110 | HttpStatus.BAD_REQUEST 111 | ) 112 | } 113 | } 114 | 115 | private getAuthHeader() { 116 | return `Basic ${Buffer.from(`${this.options.shopId}:${this.options.apiKey}`).toString('base64')}` 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/yookassa.constants.ts: -------------------------------------------------------------------------------- 1 | export const YOOKASSA_API_URL = 'https://api.yookassa.ru/v3/' 2 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/yookassa.module.ts: -------------------------------------------------------------------------------- 1 | import { HttpModule } from '@nestjs/axios' 2 | import { type DynamicModule, Global, Module } from '@nestjs/common' 3 | import { 4 | type YookassaAsyncOptions, 5 | type YookassaOptions, 6 | YookassaOptionsSymbol 7 | } from './interfaces' 8 | import { YookassaService } from './yookassa.service' 9 | import { PaymentService } from './services/payment.service' 10 | import { RefundService } from './services/refund.service' 11 | 12 | @Global() 13 | @Module({}) 14 | export class YookassaModule { 15 | /** 16 | * Метод для регистрации модуля с синхронными параметрами. 17 | * Этот метод используется для конфигурации модуля с заранее заданными параметрами. 18 | * @param {YookassaOptions} options - Настройки для конфигурации YooKassa. 19 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 20 | * 21 | * @example 22 | * ```ts 23 | * YookassaModule.forRoot({ 24 | * shopId: 'your_shop_id', 25 | * apiKey: 'your_api_key', 26 | * }); 27 | * ``` 28 | */ 29 | public static forRoot(options: YookassaOptions): DynamicModule { 30 | return { 31 | module: YookassaModule, 32 | imports: [HttpModule], 33 | providers: [ 34 | { 35 | provide: YookassaOptionsSymbol, 36 | useValue: options 37 | }, 38 | PaymentService, 39 | RefundService, 40 | YookassaService 41 | ], 42 | exports: [YookassaService], 43 | global: true 44 | } 45 | } 46 | 47 | /** 48 | * Метод для регистрации модуля с асинхронной конфигурацией. 49 | * Этот метод используется для конфигурации модуля с параметрами, которые будут переданы через фабричную функцию. 50 | * @param {YookassaAsyncOptions} options - Асинхронные параметры для конфигурации YooKassa. 51 | * @returns {DynamicModule} Возвращает динамический модуль с необходимыми провайдерами и импортами. 52 | * 53 | * @example 54 | * ```ts 55 | * YookassaModule.forRootAsync({ 56 | * imports: [ConfigModule], 57 | * useFactory: async (configService: ConfigService) => ({ 58 | * shopId: configService.getOrThrow('YOOKASSA_SHOP_ID'), 59 | * apiKey: configService.getOrThrow('YOOKASSA_API_KEY') 60 | * }), 61 | * inject: [ConfigService] 62 | * }); 63 | * ``` 64 | */ 65 | public static forRootAsync(options: YookassaAsyncOptions): DynamicModule { 66 | return { 67 | module: YookassaModule, 68 | imports: [HttpModule, ...(options.imports || [])], 69 | providers: [ 70 | { 71 | provide: YookassaOptionsSymbol, 72 | useFactory: options.useFactory, 73 | inject: options.inject || [] 74 | }, 75 | PaymentService, 76 | RefundService, 77 | YookassaService 78 | ], 79 | exports: [YookassaService], 80 | global: true 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/src/yookassa.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common' 2 | import { PaymentService, RefundService } from './services' 3 | import { PaymentCreateRequest, RefundCreateRequest } from './interfaces' 4 | 5 | @Injectable() 6 | export class YookassaService { 7 | public constructor( 8 | private readonly paymentService: PaymentService, 9 | private readonly refundService: RefundService 10 | ) {} 11 | 12 | /** 13 | * Создает платеж через YooKassa. 14 | * Этот метод отправляет запрос на создание нового платежа с данными из `paymentData`. 15 | * Возвращает информацию о созданном платеже. 16 | * 17 | * @param {PaymentCreateRequest} paymentData - Данные для создания платежа. 18 | * @returns {Promise} Ответ от API с деталями платежа. 19 | * 20 | * @example 21 | * ```ts 22 | * const paymentData: PaymentCreateRequest = { 23 | * amount: { 24 | * value: 1000, 25 | * currency: 'RUB' 26 | * }, 27 | * description: 'Test payment', 28 | * payment_method_data: { 29 | * type: PaymentMethodsEnum.yoo_money, 30 | * }, 31 | * confirmation: { 32 | * type: 'redirect', 33 | * return_url: 'https://example.com/thanks' 34 | * }, 35 | * capture: false, 36 | * }; 37 | * const paymentResponse = await this.yookassaService.createPayment(paymentData); 38 | * console.log(paymentResponse); 39 | * ``` 40 | */ 41 | public async createPayment(paymentData: PaymentCreateRequest) { 42 | return await this.paymentService.create(paymentData) 43 | } 44 | 45 | /** 46 | * Получает список платежей. 47 | * Этот метод используется для получения списка всех платежей с возможностью пагинации. 48 | * 49 | * @param {number} limit - Максимальное количество платежей на страницу. 50 | * @param {string} from - Начальная дата для фильтрации. 51 | * @param {string} to - Конечная дата для фильтрации. 52 | * @returns {Promise} Список платежей. 53 | * 54 | * @example 55 | * ```ts 56 | * const payments = await this.yookassaService.getPayments(10, '2025-01-01', '2025-01-17'); 57 | * console.log(payments); 58 | * ``` 59 | */ 60 | public async getPayments(limit?: number, from?: string, to?: string) { 61 | return await this.paymentService.getAll(limit, from, to) 62 | } 63 | 64 | /** 65 | * Получает детали платежа по его ID. 66 | * Этот метод позволяет получить подробную информацию о платеже, включая его статус, сумму и другие данные. 67 | * 68 | * @param {string} paymentId - Уникальный идентификатор платежа, для которого нужно получить детали. 69 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже. 70 | * 71 | * @example 72 | * ```ts 73 | * const paymentId = '123456'; 74 | * const paymentDetails = await this.yookassaService.getPaymentDetails(paymentId); 75 | * console.log(paymentDetails); 76 | * ``` 77 | */ 78 | public async getPaymentDetails(paymentId: string) { 79 | return await this.paymentService.getOne(paymentId) 80 | } 81 | 82 | /** 83 | * Выполняет захват платежа. 84 | * Этот метод используется для захвата средств с карты клиента после того, как был создан платеж. 85 | * Обычно это делается, когда заказ подтвержден, и продавец готов забрать средства. 86 | * Возвращает обновленные детали платежа после захвата средств. 87 | * 88 | * @param {string} paymentId - Уникальный идентификатор платежа, который нужно захватить. 89 | * @param {Amount} amount - Сумма, которую необходимо захватить. Если сумма равна нулю, захватится полная сумма платежа. 90 | * @returns {Promise} Промис, который возвращает объект `PaymentDetails` с информацией о платеже после захвата. 91 | * 92 | * @example 93 | * ```ts 94 | * const paymentId = '123456'; 95 | * const amount: Amount = { 96 | * value: 1000, 97 | * currency: 'RUB', 98 | * }; 99 | * const paymentDetails = await this.yookassaService.capturePayment(paymentId, amount); 100 | * console.log(paymentDetails); 101 | * ``` 102 | */ 103 | public async capturePayment(paymentId: string) { 104 | return await this.paymentService.capture(paymentId) 105 | } 106 | 107 | /** 108 | * Отменяет платеж. 109 | * Этот метод используется для отмены платежа. 110 | * 111 | * @param {string} paymentId - ID платежа. 112 | * @returns {Promise} Детали отмененного платежа. 113 | * 114 | * @example 115 | * ```ts 116 | * const paymentId = '123456'; 117 | * const canceledPaymentDetails = await this.yookassaService.cancelPayment(paymentId); 118 | * console.log(canceledPaymentDetails); 119 | * ``` 120 | */ 121 | public async cancelPayment(paymentId: string) { 122 | return await this.paymentService.cancel(paymentId) 123 | } 124 | 125 | /** 126 | * Создает возврат средств по указанному платежу. 127 | * Этот метод отправляет запрос на создание возврата с данными из `refundData`. 128 | * 129 | * @param {RefundCreateRequest} refundData - Данные для создания возврата. 130 | * @returns {Promise} Ответ от API с деталями созданного возврата. 131 | * 132 | * @example 133 | * ```ts 134 | * const refundData: RefundCreateRequest = { 135 | * payment_id: '123456', 136 | * description: 'Возврат за отмененный заказ', 137 | * }; 138 | * const refundResponse = await this.yookassaService.createRefund(refundData); 139 | * console.log(refundResponse); 140 | * ``` 141 | */ 142 | public async createRefund(refundData: RefundCreateRequest) { 143 | return await this.refundService.create(refundData) 144 | } 145 | /** 146 | * Получает список всех возвратов. 147 | * Возвращает массив объектов с информацией о возвратах. 148 | * 149 | * @param {number} limit - Максимальное количество платежей на страницу. 150 | * @param {string} from - Начальная дата для фильтрации. 151 | * @param {string} to - Конечная дата для фильтрации. 152 | * @returns {Promise} Массив объектов с деталями возвратов. 153 | * 154 | * @example 155 | * ```ts 156 | * const refunds = await this.yookassaService.getRefunds(10, '2025-01-01', '2025-01-17'); 157 | * console.log(refunds); 158 | * ``` 159 | */ 160 | public async getRefunds(limit?: number, from?: string, to?: string) { 161 | return await this.refundService.getAll(limit, from, to) 162 | } 163 | 164 | /** 165 | * Получает детали возврата по его ID. 166 | * Этот метод возвращает подробную информацию о возврате, включая его статус и сумму. 167 | * 168 | * @param {string} refundId - Уникальный идентификатор возврата. 169 | * @returns {Promise} Объект с деталями возврата. 170 | * 171 | * @example 172 | * ```ts 173 | * const refundId = 'refund-id'; 174 | * const refundDetails = await this.yookassaService.getRefundDetails(refundId); 175 | * console.log(refundDetails); 176 | * ``` 177 | * @throws {NotFoundException} Если возврат с указанным ID не найден. 178 | */ 179 | public async getRefundDetails(refundId: string) { 180 | return await this.refundService.getOne(refundId) 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /packages/nestjs-yookassa/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "noImplicitAny": false, 6 | "removeComments": false, 7 | "noLib": false, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es2017", 11 | "sourceMap": false, 12 | "rootDir": "./src", 13 | "outDir": "./dist", 14 | "skipLibCheck": true 15 | }, 16 | "include": ["src/**/*"], 17 | "exclude": ["node_modules", "**/*.spec.ts"] 18 | } 19 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - apps/* 3 | - packages/* 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Default", 4 | "compilerOptions": { 5 | "composite": false, 6 | "declaration": true, 7 | "declarationMap": true, 8 | "esModuleInterop": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "inlineSources": false, 11 | "isolatedModules": true, 12 | "moduleResolution": "node", 13 | "noUnusedLocals": false, 14 | "noUnusedParameters": false, 15 | "preserveWatchOutput": true, 16 | "skipLibCheck": true, 17 | "strict": true 18 | }, 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "tasks": { 4 | "build": { 5 | "dependsOn": ["^build"], 6 | "outputs": ["dist/**", ".next/**"] 7 | }, 8 | "dev": { 9 | "cache": false 10 | } 11 | } 12 | } 13 | --------------------------------------------------------------------------------