VK Play Разработчики

Как проверить, какой itemdefid был оплачен, если `merchant_param` формируется в браузерной игре?

Для billing/item/client платформа не просто возвращает исходный merchant_param: она получает выбранные товары из каталога по параметру ids, рассчитывает стоимость и добавляет в merchant_param массив items. В callback идентификаторы товаров доступны в merchant_param.items[].itemid, например:

ПРИМЕР КОДА

json
   {
     "items": [
       {"itemid": 101, "description": "Golden Chest"},
       {"itemid": 102, "description": "Silver Chest"}
     ]
   }

 Доверять этим данным следует только после проверки подписи callback.

 Рекомендуемая схема интеграции:

 1. Создавайте заказ на сервере игры. Браузер передаёт намерение купить товары, а сервер проверяет пользователя и допустимость покупки, сохраняет заказ и его состав.

 2. Вызывайте billing/item/client с сервера игры. Выбранные идентификаторы передаются отдельным параметром ids. В merchant_param передаются пользователь, IP и собственный идентификатор заказа, например:

ПРИМЕР КОДА

json
      {
        "uid": "12345",
        "ip": "8.8.8.8",
        "additional_param": "order_uuid=..."
      }

Для этого метода не передавайте amount — запрос будет отклонён. Стоимость, валюту, описание и массив items формирует платформа.

Подписывать нужно весь запрос, включая ids и строку merchant_param, кроме самого sign, а не только содержимое merchant_param. Секрет не должен попадать в браузер.

 3. Проверяйте подпись callback. Для стандартного уведомления используются uid, sum, tid, merchant_param: параметры сортируются по имени, соединяются как key=value без разделителей и без дополнительного URL-кодирования, в конец добавляется секрет, затем вычисляется MD5 от строки в UTF-8. Результат сравнивается с sign.

Для проверки берите полученную строку merchant_param после обычного URL-декодирования. Не пересериализуйте JSON перед расчётом подписи: это может изменить подписанную строку.

 4. Сопоставляйте уведомление с сохранённым заказом. Проверяйте владельца заказа по uid и фактический состав покупки по merchant_param.items[].itemid. Нельзя выдавать товары только на основании собственного item_id или списка в additional_param: эти пользовательские поля сами по себе не подтверждают, какие товары платформа включила в платёж.

 5. Обрабатывайте выдачу идемпотентно по tid. Повторная доставка уже обработанной транзакции не должна приводить к повторному начислению.