PHPackages                             shoman4eg/moy-nalog - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. shoman4eg/moy-nalog

ActiveLibrary[API Development](/categories/api)

shoman4eg/moy-nalog
===================

An unofficial wrapper client for lknpd.nalog.ru API

v0.7.0(3mo ago)757.4k↓47.2%15[1 issues](https://github.com/shoman4eg/moy-nalog/issues)[1 PRs](https://github.com/shoman4eg/moy-nalog/pulls)MITPHPPHP &gt;=7.4

Since Feb 1Pushed 3mo ago7 watchersCompare

[ Source](https://github.com/shoman4eg/moy-nalog)[ Packagist](https://packagist.org/packages/shoman4eg/moy-nalog)[ Fund](https://www.tinkoff.ru/cf/7rZnC7N4bOO)[ RSS](/packages/shoman4eg-moy-nalog/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (10)Versions (17)Used By (0)

Неофициальный API клиент [lknpd.nalog.ru](https://lknpd.nalog.ru/) ("Мой Налог")
================================================================================

[](#неофициальный-api-клиент-lknpdnalogru-мой-налог)

[![Php version](https://camo.githubusercontent.com/0d46fda605b754c8537911d2f8aff3790438a8d44a36b7c8a934be8f43ef5b44/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f73686f6d616e3465672f6d6f792d6e616c6f673f7374796c653d666c61742d737175617265)](composer.json)[![Latest Version](https://camo.githubusercontent.com/e2fa3ff8f99800201995acb7d5b91a8d7dcd778498d836d23325097b7f3e2890/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f73686f6d616e3465672f6d6f792d6e616c6f672e7376673f7374796c653d666c61742d737175617265)](https://github.com/shoman4eg/moy-nalog/releases)[![Total Downloads](https://camo.githubusercontent.com/1b9073ed3b86cf8b4808de8ccc01dda183db25cdd14353b66ee7a96c5b20314e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73686f6d616e3465672f6d6f792d6e616c6f672e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/shoman4eg/moy-nalog)[![Scrutinizer code quality](https://camo.githubusercontent.com/d2f6840bb02b66dcbd0dda6d8a264b5a17fdb3e1f48b65f53e47d9c749a79f42/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f7175616c6974792f672f73686f6d616e3465672f6d6f792d6e616c6f672f6d61737465723f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/shoman4eg/moy-nalog/?branch=master)[![Packagist License](https://camo.githubusercontent.com/706ed6312ab60ac64525b3feb3adf0b1012c4e34af76e6301fc6c1844d01e7d8/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f73686f6d616e3465672f6d6f792d6e616c6f673f7374796c653d666c61742d737175617265)](LICENSE)[![Donate](https://camo.githubusercontent.com/5c6077aa6e80843a408c8b580f8f0d7f4fab545814f3f7036561c16484454069/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6e6174652d436c6f7564746970732d3634393664633f7374796c653d666c61742d737175617265)](https://pay.cloudtips.ru/p/2e70e850)

Позволяет автоматизировать отправку информации о доходах для самозанятых, получать информацию о созданных чеках и удалять их. Поддерживается аутентификация по ИНН и паролю, а также по номеру телефона.

Установка
---------

[](#установка)

С помощью `composer`

```
$ composer require shoman4eg/moy-nalog
```

Также Вам понадобится реализация виртуального пакета [`psr/http-client-implementation`](https://packagist.org/providers/psr/http-client-implementation), например (рекомендуется):

Symfony

```
$ composer require symfony/http-client
```

Или Guzzle

```
$ composer require guzzlehttp/guzzle
```

Использование
-------------

[](#использование)

### Настройка часового пояса

[](#настройка-часового-пояса)

```
// Необходимо выставить часовой пояс для корректного формирования дат в чеках
// Можно установить с помощью функции date_default_timezone_set
date_default_timezone_set('Europe/Kaliningrad');

// или через класс DateTimeImmutable, с нужным часовым поясом, перед созданием чека
$operationTime = new \DateTimeImmutable('now', new \DateTimeZone('Europe/Kaliningrad'))
```

### Создание клиента

[](#создание-клиента)

```
use Shoman4eg\Nalog\ApiClient;
use Shoman4eg\Nalog\Http\ClientConfigurator;
use Shoman4eg\Nalog\Service\Generator\DeviceIdGenerator;
use Shoman4eg\Nalog\Service\Generator\StaticIdStrategy;
use Shoman4eg\Nalog\Service\Generator\IdStrategyInterface;

// Клиент с настройками по умолчанию
$apiClient = ApiClient::create();

// Создание клиента с прокси
$proxiedHttpClient = new \GuzzleHttp\Client([
    'proxy' => 'tcp://12.34.56.78:3128',
]);
$apiClient = ApiClient::createWithCustomClient($proxiedHttpClient);
// или
$apiClient = new ApiClient(clientConfigurator: new ClientConfigurator($proxiedHttpClient));

// Изменить DeviceId. По умолчанию используется PlatformIdStrategy где deviceId генерируется на основе платформы.
$apiClient = new ApiClient(deviceIdGenerator: new DeviceIdGenerator()); // По умолчанию

// Полезно использовать, если вы обслуживаете несколько самозанятых
$apiClient = new ApiClient(deviceIdGenerator: new DeviceIdGenerator(new StaticIdStrategy('example id')))

// Так же возможно написать свою реализацию
$apiClient = new ApiClient(deviceIdGenerator: new DeviceIdGenerator(new class implements IdStrategyInterface {
    public function getId(): string
    {
        return md5('example id');
    }
}));
```

### Аутентификация

[](#аутентификация)

При аутентификации с помощью методов `createNewAccessToken` (по ИНН и паролю) или `createNewAccessTokenByPhone` (по номеру телефона) , вместе с токеном доступа (**accessToken**), возвращается также токен обновления (**refreshToken**) с неограниченным сроком действия. Сохраните оригинальный ответ этих методов и используйте повторно в методе `authenticate`.

> При повторном использовании методов `createNewAccessToken` и `createNewAccessTokenByPhone`, предыдущий **accessToken** становится недействительным.

#### С помощью ИНН и пароля

[](#с-помощью-инн-и-пароля)

> Если Вам нужно восстановить пароль от сервиса ["Мой налог"](https://lknpd.nalog.ru/), это возможно сделать только через ["Личный кабинет налогоплательщика"](https://lkfl2.nalog.ru/lkfl/login). Аккаунты на обоих сервисах одинаковые.

```
use Shoman4eg\Nalog\ApiClient;
$apiClient = ApiClient::create();

try {
    // Запрос accessToken
    $accessToken = $apiClient->createNewAccessToken($username, $password);
} catch (\Shoman4eg\Nalog\Exception\Domain\UnauthorizedException $e) {
    var_dump($e->getMessage());
}

// Аутентификация с помощью accessToken
$apiClient->authenticate($accessToken);
```

#### По номеру телефона

[](#по-номеру-телефона)

Вариант аутентификации по номеру телефона происходит в 2 шага:

1. Запросите SMS с кодом подтверждения на номер телефона и сохраните возвращённый **challengeToken**;
2. Обменяйте номер телефона, **challengeToken** и код подтверждения на **accessToken**.

> **Внимание:** запрос нового кода подтверждения возможен только если предыдущий код истёк (2 минуты), или по предыдущему коду произошла успешная аутентификация. Повторная отправка выпущенного кода подтверждения невозможна, только одновременно с созданием нового.

#### 1. Запросите SMS с кодом подтверждения на номер телефона и сохраните возвращённый **challengeToken**:

[](#1-запросите-sms-с-кодом-подтверждения-на-номер-телефона-и-сохраните-возвращённый-challengetoken)

```
use Shoman4eg\Nalog\ApiClient;
$apiClient = ApiClient::create();

try {
    $phoneChallengeResponse = ApiClient::createPhoneChallenge('79000000000');
    /**
     * $phoneChallengeResponse = [
     *  'challengeToken' => '00000000-0000-0000-0000-000000000000',
     *  'expireDate' => '2022-11-24T00:20:19.135436Z',,
     *  'expireIn' => 120,
     *  ];
     */
} catch (\Shoman4eg\Nalog\Exception\Domain\UnauthorizedException $e) {
    var_dump($e->getMessage());
}
// Сохраните $phoneChallengeResponse['challengeToken']. Он потребуется Вам на втором шаге.
```

#### 2. Обменяйте номер телефона, **challengeToken** и код подтверждения на **accessToken**:

[](#2-обменяйте-номер-телефона-challengetoken-и-код-подтверждения-на-accesstoken)

```
use Shoman4eg\Nalog\ApiClient;
$apiClient = ApiClient::create();

try {
    // Запрос accessToken
    $accessToken = $apiClient->createNewAccessTokenByPhone(
        '79000000000', // Номер телефона
        '00000000-0000-0000-0000-000000000000', // challengeToken
        '123456' // Код из СМС
    );
} catch (\Shoman4eg\Nalog\Exception\Domain\UnauthorizedException $e) {
    var_dump($e->getMessage());
}

// Аутентификация с помощью accessToken
$apiClient->authenticate($accessToken);
```

### Создать чек c контрагентом по умолчанию (физ. лицо)

[](#создать-чек-c-контрагентом-по-умолчанию-физ-лицо)

```
$name = 'Предоставление информационных услуг #970/2495'; // Наименование
$amount = 1800.30; // Стоимость в рублях
$quantity = 1; // Количество
$operationTime = new DateTimeImmutable('2020-12-31 12:12:00'); // Дата продажи

// Создание чека
$createdIncome = $apiClient->income()->create(
    $name,
    $amount,
    $quantity,
    $operationTime
);

// UUID чека для операций запроса данных чека или его отмены
$receiptUuid = $createdIncome->getApprovedReceiptUuid();
```

### Создать чек с несколькими позициями

[](#создать-чек-с-несколькими-позициями)

```
$items = [
    new \Shoman4eg\Nalog\DTO\IncomeServiceItem(
        'Предоставление информационных услуг #970/2495', // Наименование
        1800.30, // Стоимость
        1 // Количество
    ),
    new \Shoman4eg\Nalog\DTO\IncomeServiceItem(
        'Предоставление информационных услуг #971/2495',
        900,
        2
    ),
    // И так далее...
];

// Дата продажи
$operationTime = new DateTimeImmutable('2020-12-31 12:12:00');

// Создание чека
$createdIncome = $apiClient->income()->createMultipleItems(
    $items,
    $operationTime
);

// UUID чека для операций запроса данных чека или его отмены
$receiptUuid = $createdIncome->getApprovedReceiptUuid();
```

### Создать чек для указанного типа контрагента (физ. лицо, юр. лицо или иностранная организация)

[](#создать-чек-для-указанного-типа-контрагента-физ-лицо-юр-лицо-или-иностранная-организация)

```
$name = 'Предоставление информационных услуг #970/2495'; // Наименование
$amount = 1800.30; // Стоимость
$quantity = 1; // Количество
$operationTime = new DateTimeImmutable('2020-12-31 12:12:00'); // Дата продажи

// По умолчанию физ. лицо без указания контактных данных (INDIVIDUAL)
$client = new \Shoman4eg\Nalog\DTO\IncomeClient();

// Или физ. лицо с указанием контактных данных (INDIVIDUAL)
$client = new \Shoman4eg\Nalog\DTO\IncomeClient(
    '+79009000000',
    'Вася Пупкин',
    \Shoman4eg\Nalog\Enum\IncomeType::INDIVIDUAL,
    '390000000000' // ИНН физ. лица (12 символов)
);

// Или юр. лицо (ИП, ООО и т.п.) (LEGAL_ENTITY)
$client = new \Shoman4eg\Nalog\DTO\IncomeClient(
    null,
    'ИП Вася Пупкин Валерьевич',
    \Shoman4eg\Nalog\Enum\IncomeType::LEGAL_ENTITY,
    '7700000000' // ИНН юр. лица (10 символов)
);

// Или иностранная организация (FOREIGN_AGENCY)
$client = new \Shoman4eg\Nalog\DTO\IncomeClient(
    null,
    'Facebook Inc.',
    \Shoman4eg\Nalog\Enum\IncomeType::FOREIGN_AGENCY,
    '9909000000' // ИНН иностранной организации (10 символов)
);

// Создание чека
$createdIncome = $apiClient->income()->create(
    $name,
    $amount,
    $quantity,
    $operationTime,
    $client
);

// UUID чека для операций запроса данных чека или его отмены
$receiptUuid = $createdIncome->getApprovedReceiptUuid();
```

### Получить список чеков

[](#получить-список-чеков)

```
// Получить список чеков
$incomes = $apiClient->income()->list();

// Фильтрация
$incomes = $apiClient->income()->list(
    from: new DateTimeImmutable('31.12.2025 23:59:59'), // начало периода для поиска (по умолчанию: null)
    to: new DateTimeImmutable('31.12.2025 23:59:59'), // конец периода для поиска (по умолчанию: null)
    offset: 10, // смещение результатов для пагинации (по умолчанию: 0)
    limit: 25, // Количество результатов (по умолчанию: 100)
    buyerType: \Shoman4eg\Nalog\Enum\BuyerType::PERSON, // Тип покупателя (по умолчанию: null)
    receiptType: \Shoman4eg\Nalog\Enum\ReceiptType::REGISTERED, // Тип чека (по умолчанию: null)
    sortBy: \Shoman4eg\Nalog\Api\Income::SORT_OPERATION_TIME_ASC // Сортировка (по умолчанию: \Shoman4eg\Nalog\Api\Income::SORT_OPERATION_TIME_DESC)
);

// Возможные значения фильтрации:
$buyerType = \Shoman4eg\Nalog\Enum\BuyerType::PERSON; // физлицо
$buyerType = \Shoman4eg\Nalog\Enum\BuyerType::COMPANY; // юрлицо
$buyerType = \Shoman4eg\Nalog\Enum\BuyerType::FOREIGN_AGENCY; // Иностранная организация

$receiptType = \Shoman4eg\Nalog\Enum\ReceiptType::REGISTERED; // Действителен
$receiptType = \Shoman4eg\Nalog\Enum\ReceiptType::CANCELLED; // Аннулирован

$sortBy = Shoman4eg\Nalog\Api\Income::SORT_OPERATION_TIME_ASC; // Дата: сначала старые
$sortBy = Shoman4eg\Nalog\Api\Income::SORT_OPERATION_TIME_DESC; // Дата: сначала новые
$sortBy = Shoman4eg\Nalog\Api\Income::SORT_TOTAL_AMOUNT_ASC; // Стоимость: по возрастанию
$sortBy = Shoman4eg\Nalog\Api\Income::SORT_TOTAL_AMOUNT_DESC; // Стоимость: по убыванию
```

### Получить чек (скан-копия) или данные чека в JSON формате

[](#получить-чек-скан-копия-или-данные-чека-в-json-формате)

```
// UUID чека
$receiptUuid = "20hykdxbp8";

// Получить ссылку на чек для печати
$receipt = $apiClient->receipt()->printUrl($receiptUuid);

// Получить данные по чеку в JSON формате
$receipt = $apiClient->receipt()->json($receiptUuid);
```

### Отменить чек

[](#отменить-чек)

```
// UUID чека
$receiptUuid = "20hykdxbp8";

// Причина отмены: "Чек выдан ошибочно"
$comment = \Shoman4eg\Nalog\Enum\CancelCommentType::CANCEL;
// Причина отмены: "Возврат денежных средств"
$comment = \Shoman4eg\Nalog\Enum\CancelCommentType::REFUND;

// Код партнёра (по умолчанию: null)
$partnerCode = null;
// Дата совершения возврата (по умолчанию: now)
$operationTime = new \DateTimeImmutable('now');
// Дата запроса отмены чека (по умолчанию: now)
$requestTime = new \DateTimeImmutable('now');

// Отмена чека
$incomeInfo = $apiClient->income()->cancel(
    $receiptUuid,
    $comment,
    $operationTime,
    $requestTime,
    $partnerCode
);
```

### Получить информацию о текущем пользователе

[](#получить-информацию-о-текущем-пользователе)

```
$apiClient->authenticate($accessToken);

$userInfo = $apiClient->user()->get();
```

### Получить информацию о необходимых платежах

[](#получить-информацию-о-необходимых-платежах)

```
$apiClient->authenticate($accessToken);

$userInfo = $apiClient->tax()->get();
```

### Получить информацию о платежах

[](#получить-информацию-о-платежах)

```
$apiClient->authenticate($accessToken);

$userInfo = $apiClient->tax()->payments();
```

### Получить информацию о прошлых платежах

[](#получить-информацию-о-прошлых-платежах)

```
$apiClient->authenticate($accessToken);

$userInfo = $apiClient->tax()->history();
```

Известные проблемы
------------------

[](#известные-проблемы)

### Проблема [\#47](https://github.com/shoman4eg/moy-nalog/47): Не приходят СМС для получения токена

[](#проблема-47-не-приходят-смс-для-получения-токена)

- **Описание**: Проблемы с получением СМС-кода для авторизации
- **Решение**: Проблема связана с API сервиса nalog.ru, временная недоступность сервиса отправки СМС

### Проблема [\#22](https://github.com/shoman4eg/moy-nalog/22): Авторизация по телефону или внешним ключам

[](#проблема-22-авторизация-по-телефону-или-внешним-ключам)

- **Описание**: Невозможность авторизоваться без пароля (только по номеру телефона)
- **Решение**: Для получения пароля нужно восстановить его через веб-интерфейс "Мой налог"

### Проблема [\#49](https://github.com/shoman4eg/moy-nalog/49): Токен истекает несмотря на наличие RefreshToken

[](#проблема-49-токен-истекает-несмотря-на-наличие-refreshtoken)

- **Описание**: RefreshToken не срабатывает для получения нового токена
- **Настоящая причина**: Токен API "Мой налог" привязывается к конкретному IP-адресу или Device ID, с которого он был сгенерирован
- **Решение**: Токен нужно генерировать на нужном окружении. Токен, созданный с одного IP-адреса/Device ID, не будет работать с другого IP-адреса/Device ID (Точно сказать не могу, можно попробовать использовать в обоих окружениях StaticIdStrategy) чтобы удостовериться, что Refresh token привязывается к IP с которого сделан запрос.
- **Рекомендация**: Генерировать токен на том же сервере, с которого будут выполняться API-запросы

### Проблема [\#21](https://github.com/shoman4eg/moy-nalog/21): Ошибка Could not resolve host: lknpd.nalog.ru

[](#проблема-21-ошибка-could-not-resolve-host-lknpdnalogru)

- **Описание**: Невозможность резолва DNS для API сервера
- **Решение**: Временная проблема на стороне сервера или DNS. Проверить настройки DNS на сервере

### Проблема [\#38](https://github.com/shoman4eg/moy-nalog/38): No HTTPlug clients found

[](#проблема-38-no-httplug-clients-found)

- **Описание**: Ошибка "No HTTPlug clients found"
- **Решение**: Установить любой [psr/http-client-implementation](https://packagist.org/providers/psr/http-client-implementation) совместимый клиент, например `symfony/http-client`

### Проблема: Ошибка проверки refresh токена

[](#проблема-ошибка-проверки-refresh-токена)

- **Описание**: Одна из причин может быть проблема с тем, что на одном сервере обрабатывается множество пользоавтелей и DeviceID одинаковый для всех. Так же можно получить ответ:

```
{
  "code": "authentication.failed",
  "message": "Устройство  для пользователя  не может быть зарегистрировано/обновлено. Так как устройство заблокировано. Причина: Согласно обращению УОК о неправомерном доступе к ЛК",
  "additionalInfo": {}
}
```

- **Решение**: Использовать другой Device id, к примеру так:

```
use Shoman4eg\Nalog\ApiClient;
use Shoman4eg\Nalog\Service\Generator\DeviceIdGenerator;
$apiClient = new ApiClient(deviceIdGenerator: new DeviceIdGenerator(new StaticIdStrategy('')))
```

Использованные ресурсы
----------------------

[](#использованные-ресурсы)

Статья на Habr: [Автоматизация для самозанятых: как интегрировать налог с IT проектом](https://habr.com/ru/post/436656/)

Реализация на JS: [alexstep/moy-nalog](https://github.com/alexstep/moy-nalog)

Лог изменений
-------------

[](#лог-изменений)

[Changelog](CHANGELOG.md): A complete changelog

На кофе
-------

[](#на-кофе)

Если этот проект поможет Вам сократить время разработки, вы можете угостить меня чашкой кофе :)

[Сделать пожертвование автору](https://pay.cloudtips.ru/p/2e70e850)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE) for more information.

###  Health Score

48

—

FairBetter than 95% of packages

Maintenance77

Regular maintenance activity

Popularity39

Limited adoption so far

Community17

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 86.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~103 days

Recently: every ~136 days

Total

15

Last Release

118d ago

PHP version history (3 changes)0.1.0PHP &gt;=7.4||^8.0

0.2.0PHP &gt;=7.4 || ^8.0

v0.4.0PHP &gt;=7.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/c41349a671b15dbab8623a6499b11dfcdf6acc34b601f54fe914c126c1854fcd?d=identicon)[shoman4eg](/maintainers/shoman4eg)

---

Top Contributors

[![shoman4eg](https://avatars.githubusercontent.com/u/2788396?v=4)](https://github.com/shoman4eg "shoman4eg (26 commits)")[![nikita-komissarov](https://avatars.githubusercontent.com/u/48474884?v=4)](https://github.com/nikita-komissarov "nikita-komissarov (3 commits)")[![dedalx](https://avatars.githubusercontent.com/u/304255?v=4)](https://github.com/dedalx "dedalx (1 commits)")

---

Tags

lknpd-nalogmoy-nalogphpapinalog.ru

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/shoman4eg-moy-nalog/health.svg)

```
[![Health](https://phpackages.com/badges/shoman4eg-moy-nalog/health.svg)](https://phpackages.com/packages/shoman4eg-moy-nalog)
```

###  Alternatives

[openai-php/client

OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API

5.8k22.6M232](/packages/openai-php-client)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[theodo-group/llphant

LLPhant is a library to help you build Generative AI applications.

1.5k311.5k5](/packages/theodo-group-llphant)[deeplcom/deepl-php

Official DeepL API Client Library

2616.2M66](/packages/deeplcom-deepl-php)[jolicode/slack-php-api

An up to date PHP client for Slack's API

2534.4M12](/packages/jolicode-slack-php-api)[getbrevo/brevo-php

Official Brevo provided RESTFul API V3 php library

963.1M35](/packages/getbrevo-brevo-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
