Expo в покупках приложений для React Native - как узнать, активна ли подписка?

Текущее приложение - Expo для React Native, которое используется в простом рабочем процессе. Использование expo-in-app-purchases для IAP.

Как узнать, активна ли подписка?

Когда я беру историю покупок через:

const { results } = InAppPurchases.connectAsync();

если вы посмотрите на результаты, результат будет содержать следующие поля:

  • buyTime
  • transactionReceipt
  • номер заказа
  • идантификационный номер продукта
  • признал
  • originalPurchaseTime
  • originalOrderId
  • PurchaseState

Теперь PurchaseState всегда целое число. Я в основном вижу 3 (я думаю, что видел 1 один раз ...) Не уверен, что это на самом деле говорит мне что-то ценное, поскольку все они 3

Если не считать вручную самую последнюю покупку и добавить 30 дней (это ежемесячная подписка), а затем посмотреть, была ли эта дата в прошлом, я не уверен, как определить, есть ли у текущего пользователя активная подписка. Помощь!

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


person chairsandtable    schedule 17.07.2020    source источник
comment
Вы когда-нибудь находили для этого решение? У меня такая же проблема. Кажется, у вас получится расшифровать квитанцию ​​и прочитать ее содержимое?   -  person whusterj    schedule 10.12.2020
comment
@ Chairsandtable Как вы реализуете expo-in-app-Purchases? когда я устанавливаю и пытаюсь построить решение, само построение не удалось. например, SKErrorPaymentCancelled и т. д. любое решение?   -  person Khushi    schedule 24.02.2021


Ответы (3)


Apple выдает квитанцию ​​в виде подписанной строки в кодировке base64. Чтобы увидеть содержимое квитанции (включая дату истечения срока действия), вам необходимо отправить эту квитанцию ​​в конечную точку подтверждения квитанции Apple вместе с паролем вашего приложения.

Дополнительная информация здесь: https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store

У меня сработала аналогичная функция. Это извлекает информацию о квитанции в виде объекта JSON, а внутри находится expires_at_ms, который можно сравнить с сегодняшней датой, чтобы узнать, истек ли срок подписки.

async validateAppleReceipt(receipt) {
  const prodURL = 'https://buy.itunes.apple.com/verifyReceipt'
  const stagingURL = 'https://sandbox.itunes.apple.com/verifyReceipt'
  const appSecret = '1234...'

  const payload = {
    "receipt-data": receipt,
    "password": appSecret,
    "exclude-old-transactions": true,
  }

  // First, try to validate against production
  const prodRes = await axios.post(prodURL, payload)

  // If status is 21007, fall back to sandbox
  if (prodRes.data && prodRes.data.status === 21007) {
    const sandboxRes = await axios.post(stagingURL, payload)
    return sandboxRes.data.latest_receipt_info[0]
  }

  // Otherwise, return the prod data!
  return prodRes.data.latest_receipt_info[0]
}
person whusterj    schedule 10.12.2020

Вы пробовали использовать

const { responseCode, results } = await getPurchaseHistoryAsync(true);
person michele banfi    schedule 19.11.2020
comment
Это извлекает список покупок, но неясно, как определить, активна ли покупка подписки с автоматическим продлением. - person whusterj; 10.12.2020
comment
Я понял, что вам нужен бэкэнд и подключиться к сервисам магазина воспроизведения (в Android), вы можете просто сделать это с помощью облачных функций firebase - person michele banfi; 15.12.2020

В качестве альтернативы вы можете использовать сторонний SDK для обработки подписок в приложении и получения проверки квитанции на стороне сервера. Вот как может выглядеть код для проверки текущего статуса подписки с помощью Qonversion.io SDK. Раскрытие информации - я соучредитель Qonversion.io

const permissions: Map<string, Permission> = await Qonversion.checkPermissions();
    
const premiumPermission = permissions.get('premium');
if (mainPermission != null) {
  switch (premiumPermission.renewState) {
    case RenewState.NON_RENEWABLE:
      // NON_RENEWABLE is the state of consumable/non-consumable IAPs that could unlock lifetime access
      break;
    case RenewState.WILL_RENEW:
      // WILL_RENEW is the state of an auto-renewable subscription 
      break;
    case RenewState.CANCELED:
      // The user has turned off auto-renewal for the subscription, but the subscription has not expired yet.
      // Prompt the user to resubscribe with a special offer.
      break;
    case RenewState.BILLING_ISSUE:
      // Grace period: permission is active, but there was some billing issue.
      // Prompt the user to update the payment method.
      break;
  }
}
person Michael    schedule 16.12.2020