# 3. Прием платежей с холдированием

## Последовательность действий, при приеме платежей с холдированием:

1. Маркетплейс создает операцию методом InvoiceRequest с атрибутом AUTHORIZEONLY установленном в 1 (единицу).\
   В ответ Система "МОНЕТА.РУ" сообщит маркетплейсу номер созданной операции.

```javascript
Запрос на создание операции:
{  
   "Envelope":{  
      "Header":{  
         "Security":{  
            "UsernameToken":{  
               "Username":"Username",
               "Password":"Password"
            }
         }
      },
      "Body":{  
         "InvoiceRequest":{  
            "payer":"НОМЕР СЧЕТА ПЛАТЕЛЬЩИКА",
            "payee":"НОМЕР СЧЕТА ПОЛУЧАТЕЛЯ",
            "amount":100,
            "clientTransaction":"ТЕСТ",
            "description":"МАРКЕТПЛЕЙС",
            "operationInfo":{  
               "attribute":[  
                  {  
                     "key":"AUTHORIZEONLY",
                     "value":"1"
                  }
               ]
            }
         }
      }
   }
}

Ответ:
{  
   "Envelope":{  
      "Body":{  
         "InvoiceResponse":{  
            "dateTime":"YYYY-MM-DD12:35:12.000+03:00",
            "clientTransaction":"ТЕСТ",
            "transaction":12345678,
            "status":"CREATED"
         }
      }
   }
}
```

```php
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\InvoiceRequest();

    //номер счёта плательщика (счёт для списания средств) в системе МОНЕТА.РУ.
    $request->payer = '';

    //номер счёта получателя (счёт для зачисления средств) в системе МОНЕТА.РУ.
    $request->payee = '';

    //сумма инвойса
    $request->amount = '10.00';

    //описание инвойса
    $request->description = 'Краткое описание';

    //номер инвойса в учётной системе магазина/маркетплейса.
    $request->clientTransaction = 'my-order-id';

    $operation = new \Moneta\Types\OperationInfo();

    //параметр говорит о том, что деньги нужно зарезервировать(авторизовать), а не списывать.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'AUTHORIZEONLY';
    $attribute->value = '1';
    $operation->addAttribute($attribute);

    //номер инвойса в учётной системе магазина/маркетплейса (вариант 2). Опционально.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'clienttransaction';
    $attribute->value = 'my-order-id';
    $operation->addAttribute($attribute);

    //произвольный параметр. Опционально.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'customfield:myParam1';
    $attribute->value = 'myValue1';
    $operation->addAttribute($attribute);

    $request->operationInfo = $operation;

    //создание нового инвойса
    $result = $monetaSdk->monetaService->Invoice($request);

    if (!$result['transaction']) {
        throw new Exception(print_r($result, true));
    }

    //номер операции: необходим для предоставления формы оплаты покупателю и
    //дальнейшего резервирования(авторизации) денежных средств
    echo "Номер операции: " . $result['transaction'];

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}
```

2\. Маркетплейс переводит покупателя по ссылке на платежную форму MONETA.Assistant для оплаты созданной операции:<br>

```markup
https://www.moneta.ru/assistant.widget?operationId=номер созданной операции.
```

