laravel框架使用极光推送消息操作示例


Posted in PHP onFebruary 15, 2020

本文实例讲述了laravel框架使用极光推送消息。分享给大家供大家参考,具体如下:

最近需要使用极光推送往客户端推消息,所以这里记录下使用过程。

极光推送的服务端文档:

https://docs.jiguang.cn/jpush/server/push/server_overview/

极光推送服务端PHP代码:

https://github.com/jpush/jpush-api-php-client

在laravel项目下安装极光推送

composer require jpush/jpush

我们在config目录下创建一个jpush.php文件,用于获取key和secret

<?php
return [
  'app_key' => env('JPUSH_APP_KEY', ''),
  'master_secret' => env('JPUSH_MASTER_SECRET', ''),
  'apns_production' => env('JPUSH_APNS_PRODUCTION', true),
];

然后在 .env 文件中配置相应参数

JPUSH_APP_KEY=
JPUSH_MASTER_SECRET=
JPUSH_APNS_PRODUCTION=true

然后我们在app目录下,创建一个 Services目录,并创建JPushService.php

<?php
namespace App\Services;
use JPush\Client as JPush;
use Log;
class JPushService
{
  protected static $client = null;
  //推送类型
  const PUSH_TYPE_ALL = 1;
  const PUSH_TYPE_TAG = 2;
  const PUSH_TYPE_ALIAS = 3;
  const PUSH_TYPE_REG_ID = 4;
  private function __construct()
  {
  }
  private function __clone()
  {
  }
  /**
   * 获取实例
   */
  public static function getInstance()
  {
    if (!self::$client) {
      self::$client = new JPush(config('jpush.app_key'), config('jpush.master_secret'), null);
    }
    return self::$client;
  }
  /**
   * 给android或ios推送消息
   */
  public static function pushNotify($params)
  {
    //推送平台
    $platform = $params['platform'] ?? 'all';
    //推送标题
    $title = $params['title'] ?? '';
    //推送内容
    $content = $params['content'] ?? '';
    //通知栏样式ID
    $builder_id = $params['builder_id'] ?? 0;
    //附加字段
    $extras = $params['extras'] ?? '';
    //推送类型
    $type = $params['type'] ?? '';
    //推送目标(注册ID)
    $reg_id = $params['reg_id'] ?? '';
    //推送目标(标签)
    $tag = $params['tag'] ?? '';
    //推送目标(别名)
    $alias = $params['alias'] ?? '';
    try {
      $push = self::getInstance()->push();
      //设置平台
      $push->setPlatform($platform);
      switch ($type) {
        case self::PUSH_TYPE_ALL:
          $push->addAllAudience();
          break;
        case self::PUSH_TYPE_TAG:
          $push->addTag($tag);
          break;
        case self::PUSH_TYPE_ALIAS:
          $push->addAlias($alias);
          break;
        case self::PUSH_TYPE_REG_ID:
          $push->addRegistrationId($reg_id);
          break;
      }
      $push->androidNotification($content, [
        'title' => $title,
        'builder_id' => $builder_id,
        'extras' => $extras,
      ])->iosNotification($content, [
        'sound' => 'sound',
        'badge' => '+1',
        'extras' => $extras
      ])->options([
        'apns_production' => config('jpush.apns_production', true),
        //表示离线消息保留时长(秒)
        'time_to_live' => 86400,
      ]);
      $response = $push->send();
      if ($response['http_code'] != 200) {
        Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE));
      }
      return $response;
    } catch (\Throwable $e) {
      Log::channel('jpush')->error(json_encode([
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'message' => $e->getMessage(),
        'params' => $params,
      ], JSON_UNESCAPED_UNICODE));
    }
  }
  /**
   * 获取指定设备的别名和标签
   */
  public static function getDevices($reg_id)
  {
    $response = self::getInstance()->device()->getDevices($reg_id);
    if ($response['http_code'] == 200) {
      return $response['body'];
    }
    return [];
  }
  /**
   * 给指定设备添加标签
   */
  public static function addTags($reg_id, $tags = [])
  {
    $response = self::getInstance()->device()->addTags($reg_id, $tags);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 清空指定设备的标签
   */
  public static function clearTags($reg_id)
  {
    $response = self::getInstance()->device()->clearTags($reg_id);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 清空指定设备的标签
   */
  public static function removeTags($reg_id, $tags = [])
  {
    $response = self::getInstance()->device()->removeTags($reg_id, $tags);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 更新指定设备的别名
   */
  public static function updateAlias($reg_id, $alias)
  {
    $response = self::getInstance()->device()->updateAlias($reg_id, $alias);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
}

创建完后,我们就可以在项目中调用 JPushService::pushNotify() 来推消息了。

JPushService::pushNotify([
  //标题
  'title' => '测试',
  //内容
  'content' => '测试',
  //设备标识,跟设备相关
  'reg_id' => 'xxxxxxxxxxx',
  //扩展字段
  'extras' => [
    'key' => 'value',
  ],
  //推送类型
  'type' => JPushService::PUSH_TYPE_REG_ID,
]);

reg_id是前端安卓或IOS获取到后,传给PHP后端,然后跟用户关联,存起来。

注意,reg_id是跟设备相关的,同一个设备上的APP,当不同用户登陆时,reg_id是一样的,这样会导致一个问题。

A用户登APP后,又切换到B用户,那B用户会收到发送给A用户的消息,这会造成消息错乱。

解决方法:

通过别名来发送消息,因为一个设备只能绑定一个别名,当A用户登陆时,把 reg_id 绑定到别名 user_a,切换用户或退出时,就把别名置空。

然后B用户登陆,就把 reg_id 绑定到 user_b 上。推消息时,就通过别名来推送消息。

绑定别名(推荐使用用户ID来区分不同的别名):

JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);

置空别名:

JPushService::updateAlias($user->jpush_reg_id, '');

通过别名发送:

JPushService::pushNotify([
  'title' => '测试',
  'content' => '测试',
  'alias' => 'user_id_' . $message->receive_id,
  'extras' => $extras,
  'type' => JPushService::PUSH_TYPE_ALIAS,
]);

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(3)
Oct 09 PHP
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
Symfony核心类概述
Mar 17 PHP
php制作基于xml的RSS订阅源功能示例
Feb 08 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 #PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 #PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 #PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 #PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 #PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 #PHP
thinkphp5框架路由原理与用法详解
Feb 11 #PHP
You might like
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
JS array 数组详解
2009/03/22 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
WxPython实现无边框界面
2019/11/18 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
2015年高校保卫处工作总结
2015/07/23 职场文书
办公室日常管理制度
2015/08/04 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL