当前位置: 首页 > 工具软件 > APNS/2 > 使用案例 >

PHP使用http2协议调用苹果APNs接口

秦钟展
2023-12-01

前言

旧版的苹果APNs接口将会在2021年3月31日废弃(官方通知),因此需要迁移到新的http2协议接口。

准备工作

1)在调用新接口前,需要先确认服务器是否支持http2协议,在Linux服务器上执行以下命令:

curl --http2 'https://www.baidu.com'
curl: (1) Unsupported protocol

如果显示Unsupported protocol,则代表服务器不支持http2协议,需要升级curl,如果使用的是ubuntu系统,可以参考这篇文章升级。

2)如果服务器使用的是旧的GeoTrustCA根证书,需要在2021年3月29日前替换,具体参阅苹果官方通知

3)确认PHP版本,5.5.24版本以上的PHP的curl扩展才支持http2

代码

function send_apns_message() {
    // pem格式推送证书文件路径
    $certFilePath = '/path/to/pem';
    // 推送证书密码,没有密码则留空
    $certPwd = '';
    // 设备token
    $token = 'c63e7xxxxxxxxxxf17d2d5bd743b1681xxxxx692ac3f7fd4a05a14880b4b9ea3';
    // APP的bundle ID
    $bundleId = 'com.bundle.id';

    $url = "https://api.push.apple.com/3/device/{$token}";
    // 沙箱环境的推送用下面↓这个接口地址
    //$url = "https://api.development.push.apple.com/3/device/{$token}";
    // 请求头
    $headers = [
        "apns-topic:{$bundleId}",
    ];
    // 请求体
    $payload = [
        'aps' => [
            'alert' => [
                'title' => 'This is title',
                'body' => 'This is content',
            ],
        ],
    ];
    $payload = json_encode($payload);

    // 发出请求
    $ch = curl_init();
    $options = [
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
        CURLOPT_SSLCERT => $certFilePath,
        CURLOPT_SSLCERTPASSWD => $certPwd,
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
    ];
    curl_setopt_array($ch, $options);
    $responseBody = curl_exec($ch);
    $errno = curl_errno($ch);
    if ($errno) {
        exit("cURL errno:{$errno}, error:" . curl_error($ch));
    }
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    var_dump($responseCode, $responseBody);
}

send_apns_message();

如果消息推送成功,HTTP code会返回200,HTTP body会返回空;如果不成功,HTTP body会返回一个JSON,比如{"reason":"MissingDeviceToken"}

参阅

官方接口文档一
官方接口文档二

 类似资料: