chilepay
Version:
Chilepay SDK module for Payments integration
229 lines (203 loc) • 7.18 kB
JavaScript
;
const request = require('request-promise-native');
const crypto = require('crypto');
const API_URL = 'https://api.chilepay.cl/';
const API_VERSION = 'dev';
class Chilepay {
/**
*
* @param {string} apiKey
* @param {string} secretKey
*/
constructor(apiKey, secretKey) {
if(!apiKey || !secretKey) {
throw new Error('publicKey and/or privateKey are missing');
}
this.apiKey = apiKey;
this.secretKey = secretKey;
}
getFees(plan) {
return this.get('fees', {
plan: plan || 'a'
});
}
/**
*
* @param initTransactionInput
*
* @param {string} initTransactionInput.type la pasarela de pago a usar. Valores posibles:
* - 'webpay' : Para pagos con tarjetas de crédito y débito bancarias con WebPay
* - 'khipu' : Para pagos con transferencias bancarias con Khipu
*
* @param {string} initTransactionInput.buyerEmail el email de quien está pagando. No es necesario que este
* email corresponda a una cuenta de Chilepay. Si el pago se realiza de forma exitosa se le enviará el comprobante
* a este email. Máximo 256 carácteres.
*
* @param {number} initTransactionInput.amount el monto de la transacción. Si initTransactionInput.currency
* es 'CLP', entonces debe ser un número entero (sino será rechazada).
*
* @param {string} initTransactionInput.currency la moneda de la transacción. Valores posibles:
* - 'clp': para pesos chilenos. Esta divisa no usa decimales.
*
* @param {string} initTransactionInput.urlNotify la url en la que chilepay te notificará cuando el pago sea
* procesado por la pasarela de pagos.
*
* @param {string} initTransactionInput.urlReturn la url hacia donde redirigir al usuario al terminar la
* transacción
*
* @param {object?} initTransactionInput.reseller Solo si actúas como reseller (es decir, estás vendiendo en el
* "nombre" de alguien más), en caso contrario omitir.
*
* @param {string} initTransactionInput.reseller.sellerAccountId el ID de de la cuenta vendedor.
* El vendedor debe autorizarte con anterioridad para que vendas en su nombre, usando el método initAuth con el scope
* 'reseller'.
*
* @param {number} initTransactionInput.reseller.feePerc porcentaje de comisión que reclamas para ti como
* desarrollador por cada venta. No puede superar el porcentaje autorizado por el vendedor
* initTransactionInput.reseller.sellerAccountId, al usar el método initAuth. Mínimo 0.
*
* @param {number} initTransactionInput.reseller.feeClf parte fija de comisión en UF que reclamas para tí como
* desarrollador por cada venta. No puede superar el monto autorizado por el vendedor
* initTransactionInput.reseller.sellerAccountId, al usar el método initAuth. Mínimo 0. Máximo 4 decimales.
*
* @returns {Promise<object>}
*/
initTransaction(initTransactionInput) {
if(typeof initTransactionInput !== 'object') {
return Promise.reject(new Error('initTransactionInput object parameter missing'));
}
return this.post('transactions', initTransactionInput);
}
/**
*
* @param {string} transactionId
* @returns {*}
*/
getTransaction(transactionId) {
return this.get('transactions/' + transactionId);
}
makeNotificationResponse(transactionSeed) {
let signature = crypto.createHash('sha256')
.update(transactionSeed + this.secretKey)
.digest('base64')
.replace(/=/g, '');
return signature;
}
/**
*
* @param initAuthInput.urlResponseNotify
*
* @param initAuthInput.scope
*
* @param {boolean} initAuthInput.scope.additionalInfo true para obtener información adicional de la cuenta del usuario:
* - id: El ID de la cuenta del usuario.
* - name: El nombre de la cuenta del usuario.
* - email: El email de la cuenta del usuario.
* - activeServices: Los servicios que el usuario tiene activos ('COMPRADOR', 'VENDEDOR', 'DESARROLLADOR')
* Falso o no definir para caso contrario. Usar solo si es realmente necesario.
*
* @param {object} initAuthInput.scope.reseller definir si deseas venden en nombre del usuario (usando su cuenta Vendedor).
*
* @param {float} initAuthInput.reseller.feePerc porcentaje de comisión que reclamas para tí como
* desarrollador por cada venta. No puede superar el porcentaje autorizado por el vendedor.
*
* @param {number} initAuthInput.reseller.feeClf.
*
*/
initAuth(initAuthInput) {
return this.post('auth', initAuthInput);
}
/**
*
*
* @param accountId
*/
getAuthAccount(accountId) {
return this.get('auth/' + accountId);
}
/**
*
* @param url
* @param params
* @returns {*}
*/
get(url, params) {
return this._request('get', url, params)
}
/**
*
* @param url
* @param params
* @returns {*}
*/
post(url, params) {
return this._request('post', url, params)
}
/**
*
* @param url
* @param params
* @returns {*}
*/
put(url, params) {
return this._request('put', url, params)
}
/**
*
* @param url
* @param params
* @returns {*}
*/
delete(url, params) {
return this._request('delete', url, params)
}
_request(method, url, params) {
let jwt = Chilepay._jwtCreate({
sub: this.apiKey,
type: 'api'
}, 60 * 3 /* 3 minutes*/, this.secretKey);
params = params || {};
let qs = {}, body = {};
if(method.toLowerCase() === 'get') {
qs = params;
} else {
body = params;
}
return request({
method: method,
uri: API_URL + '/' + API_VERSION + '/' + url,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + jwt
},
qs: qs,
body: body,
json: true
});
}
static _jwtCreate(payload, expireIn, secretKey) {
let header = {
alg: 'HS256',
typ: 'JWT'
};
let iat = Date.now() / 1000;
Object.assign(payload, {
iat: iat,
exp: iat + expireIn
});
let tokenHeader = Chilepay._base64UrlEncode(header);
let tokenPayload = Chilepay._base64UrlEncode(payload);
let signature = crypto.createHmac('sha256', secretKey)
.update(tokenHeader + '.' + tokenPayload)
.digest('base64')
.replace('=', '');
return tokenHeader + '.' + tokenPayload + '.' + signature;
}
static _base64UrlEncode(object) {
return (new Buffer(JSON.stringify(object)).toString('base64'))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
}
module.exports = Chilepay;