shoman4eg/moy-nalog

lknpd.nalog.ru API的非官方包装客户端

资助包维护!
其他

v0.5.0 2024-07-23 22:36 UTC

README

Php version Latest Version Total Downloads Scrutinizer code quality Packagist License Donate

允许自动发送自雇人士的收入信息,获取已创建的收据信息并删除它们。支持使用INN和密码,以及手机号码进行认证。

安装

使用 composer

$ composer require shoman4eg/moy-nalog

您还需要安装虚拟包的发行版,例如(推荐)

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'))

认证

使用createNewAccessToken(按INN和密码)或createNewAccessTokenByPhone(按手机号码)进行认证时,除了返回访问令牌(accessToken)外,还返回无限期的更新令牌(refreshToken)。保存这些方法的原始响应,并在authenticate方法中重复使用。

重复使用createNewAccessTokencreateNewAccessTokenByPhone方法时,之前的accessToken将失效。

使用INN和密码

如果您需要恢复“我的税务”服务的密码,只能通过“纳税人个人账户”进行。两个服务上的账户相同。

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);

使用手机号码

通过手机号码进行认证的选项分为两步

  1. 向手机号码发送带有验证码的短信,并保存返回的challengeToken;
  2. 交换手机号码、challengeToken和验证码以获取accessToken

注意:只有在之前的验证码已过期(2分钟)或使用之前的验证码成功认证的情况下,才能请求新的验证码。无法重新发送已发布的验证码,只能同时创建新的。

1. 向手机号码发送带有验证码的短信,并保存返回的 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

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);

为默认的合同方(自然人)创建收据

$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();

获取收据(扫描件)或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();

使用的资源

在Habr上的文章:为自雇人士自动化:如何将税收与IT项目集成

JS实现:alexstep/moy-nalog

变更日志

变更日志:完整的变更日志

咖啡时间

如果这个项目帮助您缩短了开发时间,您可以请我喝杯咖啡 :)

向作者捐款

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件