import { useEffect } from 'react';
import { Platform } from 'react-native';
import Purchases, { PurchasesPackage } from 'react-native-purchases';
const API_KEYS = {
apple: "appl_your_apple_api_key",
google: "goog_your_google_api_key"
};
export const useRevenueCat = () => {
useEffect(() => {
const setupPurchases = async () => {
Purchases.setLogLevel(Purchases.LOG_LEVEL.DEBUG); // util în dev
const apiKey = Platform.select({
ios: API_KEYS.apple,
android: API_KEYS.google,
});
if (apiKey) {
await Purchases.configure({ apiKey });
}
};
setupPurchases();
}, []);
const handlePurchase = async (pack: PurchasesPackage) => {
try {
const { customerInfo } = await Purchases.purchasePackage(pack);
if (customerInfo.entitlements.active['pro_access'] !== undefined) {
return true; // user-ul a plătit cu succes
}
} catch (e: any) {
if (!e.userCancelled) {
console.warn("Eroare la procesarea plății:", e.message);
}
}
return false;
};
return { handlePurchase };
};Dacă ai încercat vreodată să integrezi plăți in-app nativ în Android și iOS, probabil ai vrut să te lași de meserie. E o gaură neagră de timp, certificate expirate și API-uri inconsistente. Recent, am avut de implementat un sistem de abonamente pentru o aplicație de fitness dezvoltată în Expo, cu vreo 12k useri activi. Am decis să mergem pe mâna RevenueCat.
Nu e o soluție perfectă, dar ne-a scutit de scris cod de backend pentru validarea de rețete (receipt validation) și gestionarea webhook-urilor de refund sau expirare.
De ce am ales RevenueCat și care e compromisul?
Expo are o librărie veche numită expo-in-app-purchases, dar e practic deprecated și destul de limitată. Varianta nativă curată înseamnă să-ți scrii tu server-ul care să asculte de Apple App Store și Google Play. Crede-mă, nu vrei să faci asta dacă ești o echipă mică.
Trade-off-ul cu RevenueCat e simplu: costă bani. Îți iau o taxă după ce treci de 10.000 de dolari Monthly Tracked Revenue (MTR). Pentru noi, calculul a fost simplu: timpul economisit de developeri în primele 3 luni a acoperit costurile lor pe următorii doi ani. Dacă ai un proiect mic sau un MVP, tier-ul lor gratuit e mai mult decât suficient.
Calvarul configurării în console (Apple & Google)
Codul în React Native e partea cea mai ușoară. Greul se dă în consolele magazinelor de aplicații.
Pe iOS, ai nevoie de un Shared Secret din App Store Connect. De asemenea, asigură-te că ai completat toate acordurile fiscale și bancare în contul tău de Apple Developer. Dacă nu le ai active, sandbox-ul îți va returna o eroare complet inutilă de tipul "Unknown error" și vei pierde ore întregi căutând bug-ul în cod.
Pe Android, procesul e și mai birocratic. Trebuie să creezi un Service Account în Google Cloud Console, să generezi o cheie JSON, să mergi în Google Play Console, să-i dai acces de administrator financiar și să legi API-ul. Sfat de pățit: după ce configurezi cheile în Google Play, uneori durează și 36 de ore până când Google le propagă în sistemul de test. Nu te panica dacă primești erori de autentificare în prima zi.
Integrarea în Expo (EAS Build)
Din start, uită de Expo Go. SDK-ul react-native-purchases folosește cod nativ direct sub capotă, așa că ai nevoie obligatoriu de un build nativ de development (development client).
Rulează local sau în cloud build-ul cu:
eas build --profile development --platform all
Altfel, aplicația se va prăbuși instant când încerci să inițializezi SDK-ul.
Cum testăm sandbox-ul fără să înnebunim?
Testarea e locul unde se separă juniorii de seniori, pentru că mediile de sandbox se comportă ciudat.
Pe iOS, ai nevoie de un dispozitiv fizic. Pe simulator, plățile dau rateuri în 90% din cazuri la restore purchases. Mergi în App Store Connect -> Users and Access -> Sandbox Testers și creează un cont fictiv de mail. Pe telefonul tău de teste, mergi în Settings -> App Store, derulează până jos la "Sandbox Account" și loghează-te acolo, nu în iCloud-ul principal.
Pe Android, treaba e mai flexibilă. Poți folosi și un emulator dacă are Google Play Services. Adaugă adresa de mail a contului de Google de pe emulator în Google Play Console la secțiunea "License Testing" ca să poți folosi cardurile de test oferite de Google (care aprobă sau resping tranzacția instant, fără bani reali).
În final, după ce treci de setup-ul inițial, totul merge uns. Partea bună e că RevenueCat îți oferă un dashboard excelent unde vezi în timp real conversiile, churn-ul și MRR-ul, fără să mai scrii tu tool-uri de analytics intern.