3\. Маркетплейс сохраняет номер операции и детали операции в своей базе данных.\
\
4\. После успешной авторизации покупатель будет переведен на InProgressURL - адрес маркетплейса, указанный в настройках расширенного счета в личном кабинете на сайте [www.moneta.ru](http://www.moneta.ru) \
\
5\. После успешной авторизации Система "МОНЕТА.РУ" отправит URL - уведомление на адрес маркетплейса, указанный в настройках расширенного счета в личном кабинете на сайте [www.moneta.ru](http://www.moneta.ru) в разделе **Действия при зачислении/списании** **средств** в поле **Вызвать URL после авторизации средств.** В этом скрипте по параметру MNT\_OPERATION\_ID маркетплейсу необходимо отметить запись в базе данных по строке с operationId, как активную (готовую к обработке). По активной операции денежные средства авторизованы на банковской карте покупателя.

6\. Если заказ может быть выполнен, то необходимо подтвердить операцию на сумму равную или меньше, указанной при операции холдирования.

Подтвердить операцию можно методом ConfirmTransactionRequest или вручную в личном кабинете на сайте [www.moneta.ru.\&#x20](http://www.moneta.ru.\&#x20);

```javascript
Запрос:
{  
   "Envelope":{  
      "Header":{  
         "Security":{  
            "UsernameToken":{  
               "Username":"Username",
               "Password":"Password"
            }
         }
      },
      "Body":{  
         "ConfirmTransactionRequest":{  
            "transactionId":12345678,
            "paymentPassword":*****
         }
      }
   }
}
Ответ: 
{  
   "Envelope":{  
      "Body":{  
         "ConfirmTransactionResponse": {
            "id": 12345678,
            "attribute": [
...
               {
                  "value": "SUCCEED",
                  "key": "statusid"
               }
...
            ]
         }
      }
   }
}
```

```php
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\InvoiceRequest();

    //номер счёта плательщика (счёт для списания средств) в системе МОНЕТА.РУ.
    $request->payer = '';

    //номер счёта получателя (счёт для зачисления средств) в системе МОНЕТА.РУ.
    $request->payee = '';

    //сумма инвойса
    $request->amount = '10.00';

    //описание инвойса
    $request->description = 'Краткое описание';

    //номер инвойса в учётной системе магазина/маркетплейса.
    $request->clientTransaction = 'my-order-id';

    $operation = new \Moneta\Types\OperationInfo();

    //параметр говорит о том, что деньги нужно зарезервировать(авторизовать), а не списывать.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'AUTHORIZEONLY';
    $attribute->value = '1';
    $operation->addAttribute($attribute);

    //номер инвойса в учётной системе магазина/маркетплейса (вариант 2). Опционально.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'clienttransaction';
    $attribute->value = 'my-order-id';
    $operation->addAttribute($attribute);

    //произвольный параметр. Опционально.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'customfield:myParam1';
    $attribute->value = 'myValue1';
    $operation->addAttribute($attribute);

    $request->operationInfo = $operation;

    //создание нового инвойса
    $result = $monetaSdk->monetaService->Invoice($request);

    if (!$result['transaction']) {
        throw new Exception(print_r($result, true));
    }

    //номер операции: необходим для предоставления формы оплаты покупателю и
    //дальнейшего резервирования(авторизации) денежных средств
    echo "Номер операции: " . $result['transaction'];

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}
```

После подтверждения операции Система "МОНЕТА.РУ" отправит уведомление о проведенной оплате на "Pay URL" - Адрес обработчика в системе учета маркетплейса для уведомлений о проведенной оплате.&#x20;

{% hint style="info" %}
Подробно об уведомлении о проведенной оплате в [MONETA.Assistant](https://www.moneta.ru/doc/MONETA.Assistant.ru.pdf)                                                                                      &#x20;
{% endhint %}

&#x20;     7\. Если заказ не может быть выполнен, маркептлейс отменяет операцию методом CancelTransactionRequest или вручную в личном кабинете на сайте [www.moneta.ru.\&#x20](http://www.moneta.ru.\&#x20);

```javascript
Запрос:
{  
   "Envelope":{  
      "Header":{  
         "Security":{  
            "UsernameToken":{  
               "Username":"Username",
               "Password":"Password"
            }
         }
      },
      "Body":{  
         "CancelTransactionRequest":{  
            "transactionId":12345678
         }
      }
   }
}



Ответ: 
{  
   "Envelope":{  
      "Body":{  
         "CancelTransactionResponse": {
            "id": 12345678,
            "attribute": [
...
               {
                  "value": "SUCCEED",
                  "key": "statusid"
               }
...
            ]
         }
      }
   }
}
```

```php
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\CancelTransactionRequest();

    //номер операции, по которой было сделано резервирование(авторизация) средств
    $request->transactionId = '';

    //отмена операции холдирования
    $result = $monetaSdk->monetaService->CancelTransaction($request);

    if (!$result['operationStatus']) {
        throw new Exception(print_r($result, true));
    }

    if ('CANCELED' !== $result['operationStatus']) {
        throw new Exception(print_r($result, true));
    }

    echo "Операция отменена. Резерв средств снят.";

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}
```

Максимальный срок авторизации денежных средств на банковской карте - 7 дней.&#x20;

{% hint style="info" %}
Запросы маркетплейс отправляет в рамках интерфейса MONETA.MerchantAPI.

Интерфейс [MONETA.MerchantAPI ](http://www.moneta.ru/doc/MONETA.MerchantAPI.v2.ru.pdf)представляет собой Web-сервис, описанный по спецификации Web Services Description Language [(WSDL)](https://service.moneta.ru/services.wsdl), использующий протокол Simple Object Access Protocol (SOAP) для передачи информации.
{% endhint %}

Для получения URL - уведомлений о статусах операций с холдированием необходимо заполнить раздел Действия при зачислении/списании денежных средств. Данный раздел находится в настройках транзитного счета маркетплейса.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.payanyway.ru/marketplace/platezhnye-zaprosy/3.-priem-platezhei-s-kholdirovaniem.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
