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

Авторизация денежных средств

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

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

Запрос на создание операции:
{  
   "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

$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 для оплаты созданной операции:

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

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

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

Подтвердить операцию можно методом ConfirmTransactionRequest или вручную в личном кабинете на сайте www.moneta.ru.

Запрос:
{  
   "Envelope":{  
      "Header":{  
         "Security":{  
            "UsernameToken":{  
               "Username":"Username",
               "Password":"Password"
            }
         }
      },
      "Body":{  
         "ConfirmTransactionRequest":{  
            "transactionId":12345678,
            "paymentPassword":*****
         }
      }
   }
}
Ответ: 
{  
   "Envelope":{  
      "Body":{  
         "ConfirmTransactionResponse":{  
            "operationStatus":"SUCCEED",
            "transactionId":12345678
         }
      }
   }
}
<?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" - Адрес обработчика в системе учета маркетплейса для уведомлений о проведенной оплате.

Подробно об уведомлении о проведенной оплате в MONETA.Assistant

7. Если заказ не может быть выполнен, маркептлейс отменяет операцию методом CancelTransactionRequest или вручную в личном кабинете на сайте www.moneta.ru.

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



Ответ: 
{  
   "Envelope":{  
      "Body":{  
         "CancelTransactionResponse":{  
            "operationStatus":"CANCELED",
            "transactionId":12345678
         }
      }
   }
}
<?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 дней.

Запросы маркетплейс отправляет в рамках интерфейса MONETA.MerchantAPI.

Интерфейс MONETA.MerchantAPI представляет собой Web-сервис, описанный по спецификации Web Services Description Language (WSDL), использующий протокол Simple Object Access Protocol (SOAP) для передачи информации.

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

Last updated