用php和.p8文件发送iOS推送通知

用php和.p8文件发送iOS推送通知,php,ios,swift,apple-push-notifications,Php,Ios,Swift,Apple Push Notifications,苹果更新了推送通知服务,收到的证书文件现在是.p8文件。网上有很多关于如何使用.pem文件发送推送通知的示例,但是我找不到任何关于.p8文件的示例。有没有人有任何可以使用.p8文件的代码?我一直在尝试使用PHP发送带有new的推送通知。这绝对不是一项容易的任务 我已经把这个项目上传到了。您可以从那里下载,并确保将.p8文件替换为现有的.p8文件 然后在push.php文件中,您需要替换您的kid、iss(团队ID)、token和app\u bundle\u ID 转到目录并从终端运行命令php

苹果更新了推送通知服务,收到的证书文件现在是.p8文件。网上有很多关于如何使用.pem文件发送推送通知的示例,但是我找不到任何关于.p8文件的示例。有没有人有任何可以使用.p8文件的代码?

我一直在尝试使用PHP发送带有new的推送通知。这绝对不是一项容易的任务

我已经把这个项目上传到了。您可以从那里下载,并确保将.p8文件替换为现有的.p8文件

然后在
push.php
文件中,您需要替换您的
kid
iss(团队ID)
token
app\u bundle\u ID

转到目录并从终端运行命令
php push.php
。如果一切顺利,那么您应该会收到推送通知

这个解决方案对我很有效。只要确保终端中没有任何错误


我希望这能有所帮助。

通过下面的脚本,我能够使用.p8文件发送基于令牌的推送通知

支持这一点的curl的最低版本是7.38.0,它必须使用标志--with-nghttp2和openssl>=1.0.2进行编译

<?php

  $keyfile = 'AuthKey_AABBCC1234.p8';               # <- Your AuthKey file
  $keyid = 'AABBCC1234';                            # <- Your Key ID
  $teamid = 'AB12CD34EF';                           # <- Your Team ID (see Developer Portal)
  $bundleid = 'com.company.YourApp';                # <- Your Bundle ID
  $url = 'https://api.development.push.apple.com';  # <- development url, or use http://api.push.apple.com for production environment
  $token = 'e2c48ed32ef9b018........';              # <- Device Token

  $message = '{"aps":{"alert":"Hi there!","sound":"default"}}';

  $key = openssl_pkey_get_private('file://'.$keyfile);

  $header = ['alg'=>'ES256','kid'=>$keyid];
  $claims = ['iss'=>$teamid,'iat'=>time()];

  $header_encoded = base64($header);
  $claims_encoded = base64($claims);

  $signature = '';
  openssl_sign($header_encoded . '.' . $claims_encoded, $signature, $key, 'sha256');
  $jwt = $header_encoded . '.' . $claims_encoded . '.' . base64_encode($signature);

  // only needed for PHP prior to 5.5.24
  if (!defined('CURL_HTTP_VERSION_2_0')) {
      define('CURL_HTTP_VERSION_2_0', 3);
  }

  $http2ch = curl_init();
  curl_setopt_array($http2ch, array(
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
    CURLOPT_URL => "$url/3/device/$token",
    CURLOPT_PORT => 443,
    CURLOPT_HTTPHEADER => array(
      "apns-topic: {$bundleid}",
      "authorization: bearer $jwt"
    ),
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $message,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADER => 1
  ));

  $result = curl_exec($http2ch);
  if ($result === FALSE) {
    throw new Exception("Curl failed: ".curl_error($http2ch));
  }

  $status = curl_getinfo($http2ch, CURLINFO_HTTP_CODE);
  echo $status;

  function base64($data) {
    return rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '=');
  }

?>

我还努力找到一个简单的库,用PHP中的.p8文件发送APNS通知。我发现这个库是最直接和面向对象的。只需安装带有
composer require edamov/pushok的软件包,并按照中的说明进行操作。

我已尝试但未在php5.6版本中工作,请给出错误。@Jay能否解释一下如何使用它?laravelI收到一个错误,即“意外的HTTP/1.x请求:POST/3/device/5cba9501b6b3d6xxxxxxxx”。你能建议一个解决方案吗?你能按照这个答案中的建议重新启动Web服务器吗:?当我试图运行上面的代码“Curl failed:No URL set!”时,我遇到了这个错误即使我正在传递url。因此,我将
curl\u setopt\u数组
替换为
curl\u setopt
,它对我很有效。@Hareesh我设法解决了这个问题,请参见此处:@JaySojitra:您不必自己填写$signature。当调用成功时,这将由openssl\u签名完成,请参阅