Общий принцип проведения платежа
Проведение платежей во встроенных приложениях требует подтверждения от сервера приложения. Оно происходит в 4 этапа:
- Внутри приложения вызывается метод FAPI.UI.showPayment.
- Платеж происходит либо сразу, либо после появления окна подтверждения.
- В случае, если появилось окно подтверждения и пользователь нажал кнопку “Закрыть”, платеж не происходит.
- Во всех остальных случаях на URL, указанный в поле “Ссылка callback”, отправляется GET-запрос с параметрами платежа. Возможные значения параметров и также формат ответа описаны в документации по методу callbacks.payment.
- Сервер приложения обрабатывает запрос и отправляет ответ по заданному формату. Если сервер приложения не отвечает на запросы, то платеж прерывается и средства пользователя не списываются.
- В случае успеха вызывается callback функция на клиенте, которой передается параметр amount - сумма покупки.
Серверная валидация
Рассмотрим подробнее обработку платежа на сервере. Алгоритм работы следующий:
- Приложение разбирает GET-запрос.
- Приложение проверяет соответствие товара и цены.
- Приложение проверяет подпись запроса.
- (необязательно, однако может пригодиться в случае возникновения вопросов у пользователя) В случае успешной транзакции приложение сохраняет информацию о транзакции.
- В случае, если проверки из пунктов 2 и 3 завершились успешно, приложение возвращает положительный ответ серверу, в ином случае отрицательный. Формат ответа описан в документации по методу callbacks.payment.
Идентификатор транзакции является уникальным, и сервер приложений/игр должен игнорировать транзакции с дублирующимся идентификатором. Он должен возвращать положительный результат, если транзакция ранее была успешно обработана.
Далее представлены примеры по пунктам 2 и 3. В качестве средства разработки выбран язык php как наиболее популярный, однако для разработки может использоваться любой другой язык.
Полную версию примера можно посмотреть на гитхабе (для того, чтобы пример заработал, в приложение необходимо добавить открытый/секретный ключи приложения, а так же свой прайс-лист).
Примеры
Ниже представлены примеры реализации 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);
}