百度推送 PHP 教程

百度推送服务允许开发者向 Android、iOS 应用快速、稳定地推送消息,对于 PHP 最推荐的方式是使用官方提供的 Server SDK,它极大地简化了签名、请求等繁琐的API调用过程。

百度php推送教程
(图片来源网络,侵删)

准备工作

在开始编码之前,请确保你已经完成以下准备工作:

  1. 注册百度开发者账号

  2. 创建应用并获取 API Key 和 Secret Key

    • 登录后,进入“云服务” -> “推送”。
    • 在“应用管理”中创建你的 Android 或 iOS 应用,如果你是推送 Android 消息,需要填写应用的 包名签名,这些信息可以在你的 Android 项目文件中找到。
    • 创建成功后,你可以在应用详情页找到两个关键信息:
      • API Key:用于身份验证。
      • Secret Key:用于生成请求签名,请务必妥善保管,不要泄露
  3. 安装 PHP 环境

    百度php推送教程
    (图片来源网络,侵删)

    确保你的服务器或本地开发环境已经安装了 PHP (建议版本 >= 7.0)。


获取并准备百度推送 PHP SDK

官方 SDK 可以通过两种方式获取:

通过 Composer (推荐)

这是最现代、最便捷的依赖管理方式。

  1. 安装 Composer:如果你的项目中还没有 Composer,请先从 getcomposer.org 下载并安装。

    百度php推送教程
    (图片来源网络,侵删)
  2. 在项目根目录下创建 composer.json 文件如下:

    {
        "require": {
            "baidu-apistore/baidu-push-sdk": "^3.0"
        }
    }
  3. 执行安装命令

    composer install

    安装完成后,SDK 会被下载到 vendor 目录下,并且会自动生成一个 vendor/autoload.php 文件,我们需要在代码中引入它。

直接下载 SDK

如果你不使用 Composer,可以从 GitHub 下载 SDK 的源码。

下载后,将 src 目录(或整个 SDK 文件夹)放到你的项目中,然后在代码中引入核心文件:

require_once 'path/to/your/BaiduPushSdk/BaiduPush.php';

代码实现:发送一条推送消息

下面我们通过一个完整的 PHP 示例,来演示如何向单个设备或所有设备推送一条广播消息。

示例代码

<?php
// 1. 引入自动加载文件 (如果使用 Composer)
require_once 'vendor/autoload.php';
// 如果直接下载 SDK,则引入核心文件
// require_once 'path/to/BaiduPushSdk/BaiduPush.php';
use BaiduPush\Api as BaiduPushApi;
// 2. 初始化配置
// 替换成你自己的 API Key 和 Secret Key
$apiKey = '你的_API_Key';
$secretKey = '你的_Secret_Key';
// 创建 Push 对象
$push = new BaiduPushApi($apiKey, $secretKey);
// 3. 设置推送消息内容
// 消息类型:通知 (notification) 或 消息 (message)
$msgType = BaiduPushApi::MSG_TYPE_NOTIFICATION;
// 推送目标
// 可以是单个设备、多个设备、设备标签、或者所有用户
// 这里我们向所有用户推送 (broadcast)
$pushType = BaiduPushApi::PUSH_TYPE_BROADCAST;
// 消息体
$message = [
    // 通知标题 => '你好,来自百度的推送!',
    // 通知内容
    'description' => '这是一条通过 PHP SDK 发送的测试推送消息。',
    // 点击通知后的行为,打开应用、打开网页、或自定义 intent
    // 'notification_builder_id' => 0, // 使用默认样式
    'notification_basic_style' => 4, // 大图样式
    'open_type' => 1, // 1:打开应用内页面 2:打开应用内Activity 3:打开URL 4:无跳转
    'url' => 'https://www.baidu.com', // 当 open_type=3 时有效
    'custom_content' => [
        'key1' => 'value1',
        'key2' => 'value2'
    ] // 自定义键值对,客户端可以接收
];
// 4. 发送推送
try {
    $result = $push->push($msgType, $pushType, null, $message);
    // 5. 处理返回结果
    echo "推送请求发送成功!\n";
    echo "响应结果:\n";
    print_r($result);
    // 检查推送是否成功
    if (isset($result['success']) && $result['success'] > 0) {
        echo "成功向 " . $result['success'] . " 个设备发送了消息,\n";
    }
} catch (Exception $e) {
    // 捕获并处理异常
    echo "推送失败!\n";
    echo "错误信息: " . $e->getMessage() . "\n";
}

