f IOS-PHP对接IOS原生推送APNS通知 - Powered by qidao123.com技术社区

PHP对接IOS原生推送APNS通知

打印 上一主题 下一主题

主题 1708|帖子 1708|积分 5124

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
此方法利用的是JWT令牌模式,2024-05-08亲测可用
要求:服务器必须支持http2或者发送请求的插件支持(不支持或者不懂自行百度即可)
自行更换keyId和teamId
本代码示例用到了redis(APNS的jwt有效期规定不能凌驾1小时,需要及时更新),如不需要或者利用别的缓存请自行删除更换
ios推送文档地点(英文):文档地点
注意事项:一定要保存好.p8文件(苹果那边只让下载一次,丢了就要重新天生)
注意事项:一定要保存好.p8文件(苹果那边只让下载一次,丢了就要重新天生)
注意事项:一定要保存好.p8文件(苹果那边只让下载一次,丢了就要重新天生)
PS:其他语音可自行复制代码,让AI转换然后调试即可
不废话直接上代码:
  1. <?php
  2. /**
  3. * @desc
  4. * @datatime 2024/5/6 11:16
  5. */
  6. namespace app\wtx_app\controller\app_push;
  7. use redis\RedisDb;
  8. use think\Controller;
  9. class TestPush extends Controller
  10. {
  11.     protected static $cacheKey  = 'jwt-cache-key';
  12.     protected static $cacheTime = 1800;
  13.     protected static $keyId  = '10位数的keyId';//keyId
  14.     protected static $teamId = '团队ID';//团队ID
  15.     public function testPush(){
  16.         $deviceToken = '';  //推送给谁给
  17.         //方式1
  18.         $payload = [
  19.             'aps'=>[
  20.                 'alert'=>[
  21.                     'title'    =>'消息提醒标题',
  22.                     'subtitle' =>'字幕',
  23.                     'body'     =>'具体话术',
  24.                 ],
  25.                 'badge'=>1//角标展示数量
  26.             ],
  27.             'ziDingYi1'  =>112,//自定义参数1
  28.             'ziDingYi2'  =>['type'=>'ce'],//自定义参数2
  29.         ];
  30.         //方式2
  31.         $payload = [
  32.             'aps'=>[
  33.                 'alert'=>'具体话术',
  34.                 'badge'=>1,
  35.             ],
  36.             'ziDingYi1'  =>112,//自定义参数1
  37.             'ziDingYi2'  =>['type'=>'ce'],//自定义参数2
  38.         ];
  39.         $payloadJson = json_encode($payload);
  40.         //推送地址【沙箱环境:https://api.sandbox.push.apple.com:443正式环境:https://api.push.apple.com:443】
  41.         $url = \think\facade\Env::get('ios_push_token_url','https://api.push.apple.com:443')."/3/device/".$deviceToken;
  42.         //通知类型或者内容一致的话可以设置此值为固定(可以不传,IOS会随机)
  43.         $collapseId = md5('push-ios');
  44.         $headers = array(
  45.             'Authorization: bearer '.$this->getJwt(),//jwt的token令牌
  46.             'Content-Type: application/json',
  47.             'apns-push-type: alert',//推送类型
  48.             'apns-topic: app.xcxapp',//推送给那个app(包名)
  49.             'apns-priority: 10',//通知重要程度(1-10,值越高越重要)
  50.             'apns-expiration: 0',
  51.             'apns-collapse-id: '.$collapseId,
  52.         );
  53.         $ch = curl_init($url);
  54.         curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);//这里很关键,以http2发送请求
  55.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取响应内容
  56.         curl_setopt($ch, CURLOPT_POST, true); // 表示这是一个POST请求
  57.         curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadJson);
  58.         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  59.         curl_setopt($ch, CURLOPT_HEADER, true);//获取HEADERS响应头否则就获取不到apns的响应信息(apns-id和apns-unique-id)
  60.         $response  = curl_exec($ch);
  61.         $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  62.         curl_close($ch);
  63.         echo "<pre>";
  64.         // Check the response
  65.         if ($http_code == 200) {
  66.             // 分割响应头字符串为行
  67.             $headerLines = explode("\n", $response);
  68.             // 初始化变量来存储apns-id和apns-unique-id
  69.             $apnsId       = '';
  70.             $apnsUniqueId = '';
  71.             // 遍历每行
  72.             foreach ($headerLines as $line) {
  73.                 // 检查行是否包含apns-id或apns-unique-id
  74.                 if (strpos($line, 'apns-id:') !== false) {
  75.                     // 提取apns-id
  76.                     $apnsId = trim(str_replace('apns-id:', '', $line));
  77.                 }
  78.                 //apns-unique-id仅开发环境会返回
  79.                 if (strpos($line, 'apns-unique-id:') !== false) {
  80.                     // 提取apns-unique-id
  81.                     $apnsUniqueId = trim(str_replace('apns-unique-id:', '', $line));
  82.                 }
  83.             }
  84.             // 输出结果
  85.             echo "apns-id: " . $apnsId . "\napns-unique-id: " . $apnsUniqueId;
  86.             echo "<br>";
  87.             echo 'SUCCESS';
  88.         } else {
  89.             echo 'ERROR_CODE: ' . $http_code;
  90.         }
  91.     }
  92.     private function getJwt(){
  93.         $redis    = RedisDb::getRedis();
  94.         if($redis->exists(self::$cacheKey)){
  95.             return $redis->get(self::$cacheKey);
  96.         }
  97.         //p8文件地址
  98.         $pkeyFile = '.p8'; //p8证书文件,我在这里填的绝对地址
  99.         // token过期时间
  100.         $expires = time() + self::$cacheTime;
  101.         // Generate the JWT header
  102.         $header = array(
  103.             'alg' => 'ES256',
  104.             'kid' => self::$keyId
  105.         );
  106.         $jwtHeader = base64_encode(json_encode($header));
  107.         // Generate the JWT payload
  108.         $payload = array(
  109.             'iss' => self::$teamId,
  110.             'iat' => time(),
  111.             'exp' => $expires,
  112.             'aud' => 'https://appleid.apple.com',
  113.         );
  114.         $jwtPayload = base64_encode(json_encode($payload));
  115.         //载入证书文件
  116.         $pkeyContents = file_get_contents($pkeyFile);
  117.         $pkey = openssl_get_privatekey($pkeyContents);
  118.         //JWT 签名
  119.         $signature = '';
  120.         openssl_sign($jwtHeader . '.' . $jwtPayload, $signature, $pkey, 'sha256');
  121.         $jwtSignature = base64_encode($signature);
  122.         // Generate the final JWT
  123.         $jwt = $jwtHeader . '.' . $jwtPayload . '.' . $jwtSignature;
  124.         // Print the JWT
  125.         $redis->set(self::$cacheKey, $jwt, self::$cacheTime);
  126.         return $jwt;
  127.     }
  128. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表