钱包通行证推送通知 APN
Wallet pass push notifications APNs
所以我已经完成了 Apple pass 的所有签名和压缩过程,并且已经能够将 pass 连接到我的服务器以进行更新。我唯一要解决的问题是实现推送通知。
我已经尝试了几天,但似乎无法管理,我想我错过了一些非常简单的东西。我不太精通网络,所以非常感谢您的帮助。
这是我尽最大努力从 guzzle 得到的日志。
- 正在尝试 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 / ECDHE-RSA-CHACHA20-POLY1305 的 SSL 连接 * ALPN,服务器接受使用 h2 * 服务器证书: * 主题:CN=api.push.apple.com; OU=管理:idms.group.533599; O=苹果公司; ST=加利福尼亚; C=US * 开始日期:格林威治标准时间 2019 年 3 月 14 日 17:50:10 * 到期日期:格林威治标准时间 4 月 12 日 17:50:10 2021 * subjectAltName:主机 "api.push.apple.com" 匹配证书的 "api.push.apple.com" * 颁发者:CN=苹果 IST CA 2 - G1; OU=认证机构; O=苹果公司; C=US * SSL 证书验证正常。 * 使用 HTTP2,服务器支持多用途 * 连接状态已更改(HTTP/2 已确认) * 升级后将流缓冲区中的 HTTP/2 数据复制到连接缓冲区:len=0 * 发送 HTTP 失败 POST请求 * 到主机 api.push.apple.com 的连接 #0 完好无损
我使用的是与通行证相同的证书,我正在尝试更新并发送我在注册通行证时收到的设备令牌。这是我的 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 更熟悉。
它对我有用,只是做了一些小改动:
$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 object(但存在)和主题的 header 名称,apns-topic
不是apns-id
。我还直接构建了 URL,而不是通过 headers 并使用了一个包含私钥的 pem 文件,不确定这些是否重要。
也许你还应该检查你在 URL 末尾传递的内容,它不是 device_id
,而是 device_push_token
。
注意:请记住始终将钱包推送通知发送到生产 apple 端点,而不是沙箱!
所以我已经完成了 Apple pass 的所有签名和压缩过程,并且已经能够将 pass 连接到我的服务器以进行更新。我唯一要解决的问题是实现推送通知。
我已经尝试了几天,但似乎无法管理,我想我错过了一些非常简单的东西。我不太精通网络,所以非常感谢您的帮助。
这是我尽最大努力从 guzzle 得到的日志。
- 正在尝试 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 / ECDHE-RSA-CHACHA20-POLY1305 的 SSL 连接 * ALPN,服务器接受使用 h2 * 服务器证书: * 主题:CN=api.push.apple.com; OU=管理:idms.group.533599; O=苹果公司; ST=加利福尼亚; C=US * 开始日期:格林威治标准时间 2019 年 3 月 14 日 17:50:10 * 到期日期:格林威治标准时间 4 月 12 日 17:50:10 2021 * subjectAltName:主机 "api.push.apple.com" 匹配证书的 "api.push.apple.com" * 颁发者:CN=苹果 IST CA 2 - G1; OU=认证机构; O=苹果公司; C=US * SSL 证书验证正常。 * 使用 HTTP2,服务器支持多用途 * 连接状态已更改(HTTP/2 已确认) * 升级后将流缓冲区中的 HTTP/2 数据复制到连接缓冲区:len=0 * 发送 HTTP 失败 POST请求 * 到主机 api.push.apple.com 的连接 #0 完好无损
我使用的是与通行证相同的证书,我正在尝试更新并发送我在注册通行证时收到的设备令牌。这是我的 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 更熟悉。
它对我有用,只是做了一些小改动:
$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 object(但存在)和主题的 header 名称,apns-topic
不是apns-id
。我还直接构建了 URL,而不是通过 headers 并使用了一个包含私钥的 pem 文件,不确定这些是否重要。
也许你还应该检查你在 URL 末尾传递的内容,它不是 device_id
,而是 device_push_token
。
注意:请记住始终将钱包推送通知发送到生产 apple 端点,而不是沙箱!