如何使用 PHP 解密 Apple 服务器到服务器通知

问题描述 投票:0回答:1

我已经在这个问题上苦苦挣扎了好几天了。我不确定是Apple 的文档不好还是缺少代码示例使一切变得复杂。我还感到惊讶的是,似乎几乎没有人在使用它,因为我无法在网上找到好的例子。

我做了以下过程:

  1. 我在应用程序信息中添加了一个沙箱 webhook,并通过 ngrok(隧道)运行它来检查我收到的信息。
  2. 过了一会儿,我能够弄清楚我到底需要从响应中进行 base64 url 解码,最终得到一个具有这种结构的对象。
Array
(
    [headers] => stdClass Object
        (
            [alg] => ES256
            [x5c] => Array
                (
                    [0] => ...,
                    [1] => ...,
                    [2] => ...,
                )

        )

    [payload] => stdClass Object
        (
            [notificationType] => DID_RENEW
            [notificationUUID] => ...uuid...
            [data] => stdClass Object
                (
                    [bundleId] => ...app.id...
                    [bundleVersion] => 1.5
                    [environment] => Sandbox
                    [signedTransactionInfo] => ... //long string of encrypted info
                )

            [version] => 2.0
            [signedDate] => 1670890743027
        )

    [signature] => ... // signature string
)

由于大小原因,我减少了字段,但根据文档基本上如下:

  • headers->alg
    - 使用的算法
  • headers->x5c
    - 是一个包含 3 个键的数组

引用苹果文档

App Store签署交易及续订 您在 App Store 服务器通知 V2 中收到的信息以及 在 App Store 服务器 API 中。它使用以下x5c证书 链条,按顺序:

  1. 包含与该密钥对应的公钥的证书 App Store 用于对 JWS 进行数字签名。
  2. 来自 Apple PKI 站点的 Apple 中级证书,以全球开发者关系开头。
  3. Apple 根证书。

之后:

  • payload
    是一个包含相关信息的对象,这里相关的是

payload->data->signedTransactionInfo

最后是

  • signature
    我不知道如何处理该财产。

据我了解,我需要使用响应中给出的密钥来解密 JWT。我尝试使用这个 PHP 库,但我不知道如何继续。数据差异很大,我不确定对应关系是什么。我只知道它使用 ES256,但不知道从那里去哪里。

php encryption jwt webhooks
1个回答
0
投票

我知道这是一个相对较老的问题,但我最近偶然发现了您的帖子,自己寻找解决方案。在上届 WWDC 2023 上,Apple 发布了官方库,使 App Store 服务器 API 和服务器通知变得易于使用。不幸的是,只有 Swift、Node.js、Python 和 Java 的库。由于我自己使用 PHP 并且必须使用 Apple 的 API,因此我决定将官方库翻译为 PHP。您可以在这里找到我的实现:https://github.com/hoels/app-store-server-library-php

如果您仍在寻找解决方案,希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.