Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows通知服务:401尝试在PHP中创建Toast通知时,令牌无效_C#_Php_Windows Phone 8_Push Notification - Fatal编程技术网

C# Windows通知服务:401尝试在PHP中创建Toast通知时,令牌无效

C# Windows通知服务:401尝试在PHP中创建Toast通知时,令牌无效,c#,php,windows-phone-8,push-notification,C#,Php,Windows Phone 8,Push Notification,我一直在尝试向模拟器发送Toast通知。 我创建了Windows Phone 8.1应用程序,并将其与商店中的应用程序关联。 之后,我设法获得了访问令牌,我必须使用它来调用通道URI channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); Debug.WriteLine(channel.Uri); 当我尝试使用通道URI

我一直在尝试向模拟器发送Toast通知。 我创建了Windows Phone 8.1应用程序,并将其与商店中的应用程序关联。 之后,我设法获得了访问令牌,我必须使用它来调用通道URI

 channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
                Debug.WriteLine(channel.Uri);
当我尝试使用通道URI和访问令牌发送Toast通知时,我收到了这个错误

Bearer error="invalid_request",error_description="Invalid token"
这是我创建的php测试代码

<?php

    //GET ACCESS TOKEN
    $tokenRequest = curl_init();
    curl_setopt($tokenRequest, CURLOPT_URL, 'https://login.live.com/accesstoken.srf');

    curl_setopt($tokenRequest, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/x-www-form-urlencoded'
    ));

    //FIELDS
    $fields = array(
        'grant_type' => 'client_credentials',
        'client_id' => '0',
        'client_secret' => 'Q',
        'scope' => 'notify.windows.com'
    );

    $fields_string = "";
    foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
    rtrim($fields_string, '&');

    curl_setopt($tokenRequest, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($tokenRequest,CURLOPT_POST, count($fields));
    curl_setopt($tokenRequest,CURLOPT_POSTFIELDS, $fields_string);

    $output = json_decode(curl_exec($tokenRequest));
    curl_close($tokenRequest);
    echo "<br>";
    var_dump($output);
    echo "<br>";
    $accessToken = $output->{'access_token'};


    //SEND PUSH
    $sendPush = curl_init();
    curl_setopt($sendPush, CURLOPT_URL, 'https://db3.notify.windows.com/?token=AwYAAABuWLaYT1f9BVJwNJCjc243U1OFXUT8MCqvsME%2ftDnhPG%2f%2fJSurxP3u1y47eqmrQZSPUlZH7koHW3Zwdj5938LYZNRdDyE6JzvyHOZvZvSo%3d');

    //TOAST MESSAGE
    $toastMessage = "<wp:Notification xmlns:wp=\"WPNotification\">" .
            "<wp:Toast>" .
            "<wp:Text1>" . "SendToast" . "</wp:Text1>" .
            "<wp:Text2>" . "Text Message" . "</wp:Text2>" .
            "</wp:Toast> " .
            "</wp:Notification>"; 

    curl_setopt($sendPush, CURLOPT_HEADER, true);

    $headers = array('Content-Type: text/xml', "Content-Length: " . strlen($toastMessage), "X-WNS-Type: wns/toast", "Authorization: Bearer $accessToken");
    curl_setopt($sendPush, CURLOPT_HTTPHEADER, $headers);

    curl_setopt($sendPush, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($sendPush,CURLOPT_POST, 1);        
    curl_setopt($sendPush, CURLOPT_POSTFIELDS, $toastMessage);         

    $output = curl_exec($sendPush);

    echo "<br>";
    var_dump(curl_getinfo($sendPush, CURLINFO_HTTP_CODE));
    echo "<br>";
    var_dump(curl_getinfo($sendPush, CURLINFO_HEADER_OUT));
    echo "<br>";
    var_dump($output);
    curl_close($sendPush);
    // Create request to send
?>  
知道是什么导致了这个问题吗?

我找到了解决办法

您必须发送以请求令牌的客户端id不是应用程序的客户端id。 您必须发送包SID,而不是发送客户端ID。 非常混乱。

我找到了解决办法

您必须发送以请求令牌的客户端id不是应用程序的客户端id。 您必须发送包SID,而不是发送客户端ID。
非常混乱。

401通常意味着服务器未经授权或客户端密码错误。我不知道CURL,但您可以通过以下演练将您的逻辑与我在.NET中的逻辑进行比较:401通常意味着服务器未经授权或客户端密码错误。我不知道CURL,但您可以通过以下演练将您的逻辑与我在.NET中的逻辑进行比较:还要添加一件事。您需要整个包SID。这包括协议“ms-app://”。还有一点需要补充。您需要整个包SID。其中包括协议“ms app://”。