Сервер APNS отвечает статусом 8-invalid-token, но устройства регистрируются правильно
Я реализую функциональность Passbook для моего приложения для iOS. Я использую php в качестве языка на стороне сервера для генерации передачи и распространения на устройства. Проходы успешно устанавливаются на устройстве, и я также могу обновить проход вручную, используя pull для повторного обновления. Когда я пытаюсь автоматически обновить пароль со стороны сервера, я получаю ответ 8-invalid-token с сообщением "Идентификатор - это идентификатор строки (index) в базе данных, которая вызвала проблему. Apple отключит вас.....". Я не понимаю, почему это происходит. Устройства регистрируются правильно, и другие конечные точки также работают нормально. Если проход был неправильным, он не должен быть установлен на устройстве. Я подписал пароль, используя тот же сертификат типа удостоверения личности, который я использую для отправки push-уведомлений. Я также проверил свои сертификаты с помощью этой команды, перечисленной здесь.
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourSSLCertAndPrivateKey.pem -debug -showcerts -CAfile server-ca-cert.pem
Я проверяю это как для песочницы, так и для производства, и это не показывает никакой ошибки. Я использую производственный URL для отправки push-уведомления, чтобы обновить проход; Вот мой код для отправки push;
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;
$apnsCert = base_path().'/path/to/ptypeidcert.pem';//converted using ssl from passtypeid.p12 certificated
$push_token = $token;
$passIdentify = 'pass.myidentifier.coupon';
$payload = '{}';
$msg = chr(0) . pack('n', 32) . pack('H*', $push_token) . pack('n', strlen($payload)) . $payload . pack('n', strlen($passIdentify)) . $passIdentify;
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'cafile', base_path().'/path/to/entrust_2048_ca.cer');
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', 'export_password');
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
fwrite($apns, $msg);
PushNotifications::checkAppleErrorResponse($apns);// Just created a class to read response from apn server
@socket_close($apns);
fclose($apns);
Любая помощь для дальнейшей отладки будет действительно цениться. Что-то для отладки моих сертификатов? Примечание. Конечные точки моего API обслуживаются протоколом http только для целей тестирования, и они обновляются до протокола https. Я включил HTTP-сервисы на устройстве, чтобы установить пароль на паспорт.
============ ОБНОВЛЕНИЕ ============= Вот шаги для создания моих сертификатов.
- Сначала я загрузил свой сертификат Pass Type Id (.cer), используя CSR-запрос с моим ключом.
- Затем экспортировал этот сертификат с использованием доступа к брелку на Mac, чтобы
.p12
продление требуется для подписания купона на время создания. Этот купон успешно устанавливается на устройстве. Затем я преобразовал это
.p12
в.pem
используется в коде выше для подключения push-сервера. Используя команду;openssl pkcs12 -в пути.p12 -на новом файле.pem
Если что-то не так с моим сертификатом, пожалуйста, укажите.