cordova — Регистрация в Центре уведомлений с PHP Backend

Для пользовательских требований серверная часть должна быть PHP, а клиент приложения — в Ionic 2. На основе:

https://msdn.microsoft.com/en-us/library/azure/dn223265.aspx
https://github.com/Azure/azure-notificationhubs-samples/tree/master/notificationhubs-rest-php
https://github.com/webwarejp/notificationhubs-rest-php

Создать регистрационный центр уведомлений Azure PHP Важный

Я создал этот метод в php API:

    $uri = $this->endpoint . $this->hubPath . "/registrations".NotificationHub::API_VERSION;
/* print($uri); */
$ch = curl_init($uri);
$token = $this->generateSasToken($uri);
$headers = [
'Authorization: '. $token,
'Content-Type: '."application/atom+xml;type=entry;charset=utf-8",
'x-ms-version: 2015-01',
'Content-Length: 0'
];
$body = $this->getXmlAndroid($registrationId, $tag);
print_r($body);
curl_setopt_array($ch, array(
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body
));
$response = curl_exec($ch);
// Check for errors
if($response === FALSE){
print_r(curl_error($ch));
throw new Exception(curl_error($ch));
}

$info = curl_getinfo($ch);
print_r($info);
curl_close($ch);

Метод getXmlAndroid — это простой формат возврата XML с идентификатором GCM

private function getXmlAndroid($registrationId){
return '<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
<content type="application/xml">
<GcmRegistrationDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">
<GcmRegistrationId>'.$registrationId.'</GcmRegistrationId>
</GcmRegistrationDescription>
</content>
</entry>';

}

Я получаю GcmRegistrationId с этой функцией в приложении Ionic 2.

import { Push, PushObject, PushOptions } from '@ionic-native/push';
....
const options: PushOptions = {
android: { senderID: 'MyIDFirebaseProject'},
ios: { alert: 'true', badge: true, sound: 'false'},
windows: {}
};
pushObject.on('registration').subscribe((registration: any) => {
console.log(registration.registrationId);
});

Проблема всегда в запросе метода регистрации в возврате API уведомлений

[http_code] => 400

Где 400 означает «Недопустимое тело запроса. Регистрация не может быть создана, потому что запрос был искажен». Я не понимаю, почему это произошло.

14

Решение

Почему вы отправляете заголовок Content-Length: 0? Это может вызвать проблемы.

6

Другие решения

Других решений пока нет …