1.1.5 • Published 6 years ago

tb-pay v1.1.5

Weekly downloads
2
License
ISC
Repository
github
Last release
6 years ago

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:

ClaveTipoOpcionalDescripción
urlStringUrl base del api del servicio
usernameStringUsuario del servicio
passwordStringContraseña de acceso al servicio
programsArrayArray con los distintos programas configurados para el servicio
programs.idStringIdentificador en el servicio para el programa
programs.currencyStringMoneda 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:

ClaveTipoOpcionalDescripción
apiKeyStringApikey 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 MethodURL
GEThttps://[domain]:[port]/api/v[apiVersion]/srv/pay/registrationlink/:service/:uid?login=<forLogin>

Parámetros en la ruta:

ClaveTipoOpcionalDescripción
serviceStringServicio de pago a utilizar (valores: payoneer)
uidStringId del usuario para el que se va a pedir el link

Parámetros del query:

ClaveTipoOpcionalDescripción
loginbooleanXtrue para indicar que el link será para realizar login. Por defecto es false
redirectUrlStringXUrl de redirección tras registrarse en el servicio
redirectTimeNumberXTiempo entre que se realiza el registro y el redirect. En segundos. Default es 10 segundos

Respuesta:

ClaveTipoOpcionalDescripción
urlStringLa 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:

ClaveTipoOpcionalDescripción
serviceStringIdentificador del servicio a utilizar (Ej: "payoneer")
uidStringIdentificador del usuario para el que se pedirá el link
forLoginBooleanFlag que indica si el link será pedido para realizar login o registro. Por defecto es false
redirectUrlStringXUrl de redirección tras registrarse en el servicio
redirectTimeNumberXTiempo entre que se realiza el registro y el redirect. En segundos. Default es 10 segundos

Respuesta:

ClaveTipoOpcionalDescripción
urlStringLa 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:

ClaveTipoOpcionalDescripción
serviceStringIdentificador del servicio a utilizar (Ej: "payoneer")
dataObjectInformación del pago que se va a realizar
data.uidStringIdentificador del usuario al que se le realizará el pago
data.amountStringCantidad que se va a pagar
data.descriptionStringXDescripción del pago
data.currencyStringMoneda en la que se realiza el pago. ISO-4217 (alpha 3 currency)

Respuesta:

ClaveTipoOpcionalDescripción
transactiontb.pay-transactionsObjeto 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 MethodURL
POSThttps://[domain]:[port]/api/v[apiVersion]/srv/pay/charge/:service

Parámetros en la ruta:

ClaveTipoOpcionalDescripción
serviceStringServicio de pago para realizar el cobro (valores: stripe)

Parámetros del body:

ClaveTipoOpcionalDescripción
uidStringtoroback user _id
amountNumberamount to charge. Para ver la cantidad minima ver la documentacion: https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts
currencyStringcurrency of amount. ISO
paidStringXtb.pay-account _id (required if token is undefined)
tokenStringXtoken representing a temporary account. depends on service (required if paid is undefined)
storeBoolXstore token as a new account for this user. needs token. default: false
descriptionStringXdescription for this charge. shown to user in receipt
statementDescriptionStringXdescription for this charge. shown to user in credit card statement. max: 22 characters (on stripe)

Respuesta:

ClaveTipoOpcionalDescripción
transactiontb.pay-transactionsObjeto 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:

ClaveTipoOpcionalDescripción
serviceStringIdentificador del servicio a utilizar (Ej: "stripe")
dataObjectInformación del cobro que se va a realizar
data.uidStringtoroback user _id
data.amountNumberamount to charge. Para ver la cantidad minima ver la documentacion: https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts
data.currencyStringcurrency of amount. ISO
data.paidStringXtb.pay-account _id (required if token is undefined)
data.tokenStringXtoken representing a temporary account. depends on service (required if paid is undefined)
data.storeBoolXstore token as a new account for this user. needs token. default: false
data.descriptionStringXdescription for this charge. shown to user in receipt
data.statementDescriptionStringXdescription for this charge. shown to user in credit card statement. max: 22 characters (on stripe)

Respuesta:

ClaveTipoOpcionalDescripción
transactiontb.pay-transactionsObjeto 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 MethodURL
GEThttps://[domain]:[port]/api/v[apiVersion]/srv/pay/balance/:service

Parámetros en la ruta:

ClaveTipoOpcionalDescripción
serviceStringServicio de pago a utilizar (valores: payoneer, stripe)

Parámetros del query:

ClaveTipoOpcionalDescripción
programIdStringSolo para Payoneer. Identificador del programa para el que se quiere obtener el balance

Respuesta:

