吐槽
公司的app之前推送用的极光,后来因为app会被后台进程杀死,导致app收不到推送。app关闭收不到推送,打开才会接收到推送,这是很正常的逻辑。非要改成就算进程杀死也要让用户收到推送,多恶心,这样做的不就和流氓软件一样了。没办法那就做呗,厂商的推送基本上全是JAVA 的sdk,PHP完全没有,那就一点点来。现在把遇到问题记录下~方便自己以后会遇到。
华为推送
首先需要的两个文档
1.服务端报错的总结
2.服务端API参考
//这个方法是我从别的地方直接拿过来的有个很重要的提示http_build_query(表示感谢)
//推送curl请求
public static function api_curl($url,$post, $header=[],$formUrlencoded = false){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if ($header) {
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
if ($post) {
curl_setopt($curl, CURLOPT_POST, true);
//华为的参数是全部要urlcode,所以加了这个http_build_query
if($formUrlencoded){
$post = http_build_query($post);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}else{
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
}
$res = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $res; // 返回数据,json格式
}
private static $client_secret = '你的client_secret ';
private static $client_id = '你的client_id ';
//获取表单令牌
public static function get_token(){
$url = 'https://login.cloud.huawei.com/oauth2/v2/token';
$pagm='grant_type=client_credentials&client_secret='.self::$client_secret.'&client_id='.self::$client_id;
$re_data = json_decode(Push_autoService::api_curl($url,$pagm),true);
if(isset($re_data['error'])){
return array();
}
return $re_data;
}
//华为推送
public static function push_msg($data){
$nsp_ctx = urlencode('{"ver":"1", "appId":"你的client_id"}');
$url = 'https://api.push.hicloud.com/pushsend.do?nsp_ctx='.$nsp_ctx;
$access_token = self::get_token()['access_token'];
$hps = [
'hps'=>[
'msg'=>[
'type'=> '3',
'body'=>[
'content' => $data['content'],
'title' => $data['title'],
],
'action'=>[
'type'=> '2',
'param' => [
'url'=>'123',
]
],
],
'ext'=>[
'biTag'=>'Trump',
'customize'=>[['url_type'=>'2'],['url_con'=>'jp']],
]
]
];
$payload = json_encode($hps);
$pagm = [
'access_token' => $access_token,
'nsp_svc' => 'openpush.message.api.send',
'nsp_ts' => time(),
'device_token_list' => json_encode(['0864128030815694300011578200CN01']),
'payload' => $payload,
];
$header = ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'];
$re_data = json_decode(Push_autoService::api_curl($url,$pagm,$header,true),true);
if($re_data['code'] =='80000000'){
echo 'success';
}
}
oppo推送代码
//获取鉴权接口
public static function getAuth(){
$auth = '/server/v1/auth';
$pagm['app_key'] = self::$app_key;
$pagm['sign'] = hash('sha256',self::$app_key.Push_autoService::msectime().self::$MasterSecret);
$pagm['timestamp'] = Push_autoService::msectime();
$header = ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'];
$code = json_decode(Push_autoService::api_curl(self::$host.$auth,$pagm,$header,true),true);
if($code['code'] == 0){
return array('status'=>100,'msg'=>'success','data'=>$code['data']['auth_token']);
}
return array('status'=>'0','msg'=>'auth获取失败');
}
//保存通知栏消息内容体 //获取message_id
public static function getMessageId($data){
$url = '/server/v1/message/notification/save_message_content';
if(self::getAuth()['status'] == 0) return false;
$pagm = [
'title' => $data['push_title'],
'content' => $data['push_content'],
'click_action_type'=> 1,
'click_action_activity'=> 'com.coloros.push.demo.internal',
'action_parameters'=> $data['selft_content'],
'auth_token' => self::getAuth()['data'],
];
$header = ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'];
$message_id = json_decode(Push_autoService::api_curl(self::$host.$url,$pagm,$header,true),true);
if($message_id['code'] == 0){
return array('status'=>100,'msg'=>'success','data'=>$message_id['data']['message_id']);
}
return array('status'=>'0','msg'=>'message_id获取失败');
}
//广播推送-通知栏消息
public static function pushAll($data)
{
$url ='/server/v1/message/notification/broadcast';
if(self::getAuth()['status'] == 0) return false;
$message = self::getMessageId($data);
$pagm = [
'message_id' => $message['data'],
'target_type' => '1',
'auth_token' => self::getAuth()['data'],
];
$header = ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'];
return json_decode(Push_autoService::api_curl(self::$host.$url,$pagm,$header,true),true);
}
//单点推送
public static function pushMsg($data)
{
$url = '/server/v1/message/notification/unicast';
if(self::getAuth()['status'] == 0) return false;
//发送的消息体
$token = self::getAuth()['data'];
$notification = [
'click_action_type'=> 1,
'click_action_activity'=> 'com.coloros.push.demo.internal',
'action_parameters'=> $data['selft_content'],
'title' => $data['push_title'],
'content' =>$data['push_content'],
];
$message = [
'target_type'=>2,
'target_value'=> $data['push_token'],
'registration_id'=> $data['push_token'],
'notification'=> $notification
];
$message =json_encode($message);
$pagm =[
'message' => $message,
];
$header = ['Content-Type: application/x-www-form-urlencoded','auth_token:'.$token];
return json_decode(Push_autoService::api_curl(self::$host.$url,$pagm,$header,true),true);
}
小米推送
因为小米有对应的sdk,直接
include_once('./autoload.php');
所以这里不做过多的解释
//指定 单独的token 推送
public static function push_msg($data){
Constants::setPackage(self::$package);
Constants::setSecret(self::$AppSecret);
$sender = new Sender();
// message1 演示自定义的点击行为
$message1 = new Builder();
$message1->title($data['push_title']); // 通知栏的title
$message1->description($data['push_content']); // 通知栏的description
$message1->passThrough(0); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
// $message1->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
$message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
$message1->extra('extra',$data['selft_content']);
$message1->notifyId(2); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
$message1->build();
$send_status = $sender->send($message1, $data['push_token'])->getRaw();
return $send_status;
}
//全量推送
public static function push_all($data){
Constants::setPackage(self::$package);
Constants::setSecret(self::$AppSecret);
$sender = new Sender();
// message1 演示自定义的点击行为
$message1 = new Builder();
$message1->title($data['push_title']); // 通知栏的title
$message1->description($data['push_content']); // 通知栏的description
$message1->passThrough(0); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
// $message1->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
$message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
$message1->extra('extra',$data['selft_content']);
$message1->notifyId(1); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
$message1->build();
return $sender->broadcastAll($message1)->getRaw();
}
//topic 发送
public static function push_topic($data){
$extras = json_decode($data['selft_content'],true);
Constants::setPackage(self::$package);
Constants::setSecret(self::$AppSecret);
$sender = new Sender();
// message1 演示自定义的点击行为
$message1 = new Builder();
$message1->title($data['push_title']); // 通知栏的title
$message1->description($data['push_content']); // 通知栏的description
$message1->passThrough(0); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
// $message1->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
$message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
$message1->extra('extra',$data['selft_content']);
$message1->notifyId(1); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
$message1->build();
return $sender->broadcast($message1,$extras['tags'])->getRaw();
}
vivo 和 魅族 因为个别原因暂时不打算接了
后续正在完善ing......