react-native-apklis-payments
v0.1.1
Published
Libreria desarrollada para integrar los pagos de Apklis en React Native
Readme
react-native-apklis-payments
Biblioteca desarrollada para integrar los pagos de Apklis en React Native. Permite verificar si un usuario ha pagado tu aplicación, obtener información de la app de Apklis, y procesar pagos en tiempo real mediante WebSocket.
Requisitos
- React Native >= 0.76
- Android SDK 24+ (minSdkVersion)
- La aplicación de Apklis instalada en el dispositivo del usuario
- Para Android 11+ (API 30+), se requieren permisos especiales en el AndroidManifest
Instalación
npm install react-native-apklis-paymentsO si usas Yarn:
yarn add react-native-apklis-paymentsConfiguración de Android
1. Actualizar AndroidManifest.xml
Agrega los siguientes permisos y consultas en tu archivo android/app/src/main/AndroidManifest.xml:
<manifest package="com.tuempresa.tuapp">
<!-- Permisos necesarios -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Para Android 11+ (API 30+) - Consultas a paquetes -->
<queries>
<package android:name="cu.uci.android.apklis" />
<package android:name="cu.apklis.payment" />
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="apklis" />
</intent>
</queries>
<application>
<!-- Tu MainActivity debe tener exported="true" para Android 11+ -->
<activity
android:name=".MainActivity"
android:exported="true"
... >
</activity>
</application>
</manifest>2. Colocar la clave de cifrado (opcional)
Si necesitas verificar compras o usar funcionalidades avanzadas de licencias, necesitas obtener una clave de cifrado de Apklis. Sigue estos pasos:
- Ve a tu panel de desarrollador en Apklis
- Genera tu clave de cifrado privada
- Coloca el archivo de clave pública en:
android/app/src/main/assets/license_private_key.pub
Nota: Si no tienes la clave, la verificación de pagos funcionará parcialmente (solo verificación básica via ContentProvider).
Uso
Verificar si el usuario pagó
import { isPurchased, getApklisInfo } from 'react-native-apklis-payments';
// Verificar si el usuario actual ha pagado la app
const status = await isPurchased();
console.log(status);
// {
// paid: true,
// username: "usuario123",
// packageId: "com.tuempresa.tuapp",
// error?: string (si hay algún error)
// }
// Verificar un paquete específico (para apps con módulos de pago)
const statusModule = await isPurchased("com.tuempresa.modulo_premium");Obtener información de Apklis
import { getApklisInfo } from 'react-native-apklis-payments';
const info = await getApklisInfo();
console.log(info);
// {
// isInstalled: true,
// versionName: "3.5.2",
// versionCode: 152,
// packageName: "cu.uci.android.apklis"
// }Redirigir al usuario para comprar
import { purchaseLicense } from 'react-native-apklis-payments';
// licenseUuid: El UUID de tu licencia en Apklis
const result = await purchaseLicense("tu-license-uuid-aqui");
console.log(result);
// {
// success: true,
// message: "Aplicación de Apklis iniciada para la compra"
// }
// Si el usuario no tiene la app de Apklis, se abrirá en el navegadorVerificar una licencia específica
import { verifyLicense } from 'react-native-apklis-payments';
const license = await verifyLicense("tu-license-uuid-aqui");
console.log(license);
// {
// valid: true,
// license: "premium_monthly",
// username: "usuario123",
// paid: true
// }Pagos en tiempo real (WebSocket)
La biblioteca soporta conexión WebSocket para recibir notificaciones instantáneas cuando el usuario completa un pago.
Conectar al canal de pagos
import {
connectPaymentListener,
disconnectPaymentListener,
addPaymentListener,
removeAllPaymentListeners
} from 'react-native-apklis-payments';
// Conectar al canal de pagos
await connectPaymentListener("com.tuempresa.tuapp");Escuchar eventos de pago
import { addPaymentListener } from 'react-native-apklis-payments';
// Evento: Usuario realizó un pago
const unsubscribePayment = addPaymentListener('onPaymentReceived', (event) => {
console.log('Pago recibido:', event);
// {
// paid: true,
// license: "premium_monthly",
// username: "usuario123",
// packageId: "com.tuempresa.tuapp"
// }
// Aquí puedes habilitar las funciones premium del usuario
enablePremiumFeatures();
});
// Evento: Estado de licencia cambió
const unsubscribeStatus = addPaymentListener('onPaymentStatusChanged', (event) => {
console.log('Estado cambiado:', event);
// {
// event: "license_validated",
// license: "premium_monthly",
// paid: true,
// username: "usuario123"
// }
});
// Evento: Diálogo de pago cerrado por el usuario
addPaymentListener('onPaymentDialogClosed', (event) => {
console.log('Usuario cerró el diálogo de pago');
});
// Evento: Conexión establecida
addPaymentListener('onPaymentConnected', (event) => {
console.log('Conectado al canal de pagos');
});
// Evento: Desconectado
addPaymentListener('onPaymentDisconnected', (event) => {
console.log('Desconectado:', event.reason);
});
// Evento: Error de conexión
addPaymentListener('onPaymentError', (event) => {
console.log('Error:', event.error);
});
// Limpiar listeners cuando ya no los necesites
// unsubscribePayment();
// unsubscribeStatus();
// O eliminar todos:
// removeAllPaymentListeners();Desconectar
import { disconnectPaymentListener } from 'react-native-apklis-payments';
await disconnectPaymentListener();Ejemplo completo de uso
import React, { useEffect, useState } from 'react';
import {
View,
Text,
Button,
Alert
} from 'react-native';
import {
isPurchased,
getApklisInfo,
purchaseLicense,
connectPaymentListener,
disconnectPaymentListener,
addPaymentListener,
removeAllPaymentListeners
} from 'react-native-apklis-payments';
const YOUR_PACKAGE_ID = 'com.tuempresa.tuapp';
const YOUR_LICENSE_UUID = 'tu-license-uuid-aqui';
function App() {
const [isPaid, setIsPaid] = useState(false);
const [username, setUsername] = useState('');
const [apklisInstalled, setApklisInstalled] = useState(false);
useEffect(() => {
checkPaymentStatus();
checkApklisInstalled();
setupPaymentListener();
return () => {
removeAllPaymentListeners();
disconnectPaymentListener();
};
}, []);
const checkPaymentStatus = async () => {
const status = await isPurchased(YOUR_PACKAGE_ID);
setIsPaid(status.paid);
setUsername(status.username);
};
const checkApklisInstalled = async () => {
const info = await getApklisInfo();
setApklisInstalled(info.isInstalled);
};
const setupPaymentListener = async () => {
await connectPaymentListener(YOUR_PACKAGE_ID);
addPaymentListener('onPaymentReceived', (event) => {
if (event.paid) {
setIsPaid(true);
setUsername(event.username || '');
Alert.alert('¡Pago recibido!', 'Gracias por tu compra. Ahora puedes usar todas las funciones premium.');
}
});
};
const handleBuy = async () => {
if (!apklisInstalled) {
Alert.alert(
'App de Apklis no encontrada',
'Por favor instala la app de Apklis desde apklis.cu para realizar el pago.'
);
return;
}
await purchaseLicense(YOUR_LICENSE_UUID);
};
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Estado de pago: {isPaid ? 'PAGADO' : 'NO PAGADO'}</Text>
{username ? <Text>Usuario: {username}</Text> : null}
{!isPaid && (
<Button title="Comprar Premium" onPress={handleBuy} />
)}
</View>
);
}
export default App;API Reference
Funciones
| Función | Descripción |
|---------|-------------|
| isPurchased(packageId?) | Verifica si el usuario ha pagado. Devuelve { paid: boolean, username: string, packageId: string, error?: string } |
| getApklisInfo() | Obtiene información de la app de Apklis. Devuelve { isInstalled: boolean, versionName: string, versionCode: number, packageName: string } |
| purchaseLicense(licenseUuid) | Redirige al usuario a Apklis para comprar. Devuelve { success: boolean, message: string } |
| verifyLicense(licenseUuid) | Verifica una licencia específica. Devuelve { valid: boolean, license: string, username: string, paid: boolean } |
| connectPaymentListener(packageId) | Conecta al WebSocket para pagos en tiempo real |
| disconnectPaymentListener() | Desconecta del WebSocket |
| addPaymentListener(event, callback) | Escucha un evento específico |
| removeAllPaymentListeners() | Elimina todos los listeners |
Eventos de WebSocket
| Evento | Descripción |
|--------|-------------|
| onPaymentReceived | Se dispara cuando el usuario completa un pago |
| onPaymentStatusChanged | Se dispara cuando cambia el estado de la licencia |
| onPaymentDialogClosed | Se dispara cuando el usuario cierra el diálogo de pago |
| onPaymentConnected | Se dispara cuando la conexión WebSocket se establece |
| onPaymentDisconnected | Se dispara cuando la conexión WebSocket se cierra |
| onPaymentReconnected | Se dispara cuando la conexión WebSocket se reestablece |
| onPaymentError | Se dispara cuando hay un error en la conexión |
Errores conocidos
Error 403 en dispositivos Xiaomi (Android 11)
Si experimentas errores 403 repetidos en dispositivos Xiaomi:
- Verifica que el usuario esté logueado en Apklis
- En "Ajustes > Cuentas y sincronización" verifica que la cuenta de Apklis esté correctamente creada
- Agrega al AndroidManifest:
<queries>
<package android:name="cu.uci.android.apklis" />
</queries>Para Android 16+
Si tienes problemas con Android 16, agrega en el AndroidManifest:
<queries>
<intent>
<action android:name="android.accounts.AccountAuthenticator" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="apklis" />
</intent>
</queries>Licencia
MIT
