npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

tb-pay

v1.1.5

Published

Pay module to extend ToroBack functionality

Readme

tb-pay

Módulo que ofrece servicios de pagos. Para ello utiliza servicios de terceros ofrecidos a través de distintos módulos.

Instalación:

Para utilizar los servicios de pago es necesario tener instalada la librería tb-pay junto con la librería del servicio que se vaya a utilizar, como por ejemplo tb-pay-payoneer, y tener una cuenta creada para dicho servicio.

Además es importante inicializar la librería en el archivo "boot.js" dentro de app para que estén disponibles los distintos modelos que ofrece el módulo. Para ello incluir la siguiente linea de código dentro de la función Boot:

App.pay.init();

Configuración del servicio:

- Servicios disponibles:

Para poder utilizar un servicio se utilizarán los identificadores de cada uno de ellos.

Los servicios disponibles para pagos son:

Los servicios disponibles para cobros son:

- Configuración desde interfaz administrativa:

Por el momento la opción de configuración a través de la interfaz de administración no está disponible.

- Configuración manual:

La configuración manual se realiza sobre una colección en la base de datos llamada "tb.configs".

Para ello hay que añadir un nuevo documento cuyo id sea el "payOptions" (Ej. "_id":"payOptions"). Dicho documento debe tener un objeto para cada uno de los servicios que se quiera configurar cuya clave sea el identificador del servicio.

- Configuración del servicio Payoneer:

Para configurar Payoneer se requerirán los siguientes campos:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |url|String||Url base del api del servicio| |username|String||Usuario del servicio| |password|String||Contraseña de acceso al servicio| |programs|Array||Array con los distintos programas configurados para el servicio| |programs.id|String||Identificador en el servicio para el programa| |programs.currency|String||Moneda configurada para el programa. ISO-4217 (alpha 3 currency)|

Un ejemplo de configuración del servicio Payoneer sería el siguiente:

{
    "_id" : "payOptions",
    "payoneer" : {
        "url" : "https://api.sandbox.payoneer.com/v2/programs",
        "username" : <myServiceUsername>,
        "password" : <myServicePassword>,
        "programs" : [ 
            {
                "id" : "100094XXX",
                "currency" : "USD"
            }
        ]
    }
}

- Configuración del servicio Stripe:

Para configurar Stripe se requerirán los siguientes campos:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |apiKey|String||Apikey privada proporcionada por el servicio|

Un ejemplo de configuración del servicio Payoneer sería el siguiente:

{
    "_id" : "payOptions",
    "stripe" : {
        "apiKey" : <myPrivateApiKey>
    }
}

Funcionalidades

- Obtener de link de registro/login:

Disponible para los servicios: Payoneer

• REST Api:

Petición:

|HTTP Method|URL| |:---:|:---| |GET| https://[domain]:[port]/api/v[apiVersion]/srv/pay/registrationlink/:service/:uid?login=<forLogin>|

Parámetros en la ruta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Servicio de pago a utilizar (valores: payoneer)| |uid|String||Id del usuario para el que se va a pedir el link|

Parámetros del query:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |login|boolean|X|true para indicar que el link será para realizar login. Por defecto es false| |redirectUrl|String|X|Url de redirección tras registrarse en el servicio| |redirectTime|Number|X|Tiempo entre que se realiza el registro y el redirect. En segundos. Default es 10 segundos|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |url|String||La url solicidata|

Ejemplo:

GET: https://a2server.a2system.net:1234/api/v1/srv/pay/registrationlink/payoneer/58ad3fe33e13466beefe91e2?login=false&redirectUrl=www.google.com

  • RESPUESTA:
  {
    "url": "https://payouts.sandbox.payoneer.com/partners/lp.aspx?token=6b8d1e788973496239438e81aee28ea4329DCC0A38"
  }

• Código Javascript:

