Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Registration in Notification Hub with PHP Backend

For user requeriments the backend must be PHP and the app client is in Ionic 2. Based on:

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

Create Registration Notification Hub Azure PHP Important

I created this method in 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);

The getXmlAndroid method is simple return xml format with GCM ID

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>';

 }

I get the GcmRegistrationId with this function in Ionic 2 app.

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);
});

The problem is always request to Registration method in Notification API return

[http_code] => 400

Where 400 means the "Invalid request body. The registration could not be created because the request was malformed.". I don't understand why this happen.

like image 219
CampDev Avatar asked Aug 03 '17 01:08

CampDev


1 Answers

Why you send Content-Length: 0 header? It may cause a problem.

like image 56
Alexander Mihalicyn Avatar answered Oct 18 '22 11:10

Alexander Mihalicyn