Пример проведения платежа

Проведение платежей во встроенных приложениях требует подтверждения от сервера приложения. Оно происходит в 4 этапа:

  1. Внутри приложения вызывается метод FAPI.UI.showPayment.
  2. Платеж происходит либо сразу, либо после появления окна подтверждения.
    • В случае, если появилось окно подтверждения и пользователь нажал кнопку “Закрыть” платеж не происходит.
    • Во всех остальных случаях на url, указанный в поле “Ссылка callback” отправляется GET-запрос с параметрами платежа. Возможные значения параметров и так же формат ответа описаны в описании метода callbacks.payment.
  3. Сервер приложения обрабатывает запрос и отправляет ответ по заданному формату. Если сервер приложения не отвечает на запросы, то платеж прерывается и средства пользователя не списываются.
  4. В случае успеха вызывается callback функция на клиенте, которой передается параметр amount - сумма покупки.

Рассмотрим подробнее обработку платежа на сервере. Алгоритм работы следующий:

  1. Приложение разбирает GET-запрос
  2. Приложение проверяет соответствие товара и цены
  3. Приложение проверяет подпись запроса
  4. (необязательно, однако может пригодиться в случае возникновения вопросов у пользователя) В случае успешной транзакции приложение сохраняет информацию о транзакции
  5. В случае, если проверки из пунктов 2 и 3 завершились успешно, приложение возвращает положительный ответ серверу, в ином случае отрицательный. Формат ответа описан в описании метода callbacks.payment.

Идентификатор транзакции является уникальным, и сервер приложений/игр должен игнорировать транзакции с дублирующимся идентификатором. Он должен возвращать положительный результат, если транзакция ранее была успешно обработана.

Далее представлены примеры по пунктам 2 и 3. В качестве средства разработки выбран язык php как наиболее популярный, однако для разработки может использоваться любой другой язык.

Полную версию примера можно посмотреть на гитхабе (для того, чтобы пример заработал, в приложение необходимо добавить открытый/секретный ключи приложения, а так же свой прайс-лист).

Пример по пункту 2:

// функция провкерки корректности платежа
public static function checkPayment($productCode, $price) {
    if (array_key_exists($productCode, self::$catalog) && self::$catalog[$productCode] == $price) {
        return true;
    } else {
        return false;
    }
}

Пример по пункту 3 (данный код можно скопировать с единственным изменением - подставить свой секретный ключ):

// функция рассчитывает подпись для пришедшего запроса
// подробнее про алгоритм расчета подписи можно посмотреть в документации (https://apiok.ru/dev/methods/)
function calcSignature($request) {
    $tmp = $request;
    unset($tmp["sig"]);
    ksort($tmp);
    $resstr = "";
    foreach($tmp as $key=>$value) {
        $resstr = $resstr.$key."=".$value;
    }
    // сюда необходимо подставить свой секретный ключ
    $resstr = $resstr.self::APP_SECRET_KEY;
    return md5($resstr);
}