Parámetros:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Identificador del servicio a utilizar (Ej: "payoneer")| |uid|String||Identificador del usuario para el que se pedirá el link| |forLogin|Boolean||Flag que indica si el link será pedido para realizar login o registro. Por defecto es false| |redirectUrl|String|X|Url de redirección tras registrarse en el servicio| |redirectTime|Number|X|Tiempo entre que se realiza el registro y el redirect. En segundos. Default es 10 segundos|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |url|String||La url solicidata|

Ejemplo:

var service = "payoneer";

var forLogin = true; //Se pide link para login. false si se quiere para registro
var uid = <myUserId> //Identificador del usuario para el que se pide el link

//Datos opcionales 
let data = {
  redirectUrl: <myRedirectUrl>,
  redirectTime: <myRedirectTimeInSeconds>
}

//Opcion 1 : obteniendo un objeto cliente para el servicio.
App.pay.forService(service)
  .then(client => client.createRegistrationLink(uid, data, forLogin));
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

//Opcion 2 : Sin obtener instancia del cliente del servicio. (Se instancia internamente)
App.pay.createRegistrationLink(service, uid, data, forLogin)
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

Ejemplo Respuesta:

{
  "url": "https://payouts.sandbox.payoneer.com/partners/lp.aspx?token=6b8d1e788973496239438e81aee28ea4329DCC0A38"
}

• Modificacion de parámetros:

Al solicitar el link de registro/login se puede pasar información adicional para que aparezca autocompletada en la página web. Para ello se puede configurar un hook para modificar los parámetros que se enviarán en la consulta al servicio.

Ver sección Hooks -> Modificacion de parámetros de petición de enlace de registro

- Realizar un pago:

Disponible para los servicios: Payoneer

• REST Api:

No disponible.

• Código Javascript:

Parámetros:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Identificador del servicio a utilizar (Ej: "payoneer")| |data|Object||Información del pago que se va a realizar| |data.uid|String||Identificador del usuario al que se le realizará el pago| |data.amount|String||Cantidad que se va a pagar| |data.description|String|X|Descripción del pago| |data.currency|String||Moneda en la que se realiza el pago. ISO-4217 (alpha 3 currency)|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |transaction|tb.pay-transactions||Objeto con la información de la transacción|

Ejemplo:

var service = "payoneer";

var data = {
  "amount":"20.00",
  "currency": "USD",
  "description": "Test payout",
  "uid":<theUserId>
}

//Opcion 1 : obteniendo un objeto cliente para el servicio.
App.pay.forService(service)
  .then(client => client.payout(data));
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

//Opcion 2 : Sin obtener instancia del cliente del servicio. (Se instancia internamente)
App.pay.payout(service, data)
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

- Realizar un cobro:

Disponible para los servicios: Stripe

Charge a user (tb.pay-transactions: in), from a stored account or with a token

• REST Api:

|HTTP Method|URL| |:---:|:---| |POST| https://[domain]:[port]/api/v[apiVersion]/srv/pay/charge/:service|

Parámetros en la ruta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Servicio de pago para realizar el cobro (valores: stripe)|

Parámetros del body:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |uid|String||toroback user _id| |amount|Number||amount to charge. Para ver la cantidad minima ver la documentacion: https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts| |currency|String||currency of amount. ISO| |paid|String|X|tb.pay-account _id (required if token is undefined)| |token|String|X|token representing a temporary account. depends on service (required if paid is undefined)| |store|Bool|X|store token as a new account for this user. needs token. default: false| |description|String|X|description for this charge. shown to user in receipt| |statementDescription|String|X|description for this charge. shown to user in credit card statement. max: 22 characters (on stripe)|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |transaction|tb.pay-transactions||Objeto con la información de la transacción|

- Ejemplo REST 1: Cobro con token sin creación de cuenta

POST: https://a2server.a2system.net:1234/api/v1/srv/pay/charge/stripe

Body:

{
  "uid": "59c43f31aeXX437956fffX2e",
  "amount": 0.39,
  "currency": "USD",
  "token": "tok_1CqjooG5RtxSooBrAUdVWn0K",
  "store": false, //False para no crear cuenta
  "description": "My receipt description",
  "statementDescription": "My card statement description"
}
- Ejemplo REST 2: Cobro con token con creación de cuenta

