快速验证证书、Token、网络连通性,或作为简单的内部测试工具。通过 URL 参数传递消息、角标、声音,无需修改代码即可发送不同内容。
push.php<?php
// ===== 配置区 (请修改为你的实际值) =====
$apnsCert = 'ck.pem'; // 证书文件路径
$passphrase = '123456'; // 证书密码
$serverUrl = 'ssl://gateway.sandbox.push.apple.com:2195'; // 沙箱环境
// 生产环境改为: ssl://gateway.push.apple.com:2195
// =======================================
// 从 GET 参数获取,提供默认值
$deviceToken = $_GET['token'] ?? 'a8fcd4aa8943b223d4ebcd54fe168a8b99b3f24c63dbc0612db25a8c0a588675';
$message = $_GET['message'] ?? 'hello!';
$badge = (int)($_GET['badge'] ?? 2);
$sound = $_GET['sound'] ?? 'default';
// 校验 Token 格式
if (!preg_match('/^[0-9a-f]{64}$/i', $deviceToken)) {
die('错误: deviceToken 必须为 64 位十六进制字符串,且不含空格');
}
// 构建 Payload
$body = [
'aps' => [
'alert' => $message,
'badge' => $badge,
'sound' => $sound,
],
];
$payload = json_encode($body, JSON_UNESCAPED_UNICODE);
// 创建 SSL 上下文
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $passphrase);
// 连接 APNs (使用持久连接减少握手开销)
$apns = stream_socket_client(
$serverUrl,
$error,
$errorString,
60,
STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT,
$streamContext
);
if (!$apns) {
die("连接失败: $errorString (错误码: $error)");
}
echo "连接成功 <br/>\n";
// 组装二进制帧
$tokenBin = pack('H*', $deviceToken);
$msg = chr(0) . pack('n', 32) . $tokenBin . pack('n', strlen($payload)) . $payload;
// 发送
$result = fwrite($apns, $msg);
fclose($apns);
if ($result) {
echo "发送成功: $payload";
} else {
echo '发送失败: fwrite 返回 false';
}
?>
# 浏览器或 curl 访问
https://yourserver/push.php?token=你的64位Token&message=测试消息&badge=5&sound=default
# curl 示例
curl "https://yourserver/push.php?token=abcdef...&message=Hello%20World&badge=1"
脚本适合开发调试、小规模内部测试。正式业务请使用成熟库(如 edamov/pushok、sly/notification-pusher)或自行封装 HTTP/2 客户端,获得连接池、异步发送、错误处理、监控指标等企业级能力。