PHP集成(华为,OPPO,Vivo,小米,魅族)的推送。ing.....

吐槽

公司的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......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容