我正在尝试使用第三方服务器实施Android推送通知。 我有一个PHP脚本,其中包含一些CURL命令。 当我执行代码时,它给了我错误: "无法解析主机:数组" 在这里,我向主机网站确认他们已经激活了curl实现,并且工作正常。所以我的代码似乎有问题。 我是一个比较新的php和curl脚本。请帮忙。 以下是我正在使用的代码
这里我想要覆盖的网址是: http://android.googleapis.com/gcm/send
注意:(此处我尝试在上面的网址中同时使用http和https,但问题仍然存在。)
卷曲代码:
private function useCurl(&$model, $url, $headers, $fields = null) {
// Open connection
echo "::::::Inside CURL Function:::::::";
$ch = curl_init();
echo '::::::::::value of variable $ch:::::::::::' . $ch;
if ($url) {
// Set the url, number of POST vars, POST data
echo "::::::::Start of setting CURL Variables:::::::";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo ":::::::::End of setting CURL Variables::::::::";
// Disabling SSL Certificate support temporarly
echo "::::::::Start of disabling SSL Certificates::::::::";
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($fields) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}
echo "::::::::End of disabling SSL Certificates:::::::::";
// Execute post
echo ":::::::::Start of executing post request::::::::";
$result = curl_exec($ch);
echo ":::::::::End of executing post request:::::::::::";
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch) . curl_errno($ch));
}
// Close connection
curl_close($ch);
return $result;
}
}
答案 0 :(得分:1)
解决了这个问题。这是正确的工作代码:
public static function android($data, $reg_id) {
$url = 'https://android.googleapis.com/gcm/send';
//echo '::::::::::::URL Variable::::::::' . $url;
json_encode($reg_id);
$message = array(
'title' => $data['mtitle'],
'message' => $data['mdesc'],
'subtitle' => '',
'tickerText' => '',
'msgcnt' => 1,
'vibrate' => 1
);
$headers = array(
'Authorization:key=' .self::$API_ACCESS_KEY,
'Content-Type:application/json'
);
$fields = array(
'registration_ids' => $reg_id,
'data' => $message
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($fields) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
}
$result = curl_exec($ch);
// Close connection
curl_close($ch);
echo "::::::::::value of $result variable:::::::::::" . $result;
}
在这里,确保将$ reg_id和$ data作为php数组传递给函数。 该线程可以关闭。
答案 1 :(得分:0)
我收到了错误。我的代码有两个功能 1.准备有效载荷和所需数据
以下是准备功能的代码
// Sends Push notification for Android users
public function android($data, $reg_id) {
echo "Inside pushnotification for Android Function::::::::";
$url = 'http://android.googleapis.com/gcm/send';
echo '::::::::::::URL Variable::::::::' . $url;
$message = array(
'title' => $data['mtitle'],
'message' => $data['mdesc'],
'subtitle' => '',
'tickerText' => '',
'msgcnt' => 1,
'vibrate' => 1
);
echo ':::::::::::::message Variable::::::::' . $message;
$headers = array(
'Authorization: key=' .self::$API_ACCESS_KEY,
'Content-Type: application/json'
);
echo ':::::::::::::headers Variable::::::::' . $headers;
$fields = array(
'registration_ids' => array($reg_id),
'data' => $message,
);
echo '::::::::::fields Variable::::::::' . $fields;
echo ':::::::::::::Start of CURL Call::::::::';
//return $this->useCurl($url, $headers, json_encode($fields));
return self::useCurl($url, json_encode($headers), json_encode($fields));
}
CURL函数
//卷曲
私有函数useCurl($ url,$ headers,$ fields){
//打开连接
echo" ::::::里面的CURL函数:::::::&#34 ;;
$ ch = curl_init();
echo' ::::::::::变量值$ ch :::::::::::' 。 $ CH;
if($ url){
//设置网址,POST数量,POST数据
echo" ::::::::开始设置CURL变量:::::::&#34 ;;
echo' ::::::::变量$ url的价值:::::::' 。 $网址;
echo' ::::::::变量$ headers的价值:::::::' 。 $头;
echo' ::::::::变量$ model的价值:::::::' 。 $模型;
echo' ::::::::变量$ fields的值:::::::' 。 $领域;
curl_setopt($ ch,CURLOPT_URL,$ url);
curl_setopt($ ch,CURLOPT_POST,true);
curl_setopt($ ch,CURLOPT_HTTPHEADER,$ headers);
curl_setopt($ ch,CURLOPT_RETURNTRANSFER,true);
echo" :::::::::设置CURL变量的结束::::::::&#34 ;;
//暂时禁用SSL证书支持
echo" ::::::::开始禁用SSL证书::::::::&#34 ;;
curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false);
if($ fields){
curl_setopt($ ch,CURLOPT_POSTFIELDS,$ fields);
}
echo" ::::::::禁用SSL证书的结束:::::::::&#34 ;;
//执行帖子
echo" :::::::::开始执行post request ::::::::&#34 ;;
$ result = curl_exec($ ch);
echo" :::::::::执行邮件请求的结束:::::::::::&#34 ;;
if($ result === FALSE){
死('卷曲失败:' .curl_error($ ch).curl_errno($ ch));
}
// Close connection
curl_close($ch);
return $result;
}
}
两者都是纠正的功能
以下是更正:
在第一个功能中 旧价值:
return self :: useCurl($ url,$ headers,json_encode($ fields));
新价值:
return self::useCurl($url, json_encode($headers), json_encode($fields));
原因:由于$ headers是一个数组,因此应使用json_encode将其转换为JSON字符串。这解决了我在帖子中的第一个错误。
旧价值:
useCurl(&$model, $url, $headers, $fields = null)
新价值:
useCurl($url, $headers, $fields)
原因:这解决了我的第二个错误,因为没有名为$ model的变量,然后调用函数中的url值在$ model中传递,同样也传递给其他人。
现在,代码中没有错误。但尚未收到通知。 我怀疑$ headers字符串中存在错误,因为它在我的API访问密钥前面连接了一些额外的值。一旦我能够解决,我会尝试回归。
答案 2 :(得分:0)
这是代码抛出错误=从gcm缺少注册。
public static function android($data, $reg_id) {
echo "Inside pushnotification for Android Function::::::::";
$url = 'https://android.googleapis.com/gcm/send';
//echo '::::::::::::URL Variable::::::::' . $url;
echo '::::::::::::data Variable::::::::' . json_encode($data);
echo '::::::::::::regid Variable::::::::' . json_encode($reg_id);
$message = array(
'title' => $data['mtitle'],
'message' => $data['mdesc'],
'subtitle' => '',
'tickerText' => '',
'msgcnt' => 1,
'vibrate' => 1
);
echo ':::::::::::::message Variable::::::::' . json_encode($message);
$headers = array(
'Authorization:key=' .self::$API_ACCESS_KEY,
'Content-Type:application/json'
);
echo ':::::::::::::headers Variable::::::::' . json_encode($headers);
$fields = array(
'registration_ids' => $reg_id,
'data' => $message
);
echo '::::::::::fields Variable::::::::' . json_encode($fields);
echo ':::::::::::::Start of CURL Call::::::::';
//return $this->useCurl($url, $headers, json_encode($fields));
//return self::useCurl($url, json_encode($headers), json_encode($fields));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($fields) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}
$result = curl_exec($ch);
// Close connection
curl_close($ch);
echo "::::::::::value of $result variable:::::::::::" . $result;
}