POST: https://a2server.a2system.net:1234/api/v1/srv/pay/charge/stripe

Body:

{
  "uid": "59c43f31aeXX437956fffX2e",
  "amount": 0.39,
  "currency": "USD",
  "token": "tok_1CqjooG5RtxSooBrAUdVWn0K",
  "store": true, //True para crear cuenta
  "description": "My receipt description",
  "statementDescription": "My card statement description"
}
- Ejemplo REST 3: Cobro a cuenta

POST: https://a2server.a2system.net:1234/api/v1/srv/pay/charge/stripe

Body:

{
  "uid": "59c43f31aeXX437956fffX2e",
  "amount": 0.39,
  "currency": "USD",
  "paid":"5b54a20af7bde109c8c0e0e2",
  "description": "My receipt description",
  "statementDescription": "My card statement description"
}

• Código Javascript:

Parámetros:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Identificador del servicio a utilizar (Ej: "stripe")| |data|Object||Información del cobro que se va a realizar| |data.uid|String||toroback user _id| |data.amount|Number||amount to charge. Para ver la cantidad minima ver la documentacion: https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts| |data.currency|String||currency of amount. ISO| |data.paid|String|X|tb.pay-account _id (required if token is undefined)| |data.token|String|X|token representing a temporary account. depends on service (required if paid is undefined)| |data.store|Bool|X|store token as a new account for this user. needs token. default: false| |data.description|String|X|description for this charge. shown to user in receipt| |data.statementDescription|String|X|description for this charge. shown to user in credit card statement. max: 22 characters (on stripe)|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |transaction|tb.pay-transactions||Objeto con la información de la transacción|

Ejemplo:

var service = "stripe";

var data = {
  "uid": "59c43f31aeXX437956fffX2e",
  "amount": 0.39,
  "currency": "USD",
  "token": "tok_1CqjooG5RtxSooBrAUdVWn0K",
  "store": false, //False para no crear cuenta
  "description": "My receipt description",
  "statementDescription": "My card statement description"
}

//Opcion 1 : obteniendo un objeto cliente para el servicio.
App.pay.forService(service)
  .then(client => client.charge(data));
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

//Opcion 2 : Sin obtener instancia del cliente del servicio. (Se instancia internamente)
App.pay.charge(service, data)
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

- Obtener balance del servicio:

Disponible para los servicios: Payoneer, Stripe

• REST Api:

Petición:

|HTTP Method|URL| |:---:|:---| |GET| https://[domain]:[port]/api/v[apiVersion]/srv/pay/balance/:service|

Parámetros en la ruta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Servicio de pago a utilizar (valores: payoneer, stripe)|

Parámetros del query:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |programId|String||Solo para Payoneer. Identificador del programa para el que se quiere obtener el balance|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Servicio para el que se pidió el balance| |balance|Object||Objeto con la informacion del balance| |balance.amount|Number||Cantitad del balance| |balance.currency|String||Moneda del balance| |data|Object||Objeto con información específica para cada servicio|

Ejemplo:

GET: https://a2server.a2system.net:1234/api/v1/srv/pay/balance/payoneer?programId=123456789

  • RESPUESTA:
  {
  "data": {
    "audit_id": 42874167,
    "code": 0,
    "description": "Success",
    "balance": 19669.36,
    "currency": "USD",
    "fees_due": 0,
    "programId": "123456789"
  },
  "balance": {
    "amount": 19669.36,
    "currency": "USD"
  },
  "service": "payoneer"
}

• Código Javascript:

Parámetros:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Identificador del servicio a utilizar (Ej: "payoneer")| |data|Object||Información del pago que se va a realizar| |data.programId|String||Solo para Payoneer. Identificador del programa para el que se quiere obtener el balance|

Respuesta:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |service|String||Servicio para el que se pidió el balance| |balance|Object||Objeto con la informacion del balance| |balance.amount|Number||Cantitad del balance| |balance.currency|String||Moneda del balance| |data|Object||Objeto con información específica para cada servicio|

