2017-02-23 97 views
1

我有一个问题,我试图让PHP的Notification Hub REST包装工作。我按照说明,并插入正确的凭据,但我仍然得到一个错误信息:Azure通知中心 - 401 MissingToken:未找到授权标头

"Fatal error: Uncaught exception 'Exception' with message 'Error sending notificaiton: 401 msg: 401 MissingToken: The authorization header was not found..TrackingId:7392381b-7e4b-4ced-9090-6f3f8beac79d_G19,TimeStamp:2/23/2017 5:44:36 PM' in /"PATH"/class.NotificationHub.php:127 Stack trace: #0 /"PATH"/testingOfNotification.php(21): NotificationHub->sendNotification(Object(Notification), NULL) #1 {main} thrown in /"PATH"/class.NotificationHub.php on line 127"

我遵循的指南是this guide

这里是我的代码:

require_once("class.NotificationHub.php"); 

    $hub = new NotificationHub("Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=XXXX", "XXXX"); 

$message = '{"data":{"message":"Hello from PHP!"}}'; 

$notification = new Notification("gcm", $message); 

$hub->sendNotification($notification, null); 

class.Notification.php

class Notification { 
    public $format; 
    public $payload; 
    public $headers; 

    function __construct($format, $payload) { 
     if (!in_array($format, ["template", "apple", "windows", "gcm", "windowsphone"])) { 
      throw new Exception('Invalid format: ' . $format); 
     } 
     $this->format = $format; 
     $this->payload = $payload; 
    } 
} 

class.NotificationHub

include 'class.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); 
     } 
    } 
} 

public 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"; //;charset=utf-8 
    } else { 
     $contentType = "application/xml"; 
    } 
    $token = $this->generateSasToken($uri); 

    //printArr($token, "token"); die(); 

    $headers = [ 
     'Authorization: '.$token, 
     'Content-Type: '.$contentType, 
     'ServiceBusNotification-Format: '.$notification->format 
    ]; 

    printArr($headers); 

    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_CUSTOMREQUEST => 'PUT', 
     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; 
} 
} 

所以我的问题是被我该怎么错了?我知道从Azure通知中心到我的Android应用程序的连接正在工作,因为从Azure发送的测试通知将显示在我的设备上。

回答

0

该错误表明:The authorization header was not found。但是头文件已经传入你的代码中。所以请仔细检查您发布的代码是否与您的服务器上运行的代码完全相同。

我也在我的网站上测试过它,它工作正常。

这里是我的截图:

enter image description here

enter image description here

+0

谢谢你 昨天之前,我贴我在Azure中提出了一个新的命名空间和通知中心的问题,我想它的答复:)但得到了相同的结果。 但现在它以某种方式工作,我真的不知道为什么。 但是非常感谢你的时间。 -Kristian – Tenderiser