Descargar MarkdownDocumento original en GitHub
Guía de integración manual (9 lenguajes, sin necesidad de IA)
Esta guía se aplica al proveedor Licentivo. Los comerciantes que ya usan otro sistema de autorización pueden seleccionar un servicio personalizado en «Selección y personalización de la autorización» en el backend, seguir la API de autorización personalizada y el procedimiento de integración y continuar usando el SDK de su propio sistema de autorización.
Los cambios actuales aún no publicados usan el intercambio de identidad de cuentas. Consulte las responsabilidades y restricciones de migración en Duración de compra y límites del SDK de cuentas. Launch calcula la duración de compra; el SDK de Licentivo aplica la autorización.
Instale solo el paquete de integración de Launch del lenguaje correspondiente. El paquete de Launch incluye el SDK oficial, el adaptador predeterminado y la configuración de enlace; la dirección oficial de autorización es fija: https://www.licentivo.com. El programa inicia sesión con la cuenta registrada por el comprador en la tienda Launch actual.
Obtener el código de inicialización rellenado
- Complete en el backend de Launch la asociación entre software, planes de venta y políticas de autorización de Licentivo, y publíquela en el entorno correspondiente.
- Abra Integración del programa → Comprobación de integración y código y seleccione el software, el lenguaje y el entorno de prueba/producción.
- Haga clic en «Leer información del producto y generar código de integración». Launch lee automáticamente la dirección pública actual del sitio, las asignaciones de productos existentes y la clave pública de firma.
- Copie la función de conexión de la página a su proyecto y escriba manualmente la interfaz y las llamadas de negocio como se describe a continuación. También puede revisar los parámetros rellenados automáticamente y llamar directamente a
Connect/connectdel lenguaje correspondiente.
No es necesario introducir manualmente los dos ID internos de producto ni generar launch-config.json o product.json. La página permite guardar la función de conexión como código fuente. El archivo privado del servidor config.yaml solo sirve para iniciar el servicio Launch y no se puede distribuir con el software de los clientes.
La dirección del sitio procede de la dirección pública válida de la instancia actual (public_url de la configuración de inicio o la dirección pública válida de la configuración del sitio en el backend). Puede ser un dominio o una dirección IP con puerto, pero debe incluir el protocolo; la integración en producción usa HTTPS válido. La dirección de escucha http_addr no es la dirección de acceso de los clientes. Después de cambiar la dirección del sitio, la asignación de productos o el entorno, obtenga de nuevo la función de conexión del sitio actual; las sesiones y las cachés del sitio antiguo no deben usarse como autorización del sitio nuevo.
Los dos identificadores de producto representan una correspondencia interna ya existente: el producto de software de Launch y el producto de autorización de Licentivo. La página de integración los rellena automáticamente según el software seleccionado; el comprador solo introduce la cuenta de la tienda. El servidor obtiene la clave pública de firma mediante la conexión Licentivo configurada; la clave administrativa y las credenciales de autorización de los clientes no se incluyen en el código fuente.
Función de Connect/connect
Connect/connect es el nombre que los distintos lenguajes dan a la operación «crear un cliente de aplicación Launch». Go, C# y algunas interfaces nativas usan Connect con inicial mayúscula; Python, JavaScript, Ruby y otros lenguajes usan connect según sus convenciones. connectLaunch(), connect_launch() o LaunchConnection.Open(), generados por el backend, son funciones del proyecto con los parámetros públicos rellenados que llaman internamente al punto de entrada del lenguaje correspondiente.
La conexión solo completa la inicialización: verifica la dirección de la tienda, la asignación de productos, el entorno y la clave pública de firma, crea el cliente Launch y configura el SDK oficial de Licentivo incluido en el paquete. No verifica la identidad del cliente ni habilita directamente las funciones de pago. La secuencia completa es:
Connect/connect → Login or Restore → RunFeature → Logout / Close
└──────────→ ReleaseDevice (explicit device unlink only)
Durante la ejecución de la aplicación debe mantenerse el mismo objeto cliente para que el SDK gestione correctamente los heartbeats y los puestos flotantes. El cierre normal conserva la vinculación del dispositivo; el cierre de sesión explícito del cliente y el punto de entrada compatible ReleaseDevice llaman al mismo procedimiento de cierre de sesión del SDK oficial.
Instalación y punto de entrada de inicialización
Todas las verificaciones de instalación pública de los nueve lenguajes de la versión 0.1.6 se han superado (9/9); todos los métodos de instalación de la tabla siguiente están verificados. La versión de GitHub también ofrece paquetes nativos y archivos sin conexión; consulte su uso en las instrucciones de instalación de paquetes descargados.
| Idioma | Instalar solo Launch | Función de conexión proporcionada por la página | API de inicialización directa incluida en el paquete |
|---|---|---|---|
| Go | go get github.com/spf86/licentivo-launch-sdk/pkg/launchclient@v0.1.6 |
connectLaunch() |
launchclient.Connect |
| Python 3.10+ | python -m pip install licentivo-launch==0.1.6 |
connect_launch() |
Application.connect |
| C# / .NET 8+ | dotnet add package Licentivo.Launch --version 0.1.6 |
LaunchConnection.Open() |
Application.Connect |
| Java 17+ | Maven/Gradle: com.licentivo.launch:launch-client:0.1.6 |
LaunchConnection.open() |
Launch.connect |
| Node.js 20.3+ | npm install @licentivo/launch@0.1.6 |
connectLaunch() |
Application.connect |
| Rust 1.85+ | cargo add licentivo-launch@=0.1.6 |
connect_launch() |
Application::connect |
| Ruby 3.1+ | gem install licentivo-launch --version 0.1.6 |
connect_launch |
Application.connect |
| C11 | Descargar el paquete nativo de la versión de GitHub e importarlo con CMake | connect_launch() |
launch_application_connect |
| C++17 | Usar el mismo paquete nativo de Launch | connectLaunch() |
Application::Connect |
El código fuente público y los README de cada lenguaje están en el repositorio del SDK de Launch; los paquetes nativos y archivos sin conexión, en la versión v0.1.6; y los resultados de instalación pública, en la verificación de los registros de los nueve lenguajes. El README de cada paquete proporciona los comandos de instalación y las API. El paquete JavaScript incluye declaraciones TypeScript. El gestor de paquetes resuelve las dependencias habituales de cada lenguaje, como cryptography de Python, BouncyCastle de C# y base64 de Ruby; no es necesario instalar el paquete del SDK oficial.
El módulo público de Go se llama github.com/spf86/licentivo-launch-sdk y la ruta de importación es github.com/spf86/licentivo-launch-sdk/pkg/launchclient; la aplicación no necesita un replace local. El paquete nativo de Windows usa amd64 GNU/MinGW y también hay un paquete nativo de Linux amd64. Los paquetes de Ruby por plataforma y la distribución de Windows Rust/native incluyen curl; la compilación desde el código fuente en otras plataformas requiere las dependencias de desarrollo habituales de C11 y curl/OpenSSL. Consulte las instrucciones de las herramientas de cada plataforma en el README de cada paquete.
Inicio de sesión y operaciones protegidas
Los fragmentos siguientes usan la función de conexión copiada en el paso anterior. email y password proceden de su interfaz de inicio de sesión; no escriba contraseñas en el código fuente ni en la configuración. export debe sustituirse por el nombre de una función que exista realmente en la política del plan.
Go
app, err := connectLaunch()
if err != nil { return err }
defer app.Close()
if _, err := app.Login(ctx, email, password); err != nil { return err }
return app.RunFeature("export", func() error {
return exportReport()
})
ctx usa el contexto del ciclo de vida de la aplicación; no deben cancelarse los heartbeats inmediatamente al terminar la solicitud de inicio de sesión. Ejecute las operaciones de red en un hilo de trabajo en segundo plano. Para recuperar, llame a Restore(ctx); para cerrar la sesión de la cuenta, a Logout(ctx); para liberar el dispositivo, a ReleaseDevice(ctx).
Python
with connect_launch() as app:
app.login(email, password)
result = app.run_feature("export", export_report)
restore() recupera una sesión segura existente; si no hay sesión, muestre la interfaz de inicio de sesión. logout() limpia la cuenta; release_device() libera explícitamente el dispositivo. No permita que las operaciones de red síncronas bloqueen el bucle de eventos de la aplicación de escritorio.
C# / .NET
await using var app = LaunchConnection.Open();
await app.Login(email, password);
await app.RunFeature("export", async () => {
await ExportReport();
});
Use await Restore(), await Logout() y await ReleaseDevice(). Mantenga activo el ciclo de vida del SDK mientras se ejecuta la aplicación y use procedimientos de interfaz asíncronos.
Java
try (var app = LaunchConnection.open()) {
app.login(email, passwordChars);
app.runFeature("export", () -> exportReport());
}
La contraseña usa char[]. Si no hay sesión, restore() devuelve el error NO_SESSION y debe mostrarse la interfaz de inicio de sesión; los demás errores no pueden considerarse una autorización. logout() y releaseDevice() son operaciones distintas. try-with-resources se encarga del cierre.
JavaScript / Node.js / TypeScript
const app = connectLaunch();
try {
await app.login(email, password);
const result = await app.runFeature('export', () => exportReport());
} finally {
await app.close();
}
restore() devuelve null cuando no hay sesión; las operaciones de negocio solo se permiten después de una recuperación correcta. El valor booleano devuelto por logout() indica si se ha confirmado el cierre de sesión remoto; si falla la liberación del dispositivo, debe mostrarse un error. El código se ejecuta en Node.js, el proceso principal de Electron o un backend de confianza; el navegador y el proceso de renderizado de Electron no guardan credenciales de autorización.
Rust
let mut app = connect_launch()?;
app.login(&email, &password)?;
let result = app.run_feature("export", || {
export_report()?;
Ok(())
})?;
app.close();
El callback devuelve Result<T, Failure>. restore(), logout() y release_device() devuelven resultados y los errores deben gestionarse. Drop también cierra el entorno de ejecución. Por defecto, build.rs compila y enlaza el núcleo nativo; no es necesario enlazar el SDK oficial manualmente.
Ruby
app = connect_launch
begin
app.login(email, password)
result = app.run_feature('export') { export_report }
ensure
app.close
end
restore recupera la sesión, logout cierra la sesión de la cuenta y release_device libera el dispositivo. Use un bloque de código para las operaciones protegidas; las excepciones no deben convertirse en resultados correctos.
C
static int export_action(void *context) {
return export_report(context); /* Return 1 only on success. */
}
launch_application *app = connect_launch();
if (!app) return 0;
int ok = launch_application_login(app, email, password);
if (ok) ok = launch_application_run_feature(app, "export", export_action, context);
/* Check launch_application_error(app) on failure; never log credentials. */
launch_application_close(app);
return ok;
launch_application_restore tiene tres estados: 1 recuperado, 0 sin sesión y -1 error. Solo la ausencia de sesión debe mostrar normalmente el inicio de sesión; un rechazo o una excepción no deben considerarse un éxito. También deben comprobarse los valores devueltos por logout y release_device.
CMake solo importa Launch:
find_package(LicentivoLaunch CONFIG REQUIRED)
add_executable(myapp main.c)
licentivo_launch_link(myapp)
C++
auto app = connectLaunch();
app.Login(email.c_str(), password.c_str());
app.RunFeature("export", [&] { exportReport(); });
Restore(), Logout() y ReleaseDevice() siguen la semántica de excepciones de C++. El destructor RAII se encarga del cierre. CMake usa licentivo_launch_link(myapp CXX); Launch gestiona automáticamente el enlace del SDK y las bibliotecas de ejecución incluidas en el paquete de distribución.
Ciclo de vida, almacenamiento seguro y errores
Crear un objeto de conexión solo completa la inicialización. El programa debe iniciar sesión o recuperar la sesión correctamente y usar un callback de protección de funciones en cada operación de negocio. Un pedido pagado, una sesión existente o un botón habilitado no sustituyen la verificación del SDK.
Por defecto, las sesiones solo se guardan en memoria. Recordar el inicio de sesión requiere almacenamiento seguro: Go, Python, C# y C/C++ nativos ofrecen DPAPI del usuario actual de Windows; Java, Node, Rust y Ruby ofrecen almacenamiento AES-GCM con una clave del llamante. Las aplicaciones multiplataforma deben integrarse con el almacén de credenciales del sistema. No guarde la clave y el texto cifrado en el mismo directorio normal.
El cierre normal conserva las sesiones que el usuario ha elegido recordar y detiene el entorno de ejecución. El cierre de sesión de la cuenta llama primero al cierre de sesión unificado del SDK oficial y limpia después los registros propios de la cuenta de Launch. ReleaseDevice es un punto de entrada compatible del mismo procedimiento; si la revocación remota sigue pendiente, no debe indicarse que la liberación ha terminado correctamente. No limpie el directorio de caché del SDK oficial ni sus registros de recuperación del cierre de sesión. La protección de sesiones de Launch no implica que todos los archivos de dispositivos del SDK oficial estén cifrados; deben limitarse los permisos del directorio de caché.
| Estado | Gestión del programa |
|---|---|
| Error de cuenta o contraseña | Mostrar un error de inicio de sesión genérico, sin revelar si existe la cuenta |
| EMAIL_VERIFICATION_REQUIRED | Guiar al usuario para verificar el correo de la tienda |
| ENTITLEMENT_PENDING | Mostrar que la sincronización está en curso y esperar según los reintentos limitados del paquete y Retry-After |
| ENTITLEMENT_NOT_PURCHASED | Guiar al usuario para comprar o cambiar de cuenta |
| ENTITLEMENT_EXPIRED | Guiar al usuario para renovar; no usar credenciales antiguas para eludir el rechazo |
| ENTITLEMENT_SUSPENDED | Detener las funciones protegidas y contactar con el comerciante |
| Límite de dispositivos alcanzado | Guiar al usuario para gestionar o liberar explícitamente dispositivos |
| Red/HTTP 5xx | Solo se pueden usar autorizaciones sin conexión verificadas por el SDK y aún vigentes |
Las respuestas explícitas 401/403/404, la cuenta incorrecta, la cancelación o los límites de frecuencia no deben convertirse en autorizaciones sin conexión correctas. La primera activación y las políticas que prohíben el uso sin conexión siguen necesitando red. Si no se puede acceder al dominio/IP del servidor, debe mostrarse un problema de conexión; no se debe conectar a otros sitios sin aviso.
Pruebas de aceptación y referencias
Verifique el inicio de sesión real, la autorización de la cuenta correspondiente, las operaciones protegidas, la recuperación tras reiniciar, la autorización sin conexión válida y su vencimiento, la manipulación de la caché, el cierre de sesión, el cambio de cuenta y la liberación de dispositivos. Este documento no requiere usar IA. Consulte las herramientas de prueba y los límites de aceptación externa en acceptance.md; los paquetes locales y las instrucciones de compilación están en integration-packages.md.
Las comprobaciones de configuración, la generación de código y las pruebas locales no demuestran automáticamente que los pagos reales, la emisión de autorizaciones o la activación en el sitio oficial hayan terminado correctamente. Las tiendas externas y las sandbox de pago deben configurarse y someterse a aceptación por separado.