2

当我使用GCM进行推送通知时,出现错误,返回值为:field“data”必须是JSON数组。 当用户创建新帖子时,通知将发送到所有注册的设备。任何人都有如何解决它的想法?谢谢。GCM推送通知返回错误:字段数据必须是json数组

function Notification($post) { 
    global $wpdb; 
    $pub_post = get_post($post_ID); 
    $post_title=$pub_post->post_title; 
    $totalrecord = $this->get_allrecord(); 

    $message = "Your New post, " .$post_title." has been published"; 
     if (count($totalrecord) > 0) { 
     //$display_row = null; 
     foreach ($totalrecord as $row) { 
     $a = $row->token; 
     $this->sendPushNotification($a, $message); 

      } 
     } 
    } 

function get_allrecord(){ 
    global $wpdb; 
    $results =$wpdb->get_results('SELECT token FROM wp_push_tokens ', OBJECT); 
    return $results; 
    } 

function sendPushNotification($registration_ids, $message) { 
    $apiKey = "xxxxxxxxxxxxxxxxxxxxxxx"; 
    $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey); 
    $fields = array(
     'register' =>$registration_ids, 
     'data' =>$message ); 

    $ch = curl_init(); 
// Set the url, number of POST vars, POST data 

curl_setopt($ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send"); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
// Disabling SSL Certificate support temporarly 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, wp_json_encode($fields)); 
// Execute post 
$result = curl_exec($ch); 
    if($result === false) 
     die('Curl failed ' . curl_error()); 
// Close connection 
curl_close($ch); 
return $result; 

}

回答

1

你的内容类型是"application/json",这意味着"data"场的形式必须是一个JSON:

"data": { 
    "message": "your message" 
} 

注意,在这个例子中"message"关键是定制的。您可以使用您希望的任何键,并且您的应用在收到该消息时必须搜索这些键。

我不知道PHP,但这样的事情可能工作:

$fields = array(
    'registration_ids' =>$registration_ids, 
    'data' => array('message' => $message));