Несоответствия с документацией в ответе от конечной точки Apple verifyReceipt

Я нахожусь в процессе настройки проверки получения автоматически возобновляемых подписок Apple на нашем сервере и заметил некоторые несоответствия с официальным документация. При проверке квитанции песочницы с помощью конечной точки sandbox verifyReceipt ответ выглядит следующим образом:

{  
  "auto_renew_status": 1,  
  "status": 0,  
  "auto_renew_product_id": "app.xxx",  
  "receipt": {  
    "original_purchase_date_pst": "2020-03-18 01:11:45 America/Los_Angeles",  
    "quantity": "1",  
    "unique_vendor_identifier": "6D2xxx194",  
    "bvrs": "2",  
    "expires_date_formatted": "2020-03-20 12:27:07 Etc/GMT",  
    "is_in_intro_offer_period": "false",  
    "purchase_date_ms": "1584703627636",  
    "expires_date_formatted_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
    "is_trial_period": "false",  
    "item_id": "15xxx27",  
    "unique_identifier": "cd5xxx424",  
    "original_transaction_id": "100xxx735",  
    "subscription_group_identifier": "20xxx02",  
    "transaction_id": "100xxx439",  
    "web_order_line_item_id": "100xxx419",  
    "version_external_identifier": "0",  
    "purchase_date": "2020-03-20 11:27:07 Etc/GMT",  
    "product_id": "app.xxx",  
    "expires_date": "1584707227636",  
    "original_purchase_date": "2020-03-18 08:11:45 Etc/GMT",  
    "purchase_date_pst": "2020-03-20 04:27:07 America/Los_Angeles",  
    "bid": "app.xxx",  
    "original_purchase_date_ms": "1584519105000"  
  },  
  "latest_receipt_info": {  
    "original_purchase_date_pst": "2020-03-18 01:11:45 America/Los_Angeles",  
    "quantity": "1",  
    "unique_vendor_identifier": "6D2xxx194",  
    "bvrs": "2",  
    "expires_date_formatted": "2020-03-20 12:27:07 Etc/GMT",  
    "is_in_intro_offer_period": "false",  
    "purchase_date_ms": "1584703627000",  
    "expires_date_formatted_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
    "is_trial_period": "false",  
    "item_id": "15xxx27",  
    "unique_identifier": "cd5xxx424",  
    "original_transaction_id": "100xxx735",  
    "subscription_group_identifier": "20xxx02",  
    "transaction_id": "100xxx439",  
    "bid": "app.xxx",  
    "web_order_line_item_id": "100xxx419",  
    "purchase_date": "2020-03-20 11:27:07 Etc/GMT",  
    "product_id": "app.xxx",  
    "expires_date": "1584707227000",  
    "original_purchase_date": "2020-03-18 08:11:45 Etc/GMT",  
    "purchase_date_pst": "2020-03-20 04:27:07 America/Los_Angeles",  
    "original_purchase_date_ms": "1584519105000"  
  },  
  "latest_receipt": "xxx"  
} 

Особо хочу отметить следующие поля этого ответа:

{  
    ...  
  "latest_receipt_info": {  
      ...  
    "expires_date": "1584707227000",  
    "expires_date_formatted": "2020-03-20 12:27:07 Etc/GMT",  
    "expires_date_formatted_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
    "subscription_group_identifier": "20xxx02",  
    "bid": "app.xxx",  
      ...  
  },  
  "receipt": {  
      ...  
    "expires_date": "1584707227636",  
    "expires_date_formatted": "2020-03-20 12:27:07 Etc/GMT",  
    "expires_date_formatted_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
    "subscription_group_identifier": "20xxx02",  
    "bid": "app.xxx",  
      ...  
  },  
    ...  
} 

Несоответствия с официальной документацией:

  1. latest_receipt_info задокументировано как массив, однако это один объект json.
  2. В latest_receipt_info expires_date не находится в «формате даты и времени, аналогичном ISO 8601», как документация говорит, но похоже, что это миллисекунды с начала эпохи (что должно быть expires_date_ms). Однако мы можем найти ключ expires_date_formatted в формате даты и времени.
  3. Те же поля, что и в (2), также можно найти в квитанции, однако документация указывает только ключ expiration_date (аналог expires_date в latest_receipt_info в формате даты и времени) и expiration_date_ms (в миллисекундах с начала эпохи).
  4. Задокументированный ключ bundle_id (здесь и здесь) отсутствует, но есть ключ bid, содержащий идентификатор пакета.
  5. Ключ subscription_group_identifer не содержит точной строки, введенной в AppStoreConnect в качестве идентификатора группы подписки, как это задокументировано (здесь и здесь), но содержит целочисленное значение.

Итак, согласно документации, для меня ответ должен выглядеть так:

{  
    ...  
  "latest_receipt_info": [  
    {  
        ...  
      "expires_date": "2020-03-20 12:27:07 Etc/GMT",  
      "expires_date_ms": "1584707227000",  
      "expires_date_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
      "subscription_group_identifier": "MY_SUBSCRIPTION_GROUP_ID",  
      "bundle_id": "app.xxx",  
        ...  
    }  
  ],  
  "receipt": {  
      ...  
    "expiration_date": "2020-03-20 12:27:07 Etc/GMT",  
    "expiration_date_ms": "1584707227636",  
    "expiration_date_pst": "2020-03-20 05:27:07 America/Los_Angeles",  
    "subscription_group_identifier": "MY_SUBSCRIPTION_GROUP_ID",  
    "bundle_id": "app.xxx",  
      ...  
  },  
    ...  
}  
  • Я не уверен, как справиться с этой ситуацией, это ошибка в API или документация просто неверна?
  • Могу ли я ожидать таких же несоответствий для рабочей конечной точки (может ли кто-нибудь поделиться образцом ответа, пожалуйста)?
  • Как насчет уведомлений в уведомлениях между серверами, есть ли несоответствия?

Заранее спасибо!


person j4rv1s    schedule 24.03.2020    source источник


Ответы (2)


Где вы взяли этот пример квитанции? Вот правильный пример квитанции от verifyReceipt endoint: /а>

Также могу порекомендовать вам прочитать статью из нашего блога: https://blog.apphud.com/receipt-validation/

Что касается межсерверных уведомлений Apple, то они теперь унифицированы, т. е. данные возвращаются в той же структуре, что и из конечной точки verifyReceipt.

person apphud    schedule 24.03.2020
comment
Спасибо за пример! Действительно, это полностью отличается от ответа, который я получил. Однако я получил ответ после того, как сам отправил запрос в конечную точку «песочницы» verifyReceipt с квитанцией в кодировке Base64. Квитанция была отправлена ​​на мой сервер после совершения покупки во внешнем интерфейсе Nativescript с использованием последней версии ссылки Плагин покупки Nativescript. Наблюдаемое поведение стабильно в течение нескольких дней и нескольких попыток с различными покупками песочницы. - person j4rv1s; 24.03.2020

Для всех, кто сталкивается с одной и той же проблемой: мы отправили неправильные данные квитанции на наш сервер, так как мы запросили квитанцию ​​через устаревший transactionReceipt, а не через appStoreReceiptURL.

person j4rv1s    schedule 20.04.2020