Licencias nativas en cripto

La licencia es la cartera.

Vende una extensión de navegador, un plugin o una app de escritorio con cripto sin montar un sistema de cuentas. El comprador paga desde su cartera, y esa cartera es la licencia: desbloquea cualquier otro dispositivo firmando un mensaje gratuito. Sin correo, sin claves que perder, sin contracargos.

Por qué existe

Los pagos de Chrome Web Store cerraron en febrero de 2021, así que todo desarrollador de extensiones necesita una capa de pago externa. La opción líder exige una cuenta de Stripe, lo que deja fuera por completo a desarrolladores de Turquía, Pakistán, Nigeria, Bangladés, Indonesia, Egipto y muchos otros países.

Las pasarelas de pago cripto se detienen en "pago recibido". Te dan un webhook, no una licencia: sin registro de derechos, sin SDK, sin verificación entre dispositivos. Acabas construyendo tú la mitad difícil. Este kit es esa mitad.

Comparativa

                        ExtensionPay   Paddle / LS   Pasarelas cripto  XPayr Kit
comision                5% + Stripe    5% + 50c      0.5-1%            2.9% flat
sin Stripe              no             parcial       si                si
capa de licencia        si             parcial       no                si
contracargos            si             si            ninguno           ninguno
comerciante regis.      no             si            no                no

No somos comerciante registrado: tú declaras tus impuestos. Eso es lo que compra la comisión más alta de Paddle y Lemon Squeezy, y es una contrapartida real que conviene entender antes de elegir.

Inicio rápido

Crea un producto en tu panel de comercio para obtener un código de producto y luego conecta el SDK. No hacen falta host_permissions, así que instalar tu extensión no muestra ninguna advertencia de acceso a datos.

Instalación

npm install @xpayr/extension-kit

# or copy src/index.js into your extension —
# zero dependencies, no build step, MV3-ready

manifest.json

{
  "manifest_version": 3,
  "permissions": ["storage", "alarms"],
  "externally_connectable": { "matches": ["https://xpayr.com/*"] }
}

background.js

import XPayrKit from '@xpayr/extension-kit';

const xpayr = XPayrKit('prod_my_extension');
xpayr.startBackground();          // required: token delivery + daily refresh

xpayr.onLicenseChanged.addListener(user => {
  console.log(user.licensed ? 'unlocked' : 'locked');
});

Bloquear una función

const user = await xpayr.getUser();

if (user.licensed) {
  enableProFeatures();
} else {
  showUpgradeButton(() => xpayr.openCheckout());
}

Esa es toda la integración. El flujo del comprador —elegir red, pagar, firmar, desbloquear— lo alojamos nosotros en xpayr.com/buy/{product_code}.

El objeto user

Campo Tipo Significado
licensed boolean Condiciona tus funciones a esto. Responde desde un token verificado localmente, así que es instantáneo y funciona sin conexión.
plan 'lifetime' | 'prepaid_year' | null El plan que compró el comprador.
wallet string | null La cartera a la que está vinculada la licencia: la que pagó.
paidAt Date | null Cuándo se emitió la licencia.
expiresAt Date | null Fecha de fin para planes con límite temporal; null en los vitalicios.
source 'cache' | 'network' De dónde vino esta respuesta.
staleSince Date | null Se establece cuando se opera con un token caducado dentro de la ventana de gracia offline de 30 días.

API

Método Descripción
startBackground() Llámalo una vez en tu service worker. Conecta la entrega del token y la alarma de refresco diario.
getUser() Comprobación de licencia offline-first. Verifica localmente el token ES256 en caché: sin ida y vuelta de red en la ruta crítica.
openCheckout() Abre el checkout alojado en una pestaña nueva. El comprador elige cualquier red y token que hayas habilitado.
openRestore() «Ya lo compré»: desbloquea otro dispositivo con una firma de cartera. Sin correo, sin clave de licencia.
refresh() Fuerza una revalidación online. Detecta reembolsos y revocaciones al instante.
getPlans() Información pública del producto: precio, tipo de plan, redes permitidas.
onLicenseChanged Se dispara cada vez que cambia el estado de la licencia.

Cómo funciona la verificación

  1. El comprador paga desde su cartera en el checkout alojado.
  2. XPayr registra el derecho contra la dirección de cartera que pagó.
  3. El comprador firma un mensaje gratuito y de un solo uso que prueba que controla esa cartera. No se mueve ningún fondo.
  4. XPayr devuelve un token firmado con ES256, limitado a tu producto y válido 7 días.
  5. Tu extensión verifica ese token localmente con WebCrypto en cada getUser() y lo renueva en silencio una vez al día.

¿Sin conexión un tiempo? La licencia sigue funcionando 30 días tras la caducidad del token y luego pasa a un bloqueo suave con aviso para reconectar: nadie se queda fuera a mitad de camino. ¿Reembolsaste a un cliente? Revócala en el panel: la renovación falla de inmediato y el token muere en 7 días.

Precios

