Я реализую функциональность 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-сервисы на устройстве, чтобы установить пароль на паспорт.
============ ОБНОВЛЕНИЕ =============
Вот шаги для генерации моих сертификатов.
.p12
продление требуется для подписания купона на время создания. Этот купон успешно устанавливается на устройстве. Затем я преобразовал это .p12
в .pem
используется в коде выше для подключения push-сервера. Используя команду;
openssl pkcs12 -в пути.p12 -на новом файле.pem
Если что-то не так с моим сертификатом, пожалуйста, укажите.
Задача ещё не решена.
Других решений пока нет …