代码详解

  1. 引入 SDK

    • require_once 'vendor/autoload.php';:这是 Composer 的标准做法,它会自动加载所有需要的类。
    • use BaiduPush\Api as BaiduPushApi;:为了方便使用,我们给 BaiduPush\Api 这个命名空间起一个别名 BaiduPushApi
  2. 初始化

    • $push = new BaiduPushApi($apiKey, $secretKey);:创建一个推送实例,传入你在百度后台获取的密钥,SDK 内部会使用这些密钥进行签名认证。
  3. 设置推送目标

    • $pushType:定义推送的目标类型。
      • BaiduPushApi::PUSH_TYPE_DEVICE:推送到指定设备。
      • BaiduPushApi::PUSH_TYPE_USER:推送到指定用户。
      • BaiduPushApi::PUSH_TYPE_TAG:推送到指定设备标签组。
      • BaiduPushApi::PUSH_TYPE_BROADCAST:广播推送,所有设备都能收到。
    • $pushType 不是 BROADCAST 时,你需要提供第四个参数 $channelIds (设备标识数组)、$userId (用户标识数组) 或 $tag (标签名)。
  4. 设置消息内容

    • $msgType:消息类型。
      • BaiduPushApi::MSG_TYPE_NOTIFICATION:通知栏消息,用户可以在通知栏看到,点击后有特定行为。
      • BaiduPushApi::MSG_TYPE_MESSAGE:透传消息,消息直接到达客户端 App,由 App 自行处理,不在通知栏显示,通常用于 App 内部通信。
    • $message:消息体数组,包含标题、内容、跳转链接等,详细字段请参考 百度官方文档
  5. 发送与处理

    • $push->push(...):执行推送。
    • 返回结果 $result 是一个 PHP 数组,包含 request_idsuccess (成功数)、error_code (错误码) 等信息。
    • 使用 try...catch 捕获异常是良好的编程习惯,可以处理网络错误、认证失败等情况。

常见推送场景示例

场景1:推送到单个设备

// ... 前面的代码相同 ...
// 推送目标:单个设备
$pushType = BaiduPushApi::PUSH_TYPE_DEVICE;
$channelId = 'xxxxxxxxxxxxxxxxxxxxxxxx'; // 替换为目标设备的 channel_id
$message = [ => '专属消息',
    'description' => '这是一条只发送给你的消息。'
];
try {
    $result = $push->push($msgType, $pushType, [$channelId], $message);
    print_r($result);
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

注意channel_id 是设备在百度推送服务中的唯一标识,通常由你的 App 在启动时通过 SDK 获取并上报到你的服务器。

场景2:推送到设备标签组

// ... 前面的代码相同 ...
// 推送目标:设备标签
$pushType = BaiduPushApi::PUSH_TYPE_TAG;
$tagName = 'vip_users'; // 替换为你创建的标签名
$message = [ => 'VIP 专享优惠',
    'description' => '亲爱的VIP用户,我们为您准备了特别优惠!'
];
try {
    $result = $push->push($msgType, $pushType, $tagName, $message);
    print_r($result);
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

注意:你需要先在你的 App 端调用 bindTag API,将设备与标签进行绑定。


常见问题与注意事项

  1. error_code: 202, invalid api key

    • 原因apiKey 错误。
    • 解决:请检查百度后台获取的 apiKey 是否正确,并确认是否填写到了代码中。
  2. error_code: 203, invalid timestamp

    • 原因:请求时间戳与服务器时间偏差过大。
    • 解决:确保你的服务器时间是准确的,SDK 会自动处理时间戳,通常是 SDK 内部问题,可尝试更新 SDK 版本。
  3. error_code: 206, invalid signature

    • 原因:请求签名错误,这是最常见也最严重的问题。
    • 解决
      1. 检查 secretKey 是否正确且泄露。
      2. 检查请求参数是否完整和正确。
      3. 如果是自定义请求(不使用 SDK),请严格按照 签名算法文档 计算签名。强烈建议直接使用官方 SDK,避免此问题。
  4. error_code: 10006, no channel_id

    • 原因:推送类型为 DEVICE,但没有提供 channel_id
    • 解决:确保在调用 push 方法时,为 $channelIds 参数传入了有效的设备 ID 数组。
  5. 消息客户端收不到?

    • App 端集成问题:确保你的 App 已经正确集成了百度推送的客户端 SDK,并且已经成功注册、获取了 channel_id
    • 网络问题:检查 App 和服务器的网络连接是否正常。
    • 推送时机:检查代码是否在正确的业务逻辑中执行了推送。
  6. channel_id

    • channel_id 是设备与百度推送服务之间的桥梁,App 启动后,需要调用客户端 SDK 的 startWork() 方法,获取到 channel_id,并将其发送到你的服务器保存起来,推送时,就使用这个保存的 channel_id

官方文档与资源

希望这份详细的教程能帮助你顺利地在 PHP 项目中集成百度推送服务!如果在实践中遇到问题,可以仔细检查密钥、参数和 App 端的集成情况。