{ "data": { "audit_id": 42875167, "code": 0, "description": "Success", "balance": 19669.36, "currency": "USD", "fees_due": 0, "programId": "100094640" }, "balance": { "amount": 19669.36, "currency": "USD" }, "service": "payoneer" } Ejemplo:

var service = "payoneer";

var data = {
  "programId":"123456789"
}

//Opcion 1 : obteniendo un objeto cliente para el servicio.
App.pay.forService(service)
  .then(client => client.getBalance(data));
  .then(resp => console.log(resp))
  .catch(err => console.log(err));

//Opcion 2 : Sin obtener instancia del cliente del servicio. (Se instancia internamente)
App.pay.getBalance(service, data)
  .then(resp => console.log(resp))
  .catch(err => console.log(err));
  • RESPUESTA:
  {
  "data": {
    "audit_id": 42874167,
    "code": 0,
    "description": "Success",
    "balance": 19669.36,
    "currency": "USD",
    "fees_due": 0,
    "programId": "123456789"
  },
  "balance": {
    "amount": 19669.36,
    "currency": "USD"
  },
  "service": "payoneer"
}

Hooks

El módulo dispone de algunas funciones a las que se le puede añadir hooks para modificar la información o para conocer que algún documento cambió.

Para añadir un hook se basta con configurarlo de la siguiente manera, por ejemplo en la función Boot() del archivo boot.js:

  App.pay.post(theHookedFunction, function(...args){
    //...
    // manejar hook
    //...
  });

A continuación se detallarán las distintas funciones a las que se puede añadir un hook.

• Modificacion de parámetros de petición de enlace de registro:

NOTA: Hook relacionado con Funcionalidades -> Obtener de link de registro/login

Al solicitar el link de registro/login se puede pasar información adicional para que aparezca autocompletada en la página web. Para ello se puede configurar un hook para modificar los parámetros que se enviarán en la consulta al servicio.

Dicho hook se debe realizar a la función "prepareRequestLinkPayload" y se puede configurar, por ejemplo, en el momento de inicialización del módulo en el archivo "boot.js", de la siguiente manera:

  App.pay.post("prepareRequestLinkPayload", function(data, res,  next){
    //...
    //se modifica el objeto res para añadir/modificar los valores 
    //...
    next(res);
  });

Los parámetros que se pueden enviar en la peticion del link son los siguientes:

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |uid|String||Identificador del usuario| |sessionId|String|X|Identificador de la sesión para la petición| |languageId|Number|X|Id de idioma del landing site. Por ahora ver documentacion del servicio| |redirectUrl|String|X|Url de redireccionamiento tras registro| |redirectTime|String|X|Tiempo entre que se realiza el registro y que el usuario es redirigido| |payoutMethods|Array|X|(Solo para link de registro) Lista de metodos disponibles para el registro. Values: ("PREPAID_CARD", "BANK","PAYPAL" and "PAPER_CHECK")| |registrationMode|String|X|(Solo para link de registro) “LIMITED” registration mode is supported for accounts that are linked to a local bank account. In this mode, the payee is prompted to fill in minimal details to receive payment. Permitted values: “FULL”, “LIMITED”| |lockType|String|X|(Solo para link de registro) Enables locking some or all pre-populated fields from being edited by the payee while he completes registration forms Permitted values: “NONE”, “ALL”, “ADDRESS”, “NAMES”, “EMAIL”, “NAME_ADDRESS_EMAIL”, “DATE_OF_BIRTH”, “ALL_NAMES”, “ALL_NAMES_ADDRESS_EMAIL”| |payee|Object|X|(Solo para link de registro) Objeto con la información del receptor del pago| |payee.type|String|X|Tipo del receptor (Values: "INDIVIDUAL", "COMPANY")| |payee.company|Object|X|Objeto con información de compañia si type es "COMPANY"| |payee.company.legalType|String|X|Type of legal entity Permitted values: “PUBLIC”, “PRIVATE”, “SOLE PROPRIETORSHIP”, “LLC”, “LLP”, “NON PROFIT”| |payee.company.name|String|X|Nombre de la compañia| |payee.company.url|String|X|Link al website de la compañia| |payee.company.incorporatedCountry|String|X|País de la compañia| |payee.company.incorporatedState|String|X|Estado de la compañia| |payee.contact|Object|X|Objeto con información de contacto si type es "INDIVIDUAL"| |payee.contact.firstName|String|X|Nombre del contacto| |payee.contact.lastName|String|X|Apellido del contacto| |payee.contact.email|String|X|Email del contacto| |payee.contact.birthDate|String|X|Fecha de nacimiento del contacto (Formato : YYYY-MM-DD)| |payee.contact.mobile|String|X|Número de movil del contacto| |payee.contact.phone|String|X|Telefono fijo del contacto| |payee.address|Object|X|Dirección de la compañia o del contacto| |payee.address.country|String|X|Pais| |payee.address.state|String|X|Estado| |payee.address.addressLine1|String|X|First address line| |payee.address.addressLine2|String|X|Second address line| |payee.address.city|String|X|Ciudad| |payee.address.zipCode|String|X|Código postal|

