【问题标题】:How to add in app purchase to react native app?如何添加应用购买以响应原生应用?
【发布时间】:2020-08-05 16:21:30
【问题描述】:

所以我的应用程序中的付费页面,当用户单击打开这些页面中的任何一个时,我想运行一个函数来检查产品是否已购买,如果未购买则购买产品,我发现了两个反应包-native-iap 和 expo-in-app-purchase 但没有找到关于如何实现我需要的过程的明确说明..

const paidPage = async (productId , navTo) => {
 // PASS THE PRODUCT ID AND A FUNCTION THAT NAVIGATE TO THE PAGE 

// HERE I WANT TO CHECK IF THE PRODUCT IS PURCHASED, IF YES THEN NAVIGATE TO THE PAGE
// IF NO THEN PURCHASE THE PRODUCT 



}

【问题讨论】:

    标签: android ios react-native expo react-native-iap


    【解决方案1】:

    您必须检查您是否已经购买了该产品,并检查它是否仍然有效。使用 react-native-iap 包

    RNIap.getPurchaseHistory().catch(() => {
        console.log("error fetching purchase history")
    }).then((res) => {
       // here you will get all the purchase history
       // filter with the product id for which you want to check
       // if record exist that means you have to check its validity
    })
    

    检查有效性并不简单。你需要使用下面给出的代码。但是,receiptBody 中的receipt 可以是任何收据,因为响应不显示其到期日期。响应有“latest_receipt_info”,其中包含所有购买的到期日期,您可以从中筛选出您需要的购买。

    const receiptBody = {
        "receipt-data" : receipt,
        "password" : "" //password from the App-Specific Shared Secret in appstoreconnect in-app-purchase section for the app
    }
    await RNIap.validateReceiptIos(receiptBody, true).then((receipt) => {
        try {
            const renewalHistory = receipt.latest_receipt_info 
            // it has all purchase with expiry date
            // filter for the one you are looking for
        } catch (error) {}
    })
    

    收据可以是上面receiptBody 中的任何收据,因此您可以获得当前收据,可以像下面这样快速实施

        await RNIap.getReceiptIOS().then((res) => {
        currentReceipt = res
    })
    

    【讨论】:

      【解决方案2】:

      您可能需要考虑使用其他第三方库来处理收据处理,从而为如何处理应用内购买提供更清晰的指导。

      一个例子是 NamiML,它有一个关于如何检查活跃购买的指南,这里有一个 react native 例子:

      https://docs.namiml.com/docs/react-to-changes-to-entitlements

      您要使用 NamiML 库检查的代码如下所示:

      NativeModules.NamiEntitlementManagerBridge.isEntitlementActive("premium_access", (active) => { 
          if (active) {
          // react to entitlement being active
        }
      });
      

      【讨论】:

        【解决方案3】:

        对于 react native iap,如果用户购买了该应用但他们已经拥有它,您将收到“E_ALREADY_OWNED”的购买错误代码。您可以使用async storage 存储一个变量来检查页面是否已经被购买;如果没有,那就去页面奖励吧。

        useEffect(() => {
            if (currentPurchaseError) {
              if (
                currentPurchaseError.code === "E_ALREADY_OWNED" &&
                !isPagePurchased
              ) {
                setAndStorePagePurchase(true)
              }
            }
          }, [currentPurchaseError])
        

        请参阅this example,了解如何将其实现到一个完整的简单应用程序中。

        【讨论】:

          【解决方案4】:

          我最近使用RevenueCat 取得了相对成功。如果您在一年内通过该应用赚取的收入少于 10k(?),它们是免费的。使用他们的 sdk react-native-purchases 我实现了类似的东西,考虑到我只有 1 个 IAP:

                try {
                  const purchaserInfo = await Purchases.getPurchaserInfo();
                  if (purchaserInfo && Object.entries(purchaserInfo.entitlements.active).length) {
                    setActive(true); //There exists an entry for the purchase they made, 
                                     //meaning they're an active customer
                  } else {
                    setActive(false);
                  }
          
                  const offerings = await Purchases.getOfferings();
                  if (offerings && offerings.current) {
                    setPrice(offerings.all.fullVersionOffering.availablePackages[0].product.price_string);
                  } else {
                    setPrice('$1.99');
                  }
                } catch (error) {
                  console.log(error);
                }
          

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 1970-01-01
            • 2013-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多