@luckyjenro0

Почему киви выполняет запрос несколько раз?

Есть обработчик уведомлений от QIWI P2P:
include __DIR__ . '/../../../vendor/autoload.php';
include __DIR__ . ('/../../../Modules/MySqli/link.php');
include __DIR__ . ('/../../../Modules/MySqli/vars.php');
include __DIR__ . ('/../Functions.php');
require_once __DIR__ . '/../../Give_Class.php';

use Donate\GiveDonate;

$sha256_hash_header = $_SERVER['HTTP_X_API_SIGNATURE_SHA256']; // Получаем заголовок

$entity_body = file_get_contents('php://input'); // Декодирую тело входящего запроса
$array_body = json_decode($entity_body, 1); // Декодирует строку JSON

$amount_currency = $array_body['bill']['amount']['currency'];
$amount_value = $array_body['bill']['amount']['value'];
$billId = $array_body['bill']['billId'];
$siteId = $array_body['bill']['siteId'];
$status_value = $array_body['bill']['status']['value'];
$nickname = $array_body['bill']['customFields']['nickname'];
$promo = $array_body['bill']['customFields']['promo'];
$count = $array_body['bill']['customFields']['count'];
$good = $array_body['bill']['customFields']['good'];
$paySourcesFilter = $array_body['bill']['customFields']['paySourcesFilter'];
/* тут могут быть дополнительные параметры по типу почты, телефона и тд, ознакомьтесь с документацией если они Вам нужны */

$good_cur = findGood($good);

$good_category = $good_cur['category'];

$array_server = mysqli_query($link, "SELECT * FROM `categorys` WHERE `id`='{$good_category}'");

while ($row = mysqli_fetch_assoc($array_server)) {
  $server_cur = $row['server'];
}

date_default_timezone_set('UTC');

$date_cur = date("y-m-d");

$localtime_assoc = localtime(time(), true);

$time_cur =  $localtime_assoc['tm_hour'] . ":" . $localtime_assoc['tm_min'] . ":" . $localtime_assoc['tm_sec'];

$invoice_parameters = $amount_currency . '|' . $amount_value . '|' . $billId . '|' . $siteId . '|' . $status_value;

$sha256_hash = hash_hmac('sha256', $invoice_parameters, $qiwi_secret);

if (!empty($sha256_hash_header) && $sha256_hash_header == $sha256_hash && $status_value == 'PAID') {
  $response = mysqli_query($link, "INSERT INTO `payments` (`id`, `login`, `good_id`, `sum`, `category`, `server`, `date_pay`, `time_pay`, `amount`, `promo-use`, `status`) VALUES (NULL, '{$nickname}', '{$good}', '{$amount_value}', '{$good_category}', '{$server_cur}', '{$date_cur}', '{$time_cur}', '{$count}', '{$promo}', 'NULL')");

  $request = new GiveDonate();
  $nickname_o = $request->nickname = $nickname;
  $amount_o = $request->amount = $count;
  $good_id_o = $request->good_id = $good;

  $checks = $request->Give($nickname_o, $good_id_o, $amount_o);
  die('OK');
}


Почему-то после того как клиент оплатил, в базу данных заносится запись, потом через 20 секунд еще такая, и это повторяется раз 5, тоесть обработчик доолжен внести один раз, а киви почему то на него переходит раз 5.
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
@luckyjenro0 Автор вопроса
Проблему решил! В моем методе котоырй выполнялся после оплаты была задержка на подключение к серверу 3 секунды, а в документации киви написано что если в течении 2 секунд не было ответа то он заоново пошлет запрос!
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@inFureal
Сделай логи всего ответного запроса от киви. Есть вариант, что приходят обновления состояния транзакции. Что-то типа, пришло, удержание, получение, перенос на лицевой счет и т.д.
Ответ написан
@StockholmSyndrome
могу предположить, что киви ждёт не просто OK, а ещё и json в качестве ответа, как написано в документации
и из-за того, что не получает, отправляет запрос ещё раз
$data = [ "error" => "0" ];
echo json_encode($data);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы