PHPackages                             netfantom/yii2-robokassa - 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. [Payment Processing](/categories/payments)
4. /
5. netfantom/yii2-robokassa

ActiveYii2-extension[Payment Processing](/categories/payments)

netfantom/yii2-robokassa
========================

Robokassa Yii2 Framework extension for PHP 8.1

413PHP

Since Jul 27Pushed 2y ago1 watchersCompare

[ Source](https://github.com/igor-netFantom/yii2-robokassa)[ Packagist](https://packagist.org/packages/netfantom/yii2-robokassa)[ RSS](/packages/netfantom-yii2-robokassa/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

yii2-robokassa
==============

[](#yii2-robokassa)

[![Latest Stable Version](https://camo.githubusercontent.com/b9031f63561eabf52cf3541a772b85d5ec4113f9b6a1e8cd1c421c7fa3667c44/687474703a2f2f706f7365722e707567782e6f72672f6e657466616e746f6d2f796969322d726f626f6b617373612f76)](https://packagist.org/packages/netfantom/yii2-robokassa)[![Total Downloads](https://camo.githubusercontent.com/07dc7c1c2596e7775fcb5531b30b3a5a906994ff7c9633a813d02e8ea90919dc/687474703a2f2f706f7365722e707567782e6f72672f6e657466616e746f6d2f796969322d726f626f6b617373612f646f776e6c6f616473)](https://packagist.org/packages/netfantom/yii2-robokassa)[![License](https://camo.githubusercontent.com/2e844575fa9511aea71b8486defef494cc67aea27c1b0c7a3ed7a8c3a2a972ef/687474703a2f2f706f7365722e707567782e6f72672f6e657466616e746f6d2f796969322d726f626f6b617373612f6c6963656e7365)](https://packagist.org/packages/netfantom/yii2-robokassa)[![PHP Version Require](https://camo.githubusercontent.com/5536591ee23328d868d82ecc3e48a9082a6210978dce0d819a14e89f24764d40/687474703a2f2f706f7365722e707567782e6f72672f6e657466616e746f6d2f796969322d726f626f6b617373612f726571756972652f706870)](https://packagist.org/packages/netfantom/yii2-robokassa)[![codecov](https://camo.githubusercontent.com/ab6640cf38ea6b3885b58b077c0d4460c6d748701187d524acdf072739ae4dcb/68747470733a2f2f636f6465636f762e696f2f67682f69676f722d6e657446616e746f6d2f796969322d726f626f6b617373612f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d3631504d5035554c305a)](https://codecov.io/gh/igor-netFantom/yii2-robokassa)[![type-coverage](https://camo.githubusercontent.com/a5a5e558e336a4f4ad3576451717128ef000db19ea76b54900801a3afa6e7be3/68747470733a2f2f73686570686572642e6465762f6769746875622f69676f722d6e657446616e746f6d2f796969322d726f626f6b617373612f636f7665726167652e737667)](https://shepherd.dev/github/igor-netfantom/yii2-robokassa)[![psalm-level](https://camo.githubusercontent.com/9ff899002ead49d8af50215b2ff9b39294cb85bce385e97f46b0ec9eca6a70c5/68747470733a2f2f73686570686572642e6465762f6769746875622f69676f722d6e657446616e746f6d2f796969322d726f626f6b617373612f6c6576656c2e737667)](https://shepherd.dev/github/igor-netfantom/yii2-robokassa)

Данный компонент предназначен для работы с Робокассой:

- является оберткой вокруг [`netFantom/robokassa-api`](https://github.com/igor-netFantom/robokassa-api)и полностью исполняет его интерфейс `netFantom\robokassa-api\RobokassaApiInterface`
    ( см.  )
- выполнен в виде компонента `Yii 2 framework` и расширяет возможности, добавляя удобные методы и виджеты

Для работы требуется `PHP 8.1+`

Установка с помощью Composer
----------------------------

[](#установка-с-помощью-composer)

```
composer require igor-netfantom/yii2-robokassa:@dev

```

Подключение компонента
----------------------

[](#подключение-компонента)

Объектом:

```
[
    // ...
    'components' => [
        'robokassa' => [
            'class' => 'netFantom\Yii2Robokassa\Yii2Robokassa',
            'robokassaApi' => new \netFantom\RobokassaApi\RobokassaApi(
                merchantLogin: 'robo-demo',
                password1: 'password_1',
                password2: 'password_2',
                isTest: !YII_ENV_PROD,
                psr18Client: new \Http\Discovery\Psr18Client(), // необязательно
            ),
        ],
        // ...
    ],
];
```

...или массивом:

```
[
    // ...
    'components' => [
        'robokassa' => [
            'class' => 'netFantom\Yii2Robokassa\Yii2Robokassa',
            'merchantLogin' => 'robo-demo',
            'password1' => 'password1',
            'password2' => 'password2',
            'isTest' => !YII_ENV_PROD,
            'psr18Client' =>'Http\Discovery\Psr18Client', // необязательно
        ],
        // ...
    ],
];
```

Методы
------

[](#методы)

- [Переадресация на страницу оплаты счета](#%D0%BF%D0%B5%D1%80%D0%B5%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-%D1%81%D1%87%D0%B5%D1%82%D0%B0)
- [Преобразование параметров платежа в поля формы](#%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B0-%D0%B2-%D0%BF%D0%BE%D0%BB%D1%8F-%D1%84%D0%BE%D1%80%D0%BC%D1%8B)
- [Получение результата оплаты счета от Робокассы из HTTP запроса Yii](#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-%D1%81%D1%87%D0%B5%D1%82%D0%B0-%D0%BE%D1%82-%D1%80%D0%BE%D0%B1%D0%BE%D0%BA%D0%B0%D1%81%D1%81%D1%8B-%D0%B8%D0%B7-http-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-yii)
- [Методы модуля `netFantom/robokassa-api`](#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F-netfantomrobokassa-api)
    - [🔗 Получение параметров платежа для передачи в Робокассу](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B0-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8-%D0%B2-%D1%80%D0%BE%D0%B1%D0%BE%D0%BA%D0%B0%D1%81%D1%81%D1%83)
    - [🔗 Получение параметров платежа в формате `JSON строки`](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B0-%D0%B2-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5-json-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8)
    - [🔗 Получение URL для оплаты счета с указанными параметрами](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-url-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-%D1%81%D1%87%D0%B5%D1%82%D0%B0-%D1%81-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0%D0%BC%D0%B8)
    - [🔗 Отправка второго чека](https://github.com/igor-netFantom/robokassa-api#%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B3%D0%BE-%D1%87%D0%B5%D0%BA%D0%B0)
    - [🔗 Получение статуса чека](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%B0-%D1%87%D0%B5%D0%BA%D0%B0)
    - [🔗 Отправка СМС](https://github.com/igor-netFantom/robokassa-api#%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D1%81%D0%BC%D1%81)
    - [🔗 Получение результата оплаты счета от Робокассы](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-%D1%81%D1%87%D0%B5%D1%82%D0%B0-%D0%BE%D1%82-%D1%80%D0%BE%D0%B1%D0%BE%D0%BA%D0%B0%D1%81%D1%81%D1%8B)
    - [🔗 Вспомогательные методы](https://github.com/igor-netFantom/robokassa-api#%D0%B2%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B)
        - [🔗 Параметры для отправки СМС](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B4%D0%BB%D1%8F-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D1%81%D0%BC%D1%81)
        - [🔗 Формирование данных для отправки второго чека или проверки статуса чека](https://github.com/igor-netFantom/robokassa-api#%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B4%D0%BB%D1%8F-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B3%D0%BE-%D1%87%D0%B5%D0%BA%D0%B0-%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8-%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%B0-%D1%87%D0%B5%D0%BA%D0%B0)

### Переадресация на страницу оплаты счета

[](#переадресация-на-страницу-оплаты-счета)

```
/** @var \netFantom\Yii2Robokassa\Yii2Robokassa $robokassa */
$robokassa = Yii::$app->get('robokassa');

/**
 * @var \models\Invoice $invoice смотрите пример модели счета в разделе ниже
 * @see https://github.com/igor-netFantom/yii2-robokassa#пример-модели-счета
 */

/** @var bool $setReturnUrl по умолчанию TRUE {@see \yii\web\User::setReturnUrl()} */

$response = $robokassa->redirectToPaymentUrl($invoice->getInvoiceOptions(), $setReturnUrl);

/** @var \yii\web\Response $response */
return $response;
```

### Преобразование параметров платежа в поля формы

[](#преобразование-параметров-платежа-в-поля-формы)

Преобразует параметры платежа `InvoiceOptions` в скрытые поля формы `Html::hiddenInput()` для отправки пользователя на оплату `POST` запросом

```
/** @var \netFantom\Yii2Robokassa\Yii2Robokassa $robokassa */
$robokassa = Yii::$app->get('robokassa');

/**
 * @var \models\Invoice $invoice смотрите пример модели счета в разделе ниже
 * @see https://github.com/igor-netFantom/yii2-robokassa#пример-модели-счета
 */

echo $robokassa->getHiddenInputsHtml($invoice->getInvoiceOptions());
```

### Получение результата оплаты счета от Робокассы из HTTP запроса Yii

[](#получение-результата-оплаты-счета-от-робокассы-из-http-запроса-yii)

```
use netFantom\Yii2Robokassa\Yii2Robokassa;
use netFantom\RobokassaApi\Results\InvoicePayResult;

/** @var \yii\web\Request $request */
$request = Yii::$app->request

/** @var InvoicePayResult $invoicePayResult */
$invoicePayResult = Yii2Robokassa::getInvoicePayResultFromYiiWebRequest($request);
```

### Методы модуля `netFantom/robokassa-api`

[](#методы-модуля-netfantomrobokassa-api)

Данный компонент является оберткой вокруг [`netFantom/robokassa-api`](https://github.com/igor-netFantom/robokassa-api)и полностью исполняет его интерфейс `netFantom\robokassa-api\RobokassaApiInterface`:

( см.  )

Пример использования компонента
-------------------------------

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

- [Пример модели счета](#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8-%D1%81%D1%87%D0%B5%D1%82%D0%B0)
- [Примеры действий контроллера для обработки запросов Робокассы](#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%B0-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2-%D1%80%D0%BE%D0%B1%D0%BE%D0%BA%D0%B0%D1%81%D1%81%D1%8B)
- [Примеры представлений для создания счета и отправки пользователя на оплату](#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D1%81%D1%87%D0%B5%D1%82%D0%B0-%D0%B8-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D0%BD%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%83)
    - [ВАРИАНТ: Загрузка Popup виджета оплаты AJAX запросом](#%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82--%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-popup-%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-ajax-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%BC)
    - [ВАРИАНТ: Переход на оплату формой с POST запросом](#%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82--%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4-%D0%BD%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%83-%D1%84%D0%BE%D1%80%D0%BC%D0%BE%D0%B9-%D1%81-post-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%BC)
    - [ВАРИАНТ: Формирование Popup виджета](#%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82--%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-popup-%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%B0)

### Пример модели счета

[](#пример-модели-счета)

```
class InvoiceStatus
{
    public const STATUS_CREATED = 1;
    public const STATUS_PAYED = 2;
    public const STATUS_FAILED = 3;
}
```

```
class PaymentSystem
{
    public const SYSTEM_ROBOKASSA = 1;
}
```

```
use models\InvoiceStatus;
use DateInterval;
use DateTimeImmutable;
use netFantom\RobokassaApi\Options\InvoiceOptions;
use netFantom\RobokassaApi\Params\Option\{Culture, OutSumCurrency, Receipt};
use netFantom\RobokassaApi\Params\Item\{PaymentMethod, PaymentObject};
use netFantom\RobokassaApi\Params\Receipt\{Item, Sno, Tax};
use yii\db\ActiveRecord;

class Invoice extends ActiveRecord
{
    public int $id;
    public string $sum;
    public int $status_id = InvoiceStatus::STATUS_CREATED;
    public int $payment_system_id;
    public int $user_id;

    public function getInvoiceOptions(): InvoiceOptions
    {
        return new InvoiceOptions(
            outSum: $this->sum,
            invId: $this->id,
            description: 'Description',
            receipt: new Receipt(
                items: [
                    new Item(
                        name: "Название товара 1",
                        quantity: 1,
                        sum: 100,
                        tax: Tax::vat10,
                        payment_method: PaymentMethod::full_payment,
                        payment_object: PaymentObject::commodity,
                    ),
                    new Item(
                        name: "Название товара 2",
                        quantity: 3,
                        sum: 450,
                        tax: Tax::vat10,
                        payment_method: PaymentMethod::full_payment,
                        payment_object: PaymentObject::service,
                        cost: 150,
                        nomenclature_code: '04620034587217',
                    ),
                ],
                sno: Sno::osn
            ),
            expirationDate: (new DateTimeImmutable())->add(new DateInterval('PT48H')),
            email: 'user@email.com',
            outSumCurrency: OutSumCurrency::USD,
            userIP: '127.0.0.1',
            incCurrLabel: null,
            userParameters: [
                'user_id' => '123',
                'parameter2' => 'parameter2_value',
                // ...
            ],
            encoding: 'utf-8',
            culture: Culture::ru,
        );
    }
    //...
}
```

### [Примеры действий контроллера](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/controllers/PaymentController.php) для обработки запросов Робокассы

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

```
use models\{Invoice, InvoiceStatus, PaymentSystem};
use netFantom\Yii2Robokassa\Assets\PopupIframeAsset;
use netFantom\Yii2Robokassa\Yii2Robokassa;
use Yii;
use yii\web\{BadRequestHttpException, Controller, Response};

class PaymentController extends Controller
{
    /**
     * В случае отказа от исполнения платежа покупатель перенаправляется по данному адресу.
     * Необходим для того, чтобы продавец мог, например, разблокировать заказанный товар на складе.
     *
     * Переход пользователя по данному адресу, строго говоря, не означает окончательного отказа покупателя от оплаты,
     * нажав кнопку «Назад» в браузере он может вернуться на страницу оплаты Robokassa.
     * Поэтому в случае блокировки товара на складе под заказ, для его разблокирования желательно проверять
     * факт отказа от платежа запросом XML-интерфейса получения состояния оплаты счета, используя в запросе
     * номер счета InvId имеющийся в базе данных магазина/продавца.
     * @link https://docs.robokassa.ru/pay-interface/
     */
    public function actionFail(): Response
    {
        $invoicePayResult = Yii2Robokassa::getInvoicePayResultFromYiiWebRequest(Yii::$app->request);
        $invoice = $this->loadInvoice($invoicePayResult->invId);

        if ($invoice->status_id === InvoiceStatus::STATUS_CREATED) {
            $invoice->updateAttributes(['status' => InvoiceStatus::STATUS_FAILED]);
        }
        return $this->goBack();
    }

    /**
     * ВАРИАНТ: Загрузка Popup виджета оплаты AJAX запросом
     */
    public function actionInvoiceAjax(): string
    {
        $invoice = new Invoice();
        $invoice->payment_system_id = PaymentSystem::SYSTEM_ROBOKASSA;
        $invoice->status_id = InvoiceStatus::STATUS_CREATED;
        $invoice->user_id = Yii::$app->user->id;

        if (Yii::$app->request->isAjax && $invoice->load(Yii::$app->request->post()) && $invoice->save()) {
            return $this->renderAjax('invoice-ajax-response', compact('invoice'));
        }

        PopupIframeAsset::register($this->view);
        return $this->render('invoice-ajax', [
            'invoice' => $invoice,
        ]);
    }

    /**
     * ВАРИАНТ: Переход на оплату формой с POST запросом
     */
    public function actionInvoiceForm(int $id = null): string
    {
        if (isset($id)) {
            $invoice = $this->loadInvoice($id);
            if ($invoice->user_id !== Yii::$app->user->id || $invoice->status_id !== InvoiceStatus::STATUS_CREATED) {
                throw new BadRequestHttpException('Подходящий по условиям счёт не найден');
            }
            return $this->render('invoice-form', compact('invoice'));
        }

        $invoice = new Invoice();
        $invoice->payment_system_id = PaymentSystem::SYSTEM_ROBOKASSA;
        $invoice->status_id = InvoiceStatus::STATUS_CREATED;
        $invoice->user_id = Yii::$app->user->id;

        if ($invoice->load(Yii::$app->request->post()) && $invoice->save()) {
            $this->redirect(['payment/invoice-form', 'id' => $invoice->id]);
        }

        return $this->render('invoice-create', [
            'invoice' => $invoice,
        ]);
    }

    /**
     * ВАРИАНТ: Формирование Popup виджета
     */
    public function actionInvoicePopup(int $id = null): string
    {
        if (isset($id)) {
            $invoice = $this->loadInvoice($id);
            if ($invoice->user_id !== Yii::$app->user->id || $invoice->status_id !== InvoiceStatus::STATUS_CREATED) {
                throw new BadRequestHttpException('Подходящий по условиям счёт не найден');
            }
            return $this->render('invoice-popup', compact('invoice'));
        }

        $invoice = new Invoice();
        $invoice->payment_system_id = PaymentSystem::SYSTEM_ROBOKASSA;
        $invoice->status_id = InvoiceStatus::STATUS_CREATED;
        $invoice->user_id = Yii::$app->user->id;

        if ($invoice->load(Yii::$app->request->post()) && $invoice->save()) {
            $this->redirect(['payment/invoice-popup', 'id' => $invoice->id]);
        }

        return $this->render('invoice-create', [
            'invoice' => $invoice,
        ]);
    }

    /**
     * ResultURL предназначен для получения Вашим сайтом оповещения об успешном платеже в автоматическом режиме.
     * В случае успешного проведения оплаты Robokassa делает запрос на ResultURL (см. раздел Технические настройки).
     * Данные всегда передаются в кодировке UTF-8.
     *
     * Ваш скрипт, находящийся по ResultURL, обязан проверить равенство полученной контрольной суммы
     * и контрольной суммы, рассчитанной Вашим скриптом по параметрам, полученным от Robokassa,
     * а не по локальным данным магазина.
     *
     * Если контрольные суммы совпали, то Ваш скрипт должен ответить Robokassa, чтобы мы поняли,
     * что Ваш скрипт работает правильно и повторное уведомление с нашей стороны не требуется.
     * Результат должен содержать текст OK и параметр InvId.
     * Например, для номера счёта 5 должен быть вот такой ответ: OK5.
     *
     * Если контрольные суммы не совпали, то полученное оповещение некорректно, и ситуация требует разбора магазином.
     * @link https://docs.robokassa.ru/pay-interface/
     */
    public function actionResult(): string
    {
        /** @var Yii2Robokassa $robokassa */
        $robokassa = Yii::$app->get('robokassa');

        $invoicePayResult = Yii2Robokassa::getInvoicePayResultFromYiiWebRequest(Yii::$app->request);
        if (!$robokassa->checkSignature($invoicePayResult)) {
            throw new BadRequestHttpException();
        }

        if (!$this->loadInvoice($invoicePayResult->invId)->updateAttributes(['status' => InvoiceStatus::STATUS_PAYED])) {
            throw new BadRequestHttpException();
        }

        return $invoicePayResult->formatOkAnswer();
    }

    /**
     * В случае успешного исполнения платежа Покупатель сможет перейти по адресу,
     * указанному вами в Технических настройках, там же вы указали метод (GET или POST).
     *
     * Переход пользователя по данному адресу с корректными параметрами (правильной Контрольной суммой) означает,
     * что оплата вашего заказа успешно выполнена.
     *
     * Однако для дополнительной защиты желательно, чтобы факт оплаты проверялся скриптом,
     * исполняемым при переходе на SuccessURL, или путем запроса XML-интерфейса получения состояния оплаты счета,
     * и только при реальном наличии счета с номером InvId в базе данных магазина.
     *
     * На самом деле, переход пользователя по ссылке SuccessURL – это формальность, которая нужна только для того,
     * чтобы пользователь вернулся обратно к Вам и получил информацию о том, что он сделал всё правильно,
     * и его заказ ждёт его там-то и там-то. Проводить подтверждение оплаты у себя по базе и все остальные действия,
     * связанные с выдачей покупки, Вам нужно при получении уведомления на ResultUrl,
     * потому что именно на него Robokassa передаёт подтверждающие данные об оплате в автоматическом режиме
     * (т. е. в любом случае и без участия пользователя).
     * @link https://docs.robokassa.ru/pay-interface/
     */
    public function actionSuccess(): Response|string
    {
        $invoicePayResult = Yii2Robokassa::getInvoicePayResultFromYiiWebRequest(Yii::$app->request);
        $invoice = $this->loadInvoice($invoicePayResult->invId);

        return $this->render("success", compact('invoice'));
    }

    protected function loadInvoice(int $id): Invoice
    {
        $invoice = Invoice::find()
            ->andWhere(['id' => $id])
            ->andWhere(['payment_system_id' => PaymentSystem::SYSTEM_ROBOKASSA])
            ->one();
        if ($invoice === null) {
            throw new BadRequestHttpException('Подходящий по условиям счёт не найден');
        }
        return $invoice;
    }
}
```

### [Примеры представлений](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views) для создания счета и отправки пользователя на оплату

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

#### ВАРИАНТ: Загрузка Popup виджета оплаты AJAX запросом

[](#вариант-загрузка-popup-виджета-оплаты-ajax-запросом)

Пример представления [`invoice-ajax`](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views/payment/invoice-ajax.php)для действия `actionInvoiceAjax`

```
use models\Invoice;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\web\View;
use yii\widgets\ActiveForm;

/* @var $this View */
/* @var $invoice Invoice */

$url = Url::current();

$this->registerJs(
    0) {
                    $('#pay-form').html(responsePayForm);
                } else {
                    $('#pay-form').append(res);
                }
            },
            error: function(){
                alert('Error!');
            }
        });
        return false;
    });
JS
);

$form = ActiveForm::begin([
    'id' => 'pay-form',
    'enableClientValidation' => false,
]);
echo $form->field($invoice, 'sum')->textInput();
echo Html::submitButton('Pay', ['class' => 'btn btn-success']);
ActiveForm::end();
```

Пример представления [`invoice-ajax-response`](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views/payment/invoice-ajax-response.php)для действия `actionInvoiceAjax`

```
use models\Invoice;
use netFantom\Yii2Robokassa\Widgets\PopupIframeWidget;
use netFantom\Yii2Robokassa\Yii2Robokassa;
use yii\helpers\Html;
use yii\web\View;

/* @var $this View */
/* @var $invoice Invoice */

/** @var Yii2Robokassa $robokassa */
$robokassa = Yii::$app->get('robokassa');

PopupIframeWidget::widget([
    'yii2Robokassa' => $robokassa,
    'invoiceOptions' => $invoice->getInvoiceOptions(),
    'registerAsset' => false,
]);

echo Html::encode("Сформирован счет №$invoice->id на сумму $invoice->sum руб. и ждет оплаты");
echo Html::button('оплатить', [
    'onClick' => PopupIframeWidget::SHOW_ROBOKASSA_POPUP_IFRAME_ACTION,
    'class' => 'btn btn-primary',
]);
```

#### ВАРИАНТ: Переход на оплату формой с POST запросом

[](#вариант-переход-на-оплату-формой-с-post-запросом)

Пример представления [`invoice-form`](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views/payment/invoice-form.php)для действия `actionInvoiceForm`

```
use models\Invoice;
use netFantom\Yii2Robokassa\Widgets\PopupIframeWidget;
use netFantom\Yii2Robokassa\Yii2Robokassa;
use yii\helpers\Html;
use yii\web\View;
use yii\widgets\ActiveForm;

/* @var $this View */
/* @var $invoice Invoice */

/** @var Yii2Robokassa $robokassa */
$robokassa = Yii::$app->get('robokassa');

echo Html::encode("Сформирован счет №$invoice->id на сумму $invoice->sum руб. и ждет оплаты");

$form = ActiveForm::begin([
    'id' => 'pay-form',
    'method' => 'POST',
    'action' => $robokassa->paymentUrl,
]);
echo $robokassa->getHiddenInputsHtml($invoice->getInvoiceOptions());
echo Html::submitButton('оплатить', [
    'onClick' => PopupIframeWidget::SHOW_ROBOKASSA_POPUP_IFRAME_ACTION,
    'class' => 'btn btn-primary btn-lg',
]);
ActiveForm::end();
```

#### ВАРИАНТ: Формирование Popup виджета

[](#вариант-формирование-popup-виджета)

Пример представления [`invoice-popup`](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views/payment/invoice-popup.php)для действия `actionInvoicePopup`

```
use models\Invoice;
use netFantom\Yii2Robokassa\Widgets\PopupIframeWidget;
use netFantom\Yii2Robokassa\Yii2Robokassa;
use yii\helpers\Html;
use yii\web\View;

/* @var $this View */
/* @var $invoice Invoice */

/** @var Yii2Robokassa $robokassa */
$robokassa = Yii::$app->get('robokassa');

PopupIframeWidget::widget([
    'yii2Robokassa' => $robokassa,
    'invoiceOptions' => $invoice->getInvoiceOptions(),
    'showOnLoad' => true,
]);
echo Html::encode("Сформирован счет №$invoice->id на сумму $invoice->sum руб. и ждет оплаты");
echo Html::button('оплатить', [
    'onClick' => PopupIframeWidget::SHOW_ROBOKASSA_POPUP_IFRAME_ACTION,
    'class' => 'btn btn-primary btn-lg',
]);
```

Пример представления [`invoice-create`](https://github.com/igor-netFantom/yii2-robokassa/blob/main/examples/views/payment/invoice-create.php)для действий `actionInvoicePopup` и `actionInvoiceForm`

```
use models\Invoice;
use yii\helpers\Html;
use yii\web\View;
use yii\widgets\ActiveForm;

/* @var $this View */
/* @var $invoice Invoice */

$form = ActiveForm::begin();
echo $form->field($invoice, 'sum')->textInput();
echo Html::submitButton('Пополнить баланс', ['class' => 'btn btn-success']);
ActiveForm::end();
```

###  Health Score

16

—

LowBetter than 5% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity21

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/2eeff58e350c8af349ae0070b53d713c15ce173b46dd19b26d9146cec56a9bbf?d=identicon)[netFantom](/maintainers/netFantom)

---

Top Contributors

[![igor-netFantom](https://avatars.githubusercontent.com/u/26833529?v=4)](https://github.com/igor-netFantom "igor-netFantom (20 commits)")

---

Tags

robokassayii2

### Embed Badge

![Health badge](/badges/netfantom-yii2-robokassa/health.svg)

```
[![Health](https://phpackages.com/badges/netfantom-yii2-robokassa/health.svg)](https://phpackages.com/packages/netfantom-yii2-robokassa)
```

###  Alternatives

[omnipay/paypal

PayPal gateway for Omnipay payment processing library

3156.8M53](/packages/omnipay-paypal)[eduardokum/laravel-boleto

Biblioteca com boletos para o laravel

626351.9k2](/packages/eduardokum-laravel-boleto)[tbbc/money-bundle

This is a Symfony bundle that integrates moneyphp/money library (Fowler pattern): https://github.com/moneyphp/money.

1961.9M](/packages/tbbc-money-bundle)[2checkout/2checkout-php

2Checkout PHP Library

83740.3k2](/packages/2checkout-2checkout-php)[smhg/sepa-qr-data

Generate QR code data for SEPA payments

61717.2k5](/packages/smhg-sepa-qr-data)[omnipay/dummy

Dummy driver for the Omnipay payment processing library

271.2M33](/packages/omnipay-dummy)

PHPackages © 2026

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