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添加对应权限,确保签名配置正确。
- iOS:在Xcode中开启内购能力,前往App Store Connect创建订阅型产品并设置3天免费试用期;确保
二、核心功能代码实现
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
相关产品推荐
相关产品推荐

