Instalación
npm install @xpayr/extension-kit
# or copy src/index.js into your extension —
# zero dependencies, no build step, MV3-ready
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.
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.
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.
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.
npm install @xpayr/extension-kit
# or copy src/index.js into your extension —
# zero dependencies, no build step, MV3-ready
{
"manifest_version": 3,
"permissions": ["storage", "alarms"],
"externally_connectable": { "matches": ["https://xpayr.com/*"] }
}
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');
});
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}.
| 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. |
| 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. |
¿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.
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 $)
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. |
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`).
{
"name": "xpayr_issue_wallet_license",
"arguments": {
"product_id": "prod_my_extension",
"buyer_wallet": "0x71C...89A",
"plan": "lifetime",
"tx_hash": "0x9f8e...3b2a"
}
}
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.
<!-- 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>
| ExtensionPay | Kit 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.
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.