Intereting Posts
загрузить изображение из удаленного источника и изменить размер, затем сохранить Doxygen странная проблема при документировании PHP if Преобразование данных формы в XML Yii CDbConnection не удалось открыть соединение с БД: не удалось найти драйвер с облаком Google sql Не удалось перейти к строке 0 по индексу результата MySQL 13 Подготовка приложения PHP для использования с UTF-8 Преобразование даты mysql (datetime) в формат более датированной даты с использованием php Соглашения о присвоении имен при использовании codeigniter в windows и linux PHP отправляет несколько запросов о событиях в одном письме в Outlook Создание дерева из базы данных в Yii Что произойдет, если вы вызовите конструктор из деструктора? Подключение к удаленному серверу MySQL с помощью SSL с PHP Как мне получить доступ к данным PEST API PEST API на стороне сервера? Zend \ ServiceManager \ ServiceManager :: get не удалось получить или создать экземпляр для getAlbumTable Наиболее эффективный способ создания файлов Excel

Azure Notification Hubs REST API с PHP

Я пытаюсь создать SharedAccessSignature для API-интерфейсов Azure Notifications Hubs в PHP.

Я продолжаю получать сообщение об ошибке «Недопустимая подпись маркера авторизации».

У кого-нибудь есть пример создания SAS в PHP 5.4+? Существует некоторая документация API по адресу : http://msdn.microsoft.com/en-us/library/dn170477.aspx , но некоторые люди говорят, что реализация отличается от документации.

Это моя неудачная реализация:

private static function get_authentication_header() { $uri = "https://x.servicebus.windows.net/x"; $expiry = time() + (60*60); $string = utf8_encode(urlencode($uri) . "\n" . $expiry); $keyname = "DefaultFullSharedAccessSignature"; $key = base64_decode(static::HUB_KEY); $signature = base64_encode(hash_hmac('sha256', $string, $key)); $sas = 'SharedAccessSignature sig=' . $signature . '&se=' . $expiry . '&skn=' . $keyname . '&sr=' . urlencode($uri); return $sas; } 

Вот простая оболочка для отправки уведомлений в хакеры уведомлений с PHP.

 <?php include 'Notification.php'; class NotificationHub { const API_VERSION = "?api-version=2013-10"; private $endpoint; private $hubPath; private $sasKeyName; private $sasKeyValue; function __construct($connectionString, $hubPath) { $this->hubPath = $hubPath; $this->parseConnectionString($connectionString); } private function parseConnectionString($connectionString) { $parts = explode(";", $connectionString); if (sizeof($parts) != 3) { throw new Exception("Error parsing connection string: " . $connectionString); } foreach ($parts as $part) { if (strpos($part, "Endpoint") === 0) { $this->endpoint = "https" . substr($part, 11); } else if (strpos($part, "SharedAccessKeyName") === 0) { $this->sasKeyName = substr($part, 20); } else if (strpos($part, "SharedAccessKey") === 0) { $this->sasKeyValue = substr($part, 16); } } } private function generateSasToken($uri) { $targetUri = strtolower(rawurlencode(strtolower($uri))); $expires = time(); $expiresInMins = 60; $expires = $expires + $expiresInMins * 60; $toSign = $targetUri . "\n" . $expires; $signature = rawurlencode(base64_encode(hash_hmac('sha256', $toSign, $this->sasKeyValue, TRUE))); $token = "SharedAccessSignature sr=" . $targetUri . "&sig=" . $signature . "&se=" . $expires . "&skn=" . $this->sasKeyName; return $token; } public function broadcastNotification($notification) { $this->sendNotification($notification, ""); } public function sendNotification($notification, $tagsOrTagExpression) { echo $tagsOrTagExpression."<p>"; if (is_array($tagsOrTagExpression)) { $tagExpression = implode(" || ", $tagsOrTagExpression); } else { $tagExpression = $tagsOrTagExpression; } # build uri $uri = $this->endpoint . $this->hubPath . "/messages" . NotificationHub::API_VERSION; echo $uri."<p>"; $ch = curl_init($uri); if (in_array($notification->format, ["template", "apple", "gcm"])) { $contentType = "application/json"; } else { $contentType = "application/xml"; } $token = $this->generateSasToken($uri); $headers = [ 'Authorization: '.$token, 'Content-Type: '.$contentType, 'ServiceBusNotification-Format: '.$notification->format ]; if ("" !== $tagExpression) { $headers[] = 'ServiceBusNotification-Tags: '.$tagExpression; } # add headers for other platforms if (is_array($notification->headers)) { $headers = array_merge($headers, $notification->headers); } curl_setopt_array($ch, array( CURLOPT_POST => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => $notification->payload )); // Send the request $response = curl_exec($ch); // Check for errors if($response === FALSE){ throw new Exception(curl_error($ch)); } $info = curl_getinfo($ch); if ($info['http_code'] <> 201) { throw new Exception('Error sending notificaiton: '. $info['http_code'] . ' msg: ' . $response); } //print_r($info); //echo $response; } } ?> 

Я не знаю, хотите ли вы отправить толкать или управлять регистрацией. Нетрудно изменить вышеприведенное правило для управления регистрацией, как показано в API NH REST (помните, что порядок в XML-документах имеет значение!): http://msdn.microsoft.com/en-us/library/dn223264.aspx ,

Дайте мне знать, если у вас все еще возникают проблемы.

Elio