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

准备工作
在开始编码之前,请确保你已经完成以下准备工作:
-
注册百度开发者账号:
- 访问 百度开放平台 并注册账号。
-
创建应用并获取 API Key 和 Secret Key:
- 登录后,进入“云服务” -> “推送”。
- 在“应用管理”中创建你的 Android 或 iOS 应用,如果你是推送 Android 消息,需要填写应用的 包名 和 签名,这些信息可以在你的 Android 项目文件中找到。
- 创建成功后,你可以在应用详情页找到两个关键信息:
- API Key:用于身份验证。
- Secret Key:用于生成请求签名,请务必妥善保管,不要泄露。
-
安装 PHP 环境:
(图片来源网络,侵删)确保你的服务器或本地开发环境已经安装了 PHP (建议版本 >= 7.0)。
获取并准备百度推送 PHP SDK
官方 SDK 可以通过两种方式获取:
通过 Composer (推荐)
这是最现代、最便捷的依赖管理方式。
-
安装 Composer:如果你的项目中还没有 Composer,请先从 getcomposer.org 下载并安装。
(图片来源网络,侵删) -
在项目根目录下创建
composer.json文件如下:{ "require": { "baidu-apistore/baidu-push-sdk": "^3.0" } } -
执行安装命令:
composer install
安装完成后,SDK 会被下载到
vendor目录下,并且会自动生成一个vendor/autoload.php文件,我们需要在代码中引入它。
直接下载 SDK
如果你不使用 Composer,可以从 GitHub 下载 SDK 的源码。
- GitHub 地址:https://github.com/Baidu-AIP/php-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";
}
代码详解
-
引入 SDK:
require_once 'vendor/autoload.php';:这是 Composer 的标准做法,它会自动加载所有需要的类。use BaiduPush\Api as BaiduPushApi;:为了方便使用,我们给BaiduPush\Api这个命名空间起一个别名BaiduPushApi。
-
初始化:
$push = new BaiduPushApi($apiKey, $secretKey);:创建一个推送实例,传入你在百度后台获取的密钥,SDK 内部会使用这些密钥进行签名认证。
-
设置推送目标:
$pushType:定义推送的目标类型。BaiduPushApi::PUSH_TYPE_DEVICE:推送到指定设备。BaiduPushApi::PUSH_TYPE_USER:推送到指定用户。BaiduPushApi::PUSH_TYPE_TAG:推送到指定设备标签组。BaiduPushApi::PUSH_TYPE_BROADCAST:广播推送,所有设备都能收到。
- 当
$pushType不是BROADCAST时,你需要提供第四个参数$channelIds(设备标识数组)、$userId(用户标识数组) 或$tag(标签名)。
-
设置消息内容:
$msgType:消息类型。BaiduPushApi::MSG_TYPE_NOTIFICATION:通知栏消息,用户可以在通知栏看到,点击后有特定行为。BaiduPushApi::MSG_TYPE_MESSAGE:透传消息,消息直接到达客户端 App,由 App 自行处理,不在通知栏显示,通常用于 App 内部通信。
$message:消息体数组,包含标题、内容、跳转链接等,详细字段请参考 百度官方文档。
-
发送与处理:
$push->push(...):执行推送。- 返回结果
$result是一个 PHP 数组,包含request_id、success(成功数)、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,将设备与标签进行绑定。
常见问题与注意事项
-
error_code: 202, invalid api key:- 原因:
apiKey错误。 - 解决:请检查百度后台获取的
apiKey是否正确,并确认是否填写到了代码中。
- 原因:
-
error_code: 203, invalid timestamp:- 原因:请求时间戳与服务器时间偏差过大。
- 解决:确保你的服务器时间是准确的,SDK 会自动处理时间戳,通常是 SDK 内部问题,可尝试更新 SDK 版本。
-
error_code: 206, invalid signature:- 原因:请求签名错误,这是最常见也最严重的问题。
- 解决:
- 检查
secretKey是否正确且泄露。 - 检查请求参数是否完整和正确。
- 如果是自定义请求(不使用 SDK),请严格按照 签名算法文档 计算签名。强烈建议直接使用官方 SDK,避免此问题。
- 检查
-
error_code: 10006, no channel_id:- 原因:推送类型为
DEVICE,但没有提供channel_id。 - 解决:确保在调用
push方法时,为$channelIds参数传入了有效的设备 ID 数组。
- 原因:推送类型为
-
消息客户端收不到?
- App 端集成问题:确保你的 App 已经正确集成了百度推送的客户端 SDK,并且已经成功注册、获取了
channel_id。 - 网络问题:检查 App 和服务器的网络连接是否正常。
- 推送时机:检查代码是否在正确的业务逻辑中执行了推送。
- App 端集成问题:确保你的 App 已经正确集成了百度推送的客户端 SDK,并且已经成功注册、获取了
-
channel_id:channel_id是设备与百度推送服务之间的桥梁,App 启动后,需要调用客户端 SDK 的startWork()方法,获取到channel_id,并将其发送到你的服务器保存起来,推送时,就使用这个保存的channel_id。
官方文档与资源
- 百度推送服务官方文档:最权威的参考资料,包含了所有 API 的详细说明、参数列表和错误码。
- 百度推送 PHP SDK GitHub 仓库:源码地址,可以查看最新的更新和示例。
希望这份详细的教程能帮助你顺利地在 PHP 项目中集成百度推送服务!如果在实践中遇到问题,可以仔细检查密钥、参数和 App 端的集成情况。