ClaveTipoOpcionalDescripción
serviceStringServicio para el que se pidió el balance
balanceObjectObjeto con la informacion del balance
balance.amountNumberCantitad del balance
balance.currencyStringMoneda del balance
dataObjectObjeto 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:

ClaveTipoOpcionalDescripción
serviceStringIdentificador del servicio a utilizar (Ej: "payoneer")
dataObjectInformación del pago que se va a realizar
data.programIdStringSolo para Payoneer. Identificador del programa para el que se quiere obtener el balance

Respuesta:

ClaveTipoOpcionalDescripción
serviceStringServicio para el que se pidió el balance
balanceObjectObjeto con la informacion del balance
balance.amountNumberCantitad del balance
balance.currencyStringMoneda del balance
dataObjectObjeto 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:

ClaveTipoOpcionalDescripción
uidStringIdentificador del usuario
sessionIdStringXIdentificador de la sesión para la petición
languageIdNumberXId de idioma del landing site. Por ahora ver documentacion del servicio
redirectUrlStringXUrl de redireccionamiento tras registro
redirectTimeStringXTiempo entre que se realiza el registro y que el usuario es redirigido
payoutMethodsArrayX(Solo para link de registro) Lista de metodos disponibles para el registro. Values: ("PREPAID_CARD", "BANK","PAYPAL" and "PAPER_CHECK")
registrationModeStringX(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”
lockTypeStringX(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”
payeeObjectX(Solo para link de registro) Objeto con la información del receptor del pago
payee.typeStringXTipo del receptor (Values: "INDIVIDUAL", "COMPANY")
payee.companyObjectXObjeto con información de compañia si type es "COMPANY"
payee.company.legalTypeStringXType of legal entity Permitted values: “PUBLIC”, “PRIVATE”, “SOLE PROPRIETORSHIP”, “LLC”, “LLP”, “NON PROFIT”
payee.company.nameStringXNombre de la compañia
payee.company.urlStringXLink al website de la compañia
payee.company.incorporatedCountryStringXPaís de la compañia
payee.company.incorporatedStateStringXEstado de la compañia
payee.contactObjectXObjeto con información de contacto si type es "INDIVIDUAL"
payee.contact.firstNameStringXNombre del contacto
payee.contact.lastNameStringXApellido del contacto
payee.contact.emailStringXEmail del contacto
payee.contact.birthDateStringXFecha de nacimiento del contacto (Formato : YYYY-MM-DD)
payee.contact.mobileStringXNúmero de movil del contacto
payee.contact.phoneStringXTelefono fijo del contacto
payee.addressObjectXDirección de la compañia o del contacto
payee.address.countryStringXPais
payee.address.stateStringXEstado
payee.address.addressLine1StringXFirst address line
payee.address.addressLine2StringXSecond address line
payee.address.cityStringXCiudad
payee.address.zipCodeStringXCó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

ClaveTipoOpcionalDescripción
uidObjectIduid Owner user id (a2s.users)
serviceStringService type (payoneer, paypal, etc...)
originalRequestObjectXOriginal request made by client when creating the account
statusStringAccount status
statusLogArraystatus change logging
statusLog.statusStringAccount status
statusLog.cDateDateAccount status change timestamp
sUserIdStringService user id (internal reference from service)
sAccountIdStringAccount id (internal reference from service)
originalResponseObjectXOriginal response received by client when creating the account
dataObjectXSpecific data from that needs to be kept
data.programIdStringX(SOLO PAYONEER) Program id for service
data.typeStringX(SOLO STRIPE) Transaction account type
data.brandStringX(SOLO STRIPE) If type is 'card'. Card brand
data.countryStringX(SOLO STRIPE) If type is 'card'. Card country
data.endsInStringX(SOLO STRIPE) If type is 'card'. Last 4 digits of Card number
data.expiresStringX(SOLO STRIPE) If type is 'card'. Card expiration (format: "mmdd")

tb.pay-transactions

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

ClaveTipoOpcionalDescripción
directionStringTransaction direction: incoming or outgoing
serviceStringService type (payoneer, paypal, etc...)
uidObjectIdUser id (a2s.users) owner of this transaction
paidObjectIdReference to account (tb.pay-account _id)
amountStringAmount to transfer
currencyStringISO-4217 (alpha 3 currency)
descriptionStringXSome optional description
originalRequestObjectXOriginal request made by client when creating the account
statusStringTransaction status
statusLogArrayStatus change logging
statusLog.statusStringAccount status
statusLog.cDateDateAccount status change timestamp
sTransIdStringService transaction id (internal reference from service)
originalResponseObjectXOriginal response received by client when creating the account
dataObjectXSpecific data from that needs to be kept
1.1.5

6 years ago

1.1.4

6 years ago

1.1.3

6 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago