React Native 的应用程序购买中的博览会 - 如何判断订阅是否是当前/活动的?

cha*_*ble 4 in-app-purchase in-app-subscription react-native expo

当前的应用程序是 Expo for React Native,它被弹出到裸工作流程中。使用expo-in-app-purchasesIAP。

如何判断订阅是否有效?

当我通过以下方式获取购买历史记录时:

const { results } = InAppPurchases.connectAsync();

如果查看结果,结果会返回以下字段:

  • 购买时间
  • 交易收据
  • 订单号
  • 产品编号
  • 承认
  • 原购买时间
  • 原始订单ID
  • 购买状态

现在purchaseState始终是一个整数。我主要看到3(我想我已经看过1一次......)不确定这是否真的告诉我任何有价值的东西,因为它们都是3都是

如果没有手动获取最近的购买并添加 30 天(这是每月订阅)然后查看该日期是否是过去的日期,我不知道如何查找当前用户是否有有效订阅。帮助!

提前致谢!

whu*_*erj 5

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]
}
Run Code Online (Sandbox Code Playgroud)