Tus primeros 300 $ de ventas de licencias no pagan comisión alguna. Después es un 2,9% fijo, separado en la misma transacción on-chain del pago: no hay factura ni nada que cobrar después. Sin cuota fija, sin cuota mensual, sin contracargos. El gas de red es aparte y lo paga el comprador.

Licencia de 14 $, dentro del tramo gratis  ->  recibes 14,00 $Licencia de 14 $, tras el tramo gratis  ->  recibes 13,59 $  (comisión 0,41 $)

Ganchos web

Los webhooks son opcionales: el Kit emite y verifica licencias sin ningún backend de tu parte. Si quieres eventos en servidor, usan el mismo esquema de firma que cualquier otro webhook de XPayr (ver la guía de firmas) y se reintentan con espera creciente. Usa event_id para idempotencia.

Evento Cuándo
license.issued Un pago generó una licencia. Incluye la cartera, el código de producto, el plan y el hash de la transacción.
license.revoked Revocaste una licencia desde el panel, normalmente tras un reembolso.
payment.pending Se creó una sesión de pago.
payment.processing El pago está on-chain y espera confirmaciones.
payment.completed Pago verificado on-chain.
payment.failed La transacción enviada no se verificó contra la sesión.
payment.expired La sesión caducó sin pagarse.

Licenciamiento con Agentes IA y MCP (@xpayr/mcp-server)

Emite y gestiona licencias de software vinculadas a billetera con firma ES256 directamente desde Claude Desktop, Cursor, VS Code Copilot o agentes autónomos de soporte IA mediante el servidor oficial MCP de XPayr (`xpayr_issue_wallet_license`).

Invocación de Herramienta MCP (xpayr_issue_wallet_license)

{
  "name": "xpayr_issue_wallet_license",
  "arguments": {
    "product_id": "prod_my_extension",
    "buyer_wallet": "0x71C...89A",
    "plan": "lifetime",
    "tx_hash": "0x9f8e...3b2a"
  }
}

Insignias de Socio Verificado y Widget Incrustable de Calculadora de Comisiones

Incrusta insignias dinámicas SVG de confianza (partner-badge.php) o el widget sin dependencias de Calculadora de Comisión 0.5% y Ahorro (xpayr-fee-widget.js) en el README de tu extensión, portal de documentación o página de agencia.

Insignia SVG Dinámica de Socio y Calculadora Incrustable

<!-- Official Dynamic SVG Trust Badge -->
<a href="https://xpayr.com?utm_source=partner_badge" target="_blank" rel="noopener">
  <img src="https://xpayr.com/partner-badge.php?type=powered_by&theme=dark" alt="Powered by XPayr — 0.5% Non-Custodial Crypto Checkout" height="28">
</a>

<!-- Interactive 0.5% Fee & Savings Calculator Widget -->
<div data-xpayr-fee-widget data-volume="100000" data-invoice="250" data-rate="1.0"></div>
<script src="https://xpayr.com/public/sdk/xpayr-fee-widget.js" async></script>

Migrar desde ExtensionPay

ExtensionPayKit XPayr
ExtPay('extension-id') XPayrKit('prod_code')
extpay.startBackground() xpayr.startBackground()
user.paid user.licensed
user.email user.wallet
openPaymentPage() openCheckout()
openLoginPage() openRestore()
onPaid.addListener onLicenseChanged.addListener
getPlans() getPlans()

La única diferencia estructural es la identidad: ExtensionPay identifica al cliente por correo, el Kit lo identifica por cartera. Eso elimina el viaje de ida y vuelta del enlace mágico y significa que no se puede compartir una licencia sin compartir una cartera.

Limitaciones honestas

  • Las licencias del lado del cliente son un disuasorio, no DRM. Un usuario decidido puede parchear una comprobación local: cierto para todas las librerías de esta categoría, la nuestra incluida.
  • No somos comerciante registrado. Tú eres responsable de tu declaración de impuestos.
  • El comprador necesita una cartera. Para públicos cripto-nativos no es problema; para consumidores generales, mantén también una vía fiat.
  • Sin suscripciones por cargo automático. En cripto no hay tarjeta guardada, así que la v1 admite licencias vitalicias y anuales prepagadas.

Empezar

SDKs Oficiales en NPM (v0.2.0) y Servidor MCP Remoto

Integra Más Rápido con los Paquetes Oficiales de XPayr y MCP sin Instalación

Instala @xpayr/node-sdk (v0.2.0), @xpayr/payment-evidence (v0.2.0), @xpayr/extension-kit (v0.2.0)o @xpayr/mcp-server (v1.0.0) desde NPM, o ejecuta llamadas a herramientas JSON-RPC 2.0 en vivo mediante POST https://xpayr.com/api/mcp.

Playground MCP en Vivo (/tools/mcp-playground) Verificador de Licencias ES256 Simulador de políticas para agentes IA Probador de Webhooks HMAC-SHA256 mcp.xpayr.com docs.xpayr.com api-docs.xpayr.com