Apple Wallet не передает Push-токен веб-службе

У меня есть Pass for Apple Wallet с указанным webServiceURL, который я сейчас пытаюсь заставить работать. До сих пор я могу сказать, добавлен или удален пропуск, после проверки с помощью токена аутентификации, и я получаю правильный идентификатор устройства, а также серийные номера. Однако значение $_POST является пустым массивом при добавлении прохода, поэтому я не могу получить токен Push. Есть ли что-то, что мне не хватает? Вот мой PHP.

<?php
function unauthorized() {
  header('HTTP/1.1 401 Unauthorized');
  exit;
}
$headers = apache_request_headers();
if (isset($headers['Authorization']) && strpos($headers['Authorization'], 'ApplePass') === 0 && strpos($_SERVER['PATH_INFO']) !== false) {
  $pathInfo = $_SERVER['PATH_INFO'];
  if ($pathInfo[0] === '/') { $pathInfo = substr($pathInfo, 1); }
  $parameters = explode('/', $pathInfo);
  if ($parameters[0] !== 'v1' || $parameters[1] !== 'devices' || $parameters[3] !== 'registrations' || $parameters[4] !== 'MYPASSIDENTIFIER') {
    unauthorzed();
    exit;
  }

  $deviceId = $parameters[2];
  $passSerial = $parameters[5];

  if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    // User deleted pass

  } else  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // User added pass
    $payload = json_decode($_POST);
    // $_POST is empty array, and $payload is always nothing
  } else {
    // Something fishy
    unauthorized();
  }

} else {
  unauthorized();
}

person Griffen    schedule 16.10.2017    source источник


Ответы (1)


Попробуйте использовать REQUEST_URI и прочитать тело с помощью php://inpupt

$headers = apache_request_headers();
$request = explode("/", substr(@$_SERVER['REQUEST_URI'], 1));

if (strtoupper($_SERVER['REQUEST_METHOD']) === "POST" 
    && isset($headers['Authorization'])
    && (strpos($headers['Authorization'], 'ApplePass') === 0)
    && $request[1] === "devices"
    && ($request[3] === "registrations") {

    $auth_key = str_replace(array('ApplePass '), '', $headers['Authorization']);

    $device_id = $request[2];
    $pass_id = $request[4];
    $serial = $request[5];

    $dt = @file_get_contents('php://input');
    $det = json_decode($dt);

    // Process Device Token 
person PassKit    schedule 16.10.2017
comment
Благодарю вас! Я не знал, что $_POST не будет представлять JSON или другие разные данные, так что это очень важно! - person Griffen; 16.10.2017