gpt4 book ai didi

php - Azure 通知中心 - 401 MissingToken : The authorization header was not found

转载 作者:行者123 更新时间:2023-12-02 07:29:06 24 4
gpt4 key购买 nike

我遇到了一些问题,我正在尝试让 PHP 工作的通知中心 REST 包装器。我按照说明插入了正确的凭据,但仍然收到错误消息:

"Fatal error: Uncaught exception 'Exception' with message 'Error sending notificaiton: 401 msg: 401MissingToken: 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);

类.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;
}
}

类.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 发送的测试通知将显示在我的设备上。

最佳答案

错误表明:未找到授权 header 。但 header 已在您的代码中传递。因此,请仔细检查您发布的代码是否与您服务器上运行的代码完全相同。

我还在我的网站上测试了它,效果很好。

这是我的屏幕截图:

enter image description here

enter image description here

关于php - Azure 通知中心 - 401 MissingToken : The authorization header was not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com