钱包通行证推送通知APN

时间:2019-10-14 14:06:03

标签: ssl apple-push-notifications http2 wallet passkit

因此,我已经完成了Apple通行证的所有签名和压缩过程,并且能够将通行证连接到我的服务器以进行更新。我剩下要解决的唯一问题是实施推送通知。

我已经尝试了几天,但似乎无法解决,我想我缺少了一些非常简单的东西。我对网络不是很熟练,所以我非常感谢您的帮助。

这是我从最大的努力中得到的日志。

  • 正在尝试17.188.136.150:443 ... *已设置TCP_NODELAY *已连接到api.push.apple.com(17.188.136.150)端口443(#0)* ALPN,提供了h2 * ALPN,提供了http / 1.1 *设置证书验证位置:* CAfile:/usr/local/etc/openssl/cert.pem CApath:/usr/local/etc/openssl@1.1/certs *使用TLSv1.2的SSL连接/ ECDHE-RSA-CHACHA20-POLY1305 * ALPN,接受使用h2的服务器*服务器证书:*主题:CN = api.push.apple.com; OU = management:idms.group.533599; O =苹果公司; ST =加利福尼亚; C = US *开始日期:2019年3月14日17:50:10 GMT *过期日期:4月12日17:50:10 2021 GMT * subjectAltName:主机“ api.push.apple.com”与证书的“ api.push.apple”匹配.com“ *发行者:CN = Apple IST CA 2-G1; OU =证书颁发机构; O =苹果公司; C = US * SSL证书验证成功。 *使用HTTP2,服务器支持多用途*更改连接状态(已确认HTTP / 2)*升级后将流缓冲区中的HTTP / 2数据复制到连接缓冲区:len = 0 *发送HTTP POST请求失败*连接#0到主机api .push.apple.com保持不变

我使用的密码与尝试更新密码时使用的证书相同,并且正在发送注册密码时收到的设备令牌。这是我的php代码。

$client = new Client();
  try {
    $result = $client->post('https://api.push.apple.com:443', [
    'headers' => ['apns-id' => <pass_type_id> , ':path' => '/3/device/<device_id_received_upon_registration>'],
    'json' => ['apns'=>''],
    'debug'=>true,
    'version'=>2.0,
    'ssl_key'   => [<path_to_key>, <key_password>],
    'cert'      => [<path_to_certificate (same one used for signing pass)>, <certificate_password>]]);
    }
    catch (GuzzleHttp\Exception\ClientException $e) {
        dd($e);
    }

我真的迷失了这个。请帮帮我。我还尝试使用复制的其他代码连接到端口1295,但是它无法正常工作,并且由于我对端口443更加熟悉,调试起来更加困难。

1 个答案:

答案 0 :(得分:0)

它对我有用,但有一些小的变化:

$pem_file       = '<path_to_your_pem_file_including_private_key>';
$pem_secret     = '<private_key_password>';

$url = "https://api.push.apple.com/3/device/" . $device_push_token;

$response = $client->post($url, [
    'headers' => ['apns-topic' => $pass_type_id],
    'json' => json_decode('{}'),
    'debug' => true,
    'version' => 2.0,
    'cert' => [$pem_file, $pem_secret]
]);

var_dump($response->getStatusCode());
var_dump($response->getReasonPhrase());

更改的是需要为空JSON对象(但存在)的有效负载以及该主题的标头名称,它是apns-topic而不是apns-id。我还直接构造了URL,而不是通过标题构造了URL,并使用了包含私钥的pem文件,不确定这些是否重要。

也许您还应该检查URL末尾传递的内容,它不是device_id,而是device_push_token

注意:请记住始终将钱包推送通知发送到生产Apple端点,而不是沙盒!