EJEMPLO

El siguiente ejemplo modifica el nombre y el apellido del contacto y añade una dirección

  App.pay.post("prepareRequestLinkPayload", function(data, res,  next){
    res.payee.contact.firstName = usersLoadedFirstName;
    res.payee.contact.lastName = usersLoadedLastName;
    res.payee.address = {
      country: "US",
      state:"NY"
    }
    next(res);
  });

• Evento de modificación de un objeto tb.pay-transactions:

Para recibir un evento cada vez que sea actualizado un objeto 'tb.pay-transactions' basta con añadir un hook.

Dicho hook se debe realizar a la función transactionUpdated y se puede configurar, por ejemplo, en el momento de inicialización del módulo en el archivo "boot.js", de la siguiente manera:

  App.pay.post("transactionUpdated", function(doc){
    //...
    //Manejar evento de transacción modificada
    //...
  });

Modelos

tb.pay-accounts

Modelo de datos que contiene información sobre una cuenta de pago

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |uid|ObjectId||uid Owner user id (a2s.users)| |service|String||Service type (payoneer, paypal, etc...)| |originalRequest|Object|X|Original request made by client when creating the account| |status|String||Account status| |statusLog|Array||status change logging| |statusLog.status|String||Account status| |statusLog.cDate|Date||Account status change timestamp| |sUserId|String||Service user id (internal reference from service)| |sAccountId|String||Account id (internal reference from service)| |originalResponse|Object|X|Original response received by client when creating the account| |data|Object|X|Specific data from that needs to be kept| |data.programId|String|X|(SOLO PAYONEER) Program id for service| |data.type|String|X|(SOLO STRIPE) Transaction account type| |data.brand|String|X|(SOLO STRIPE) If type is 'card'. Card brand| |data.country|String|X|(SOLO STRIPE) If type is 'card'. Card country| |data.endsIn|String|X|(SOLO STRIPE) If type is 'card'. Last 4 digits of Card number | |data.expires|String|X|(SOLO STRIPE) If type is 'card'. Card expiration (format: "mmdd")|

tb.pay-transactions

Modelo de datos que contiene información sobre una transacción

| Clave | Tipo | Opcional | Descripción | |---|---|:---:|---| |direction|String||Transaction direction: incoming or outgoing| |service|String||Service type (payoneer, paypal, etc...)| |uid|ObjectId||User id (a2s.users) owner of this transaction| |paid|ObjectId||Reference to account (tb.pay-account _id)| |amount|String||Amount to transfer| |currency|String||ISO-4217 (alpha 3 currency)| |description|String|X|Some optional description| |originalRequest|Object|X|Original request made by client when creating the account| |status|String||Transaction status| |statusLog|Array||Status change logging| |statusLog.status|String||Account status| |statusLog.cDate|Date||Account status change timestamp| |sTransId|String||Service transaction id (internal reference from service)| |originalResponse|Object|X|Original response received by client when creating the account| |data|Object|X|Specific data from that needs to be kept|