Implementing In-App Purchases using expo-iap in React Native Expo for Android/IOS

Tiempo de lectura: 2 minutos

Today we’re going to learn how to implement in-app purchases using Expo IAP for Android or iOS on React Native.

Furgoneta power - Pexels

First we’re going to install the library we need (expo-iap):

npx expo install expo-iap

Now we need to add our code inside app.config.js:

{ "plugins": [ "expo-iap" ] }

Remember to create subscriptions inside Google Play or Apple Store.

Once installed, we will proceed with the code:

Aquí te dejo el código con las mejoras y ajustes sugeridos:ComprasIAPScreen.jsjsximport React, { useState, useEffect } from ‘react’;import axios from ‘axios’;const ComprasIAPScreen = () => { const [products, setProducts] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { // Cargar productos desde el servidor fetch(‘/api/products’) .then(response => response.json()) .then(data => setProducts(data)) .catch(error => setError(error)); }, []); const handlePurchase = async (productId) => { try { setLoading(true); // Solicitar compra para producto await solicitarCompraProducto(productId); // Validar compra y enviar al servidor validatePurchase(productId); } catch (error) { setError(error); } finally { setLoading(false); } }; const recordPurchaseInDatabase = async (purchase, transactionReceipt) => { const compra = { id_user: userData.user_id, purchaseToken: transactionReceipt.purchaseToken, packageName: transactionReceipt.packageName, productId: transactionReceipt.productId, transactionId: purchase.transactionId ?? ”, purchaseTime: purchase.purchaseTime || Date.now(), platform: Platform.OS, test: test, }; try { const response = await axios.post(‘/api/compras’, compra); if (response.data === 1) { console.log(‘Purchase validated and recorded successfully’); setLoading(false); return true; } else { console.error(‘Server validation failed:’, response.data); return false; } } catch (error) { console.error(‘Error recording purchase:’, error); return false; } }; const updateLocalState = async (productId) => { // Actualizar estado local if (productosSolicitados.includes(productId)) { const monedas = productId.split(‘.’)[1]; setCreditos(creditos + parseInt(monedas)); } }; return ( {products.map((product) => (

Leave a Comment