You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配APNs新Provider API的PHP推送脚本语法错误如何解决

报错原因

你遇到的语法错误是因为直接复制了APNs官方文档里的HTTP/2伪头字段定义格式,没有适配PHP的数组语法规则。PHP中以冒号开头的字符串如果作为数组键或者头字段的一部分,没有用引号包裹的话,会被解析为非法标记,触发语法错误。

正确添加必填头字段的方法

新APNs Provider API要求使用HTTP/2协议通信,所有带冒号开头的伪头字段需要按照PHP cURL扩展的要求定义,具体实现步骤如下:

1. 环境依赖检查

确保你的运行环境满足基础要求:

  • PHP版本 >= 7.1
  • 已开启curl扩展,且libcurl版本 >= 7.38.0,支持HTTP/2协议
  • 已准备好新APNs要求的p12推送证书或者p8认证密钥

2. 请求头的正确写法

CURLOPT_HTTPHEADER配置要求每个头字段都是字段名: 字段值格式的字符串,所有伪头直接按该格式写到数组中即可,示例:

// 测试设备token
$deviceToken = '你的测试设备唯一标识';
// App的Bundle ID,作为apns-topic值
$bundleId = 'com.yourapp.bundleid';
// 拼接path伪头的取值,固定格式为/3/device/{设备token}
$apnsPath = "/3/device/{$deviceToken}";

// 头字段配置
$headers = [
    ":method: POST",
    ":path: {$apnsPath}",
    "apns-topic: {$bundleId}",
    "apns-push-type: alert", // 按推送类型选择alert/background/voip等
    "Content-Type: application/json"
];

3. 完整请求示例

以p12证书认证为例,完整的cURL请求代码如下:

// 初始化cURL
$ch = curl_init();
// 测试环境地址为https://api.sandbox.push.apple.com,生产环境替换为https://api.push.apple.com
curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.push.apple.com{$apnsPath}");
curl_setopt($ch, CURLOPT_PORT, 443);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // 必须指定使用HTTP/2协议
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);

// 构造推送payload
$payload = json_encode([
    'aps' => [
        'alert' => [
            'title' => '测试推送',
            'body' => '新APNs API适配测试通知'
        ],
        'sound' => 'default'
    ]
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 配置p12证书路径和密码
curl_setopt($ch, CURLOPT_SSLCERT, '你的p12证书本地路径');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '你的p12证书密码');

// 执行请求并获取结果
$response = curl_exec($ch);
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 调试输出
var_dump($httpStatusCode, $response);

注意事项

  • 不要将伪头字段定义为PHP数组的键值对,比如[':method' => 'POST']属于错误写法,不符合cURL扩展的头字段传参要求
  • 测试环境和生产环境的APNs服务地址不可混用,否则会导致推送失败
  • 如果使用p8密钥认证,需要额外生成JWT令牌放到authorization头字段中,不需要配置p12证书相关参数

内容的提问来源于stack exchange,提问作者programcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:09:02