You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native(Android)内购恢复功能实现方法咨询

React Native 实现带3天试用期的内购及恢复购买功能

一、依赖选择与环境准备

使用react-native-iap库,它支持跨平台内购、订阅及试用期配置。

  • 安装依赖:
    npm install react-native-iap --save
    # 或使用yarn
    yarn add react-native-iap
    
  • 平台配置:
    • iOS:在Xcode中开启内购能力,前往App Store Connect创建订阅型产品并设置3天免费试用期;确保Info.plist添加内购相关权限描述。
    • Android:在Google Play Console创建订阅产品并配置试用期;在AndroidManifest.xml添加对应权限,确保签名配置正确。

二、核心功能代码实现

1. 初始化IAP与基础配置

import React, { useEffect, useState } from 'react';
import { View, Button, Text, Alert } from 'react-native';
import { initConnection, endConnection, getProducts, purchaseItem, restorePurchases, finishTransaction } from 'react-native-iap';
import AsyncStorage from '@react-native-async-storage/async-storage';

// 替换为你在后台配置的产品ID
const SUBSCRIPTION_PRODUCT_ID = 'your_subscription_sku';

const IAPDemo = () => {
  const [products, setProducts] = useState([]);
  const [isTrialActive, setIsTrialActive] = useState(false);

  useEffect(() => {
    // 初始化内购连接
    initConnection().then(() => {
      loadProductInfo();
      checkCurrentTrialStatus();
    });

    return () => {
      endConnection();
    };
  }, []);

  // 加载后台配置的产品信息
  const loadProductInfo = async () => {
    try {
      const fetchedProducts = await getProducts({ skus: [SUBSCRIPTION_PRODUCT_ID] });
      setProducts(fetchedProducts);
    } catch (err) {
      console.error('加载产品失败:', err);
    }
  };

2. 检查试用期状态

通过本地存储记录的购买时间判断用户是否处于试用期:

const checkCurrentTrialStatus = async () => {
    try {
      const trialStartDate = await AsyncStorage.getItem('trial_start_time');
      if (trialStartDate) {
        const trialEndTimestamp = new Date(trialStartDate).getTime() + 3 * 24 * 60 * 60 * 1000;
        const currentTimestamp = new Date().getTime();
        setIsTrialActive(currentTimestamp < trialEndTimestamp);
      }
    } catch (err) {
      console.error('检查试用期状态失败:', err);
    }
  };

3. 发起购买并激活试用期

购买成功后记录试用期起始时间,建议同时调用后端接口验证订单合法性:

const startTrialPurchase = async () => {
    try {
      const purchaseResult = await purchaseItem(SUBSCRIPTION_PRODUCT_ID);
      // 此处务必调用后端API验证订单,防止客户端篡改数据
      // 验证通过后记录试用期开始时间
      const now = new Date().toISOString();
      await AsyncStorage.setItem('trial_start_time', now);
      setIsTrialActive(true);
      // 完成交易,避免重复触发回调
      await finishTransaction(purchaseResult, false);
      Alert.alert('成功', '3天试用期已激活');
    } catch (err) {
      console.error('购买失败:', err);
      Alert.alert('失败', '购买失败,请重试');
    }
  };

4. 恢复购买功能

恢复购买后重新计算并更新试用期状态:

const restoreUserPurchase = async () => {
    try {
      const restoredRecords = await restorePurchases();
      if (restoredRecords.length > 0) {
        // 取最近的有效购买记录
        const latestPurchase = restoredRecords[0];
        await AsyncStorage.setItem('trial_start_time', latestPurchase.transactionDate);
        checkCurrentTrialStatus();
        Alert.alert('成功', '购买记录已恢复');
      } else {
        Alert.alert('提示', '无可用恢复的购买记录');
      }
    } catch (err) {
      console.error('恢复购买失败:', err);
      Alert.alert('失败', '恢复购买失败,请重试');
    }
  };

5. 组件渲染逻辑

return (
    <View style={{ padding: 20, gap: 15 }}>
      {isTrialActive ? (
        <Text style={{ fontSize: 16 }}>当前处于3天试用期内</Text>
      ) : (
        <>
          {products.length > 0 && (
            <Text>
              产品:{products[0].title}\n{products[0].description}
            </Text>
          )}
          <Button title="开启3天试用期" onPress={startTrialPurchase} />
        </>
      )}
      <Button title="恢复购买" onPress={restoreUserPurchase} />
    </View>
  );
};

export default IAPDemo;

三、关键注意事项

  • 订单验证:必须在后端完成订单合法性校验,不能仅依赖客户端逻辑,防止恶意用户篡改试用期状态。
  • 平台差异:iOS与Android的订阅、试用期配置逻辑略有不同,需在对应后台正确设置产品属性。
  • 本地存储:示例使用AsyncStorage记录时间,也可替换为性能更优的MMKV。
  • 交易收尾:购买或恢复操作完成后,必须调用finishTransaction,避免重复触发交易回调。

内容的提问来源于stack exchange,提问作者Technical Inzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:13:26