@trowdev/pagseguro-sdk
Version:
Biblioteca para realização de checkout com PagSeguro
176 lines (158 loc) • 5.8 kB
text/typescript
import axios from 'axios';
const xml2JSON = require('xml2json-light');
const json2XML = require('json2xml');
import { PSAccount, PSItemDetails, PSCheckoutDetails } from './pagseguro.model';
export default class PagSeguro {
dadosConta: PSAccount = { email: '', token: '' };
itens: PSItemDetails[] = [];
api;
urlPagSeguro: string = '';
currency: string = '';
reference: string = '';
redirectURL: string = '';
notificationURL: string = '';
constructor(dados: PSAccount){
this.dadosConta = dados;
if(dados.sandbox) {
this.urlPagSeguro = 'https://ws.sandbox.pagseguro.uol.com.br';
} else {
this.urlPagSeguro = 'https://ws.pagseguro.uol.com.br';
}
this.currency = 'BRL';
this.itens = [];
this.api = axios.create({
baseURL: this.urlPagSeguro,
headers: {
'Content-Type': 'application/xml; charset=UTF-8'
}
});
}
/**
* Moeda da transação
* @param cur
*/
setCurrency(cur: string) {
this.currency = cur;
}
/**
* Adiciona um item a lista de itens do pagamento
* @param item
*/
addItem(item: PSItemDetails) {
item.amount = Number(item.amount).toFixed(2);
this.itens.push(item);
}
/**
* Define a lista de itens do pagamento.
* @param itens
*/
setItens(itens: PSItemDetails[]) {
this.itens = itens;
}
/**
* Define a referência do pagamento
* @param referencia
*/
setReference(referencia: string) {
this.reference = referencia;
}
/**
* Define a URL de Retorno
* @param redirectURL
*/
setRedirectURL(redirectURL: string) {
this.redirectURL = redirectURL;
}
/**
* Define a URL de notificação de status do pagamento.
* @param notificationURL
*/
setNotificationURL(notificationURL: string) {
this.notificationURL = notificationURL;
}
/**
* Valida se os atributos obrigatórios para pagamento foram informados.
*/
validPayment(){
if(!this.notificationURL) {
throw new Error('[TrowDev/PagSeguro-SDK] notificationURL is required.');
} else if(!this.redirectURL) {
throw new Error('[TrowDev/PagSeguro-SDK] redirectURL is required.');
} else if(!this.reference) {
throw new Error('[TrowDev/PagSeguro-SDK] reference is required.');
} else if(!this.itens || this.itens.length === 0) {
throw new Error('[TrowDev/PagSeguro-SDK] itens is required.');
} else if(!this.currency) {
throw new Error('[TrowDev/PagSeguro-SDK] currency is required.');
}
return true;
}
buildPayment(){
const data: any = {};
if(this.validPayment()) {
data.items = [];
this.itens.forEach(item => {
data['items'].push({ item });
});
data['notificationURL'] = this.notificationURL;
data['redirectURL'] = this.redirectURL;
data['reference'] = this.reference;
data['currency'] = this.currency;
}
let ret = json2XML({ checkout: data });
ret = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + ret;
return ret;
}
/**
* Envia a requisição ao PagSeguro para gerar um código de pagamento.
*/
async payment(): Promise<PSCheckoutDetails> {
const dataPayment = this.buildPayment();
const { email, token } = this.dadosConta;
const endpoint = `/v2/checkout?email=${email}&token=${token}`;
const resp:any = await this.api.post(endpoint, dataPayment).then(ret => {
return ret;
}).catch(err => {
console.log(err);
});
if(!resp || resp.status != 200) {
console.log('[@trowdev/PagSeguro-SDK] Status Response: '+resp.status);
throw new Error('[@trowdev/PagSeguro-SDK] Invalid Response.');
}
return xml2JSON.xml2json(resp.data);
}
/**
* Busca os detalhes de uma transação pelo código da transação.
* @param idTransacao
*/
async transactionStatus(idTransacao: string) {
const { email, token } = this.dadosConta;
const endpoint = `/v3/transactions/${idTransacao}?email=${email}&token=${token}`;
const resp: any = await this.api.get(endpoint).then(ret => {
return ret;
}).catch(err => {
console.log(err);
});
if(!resp) {
throw new Error('[@trowdev/PagSeguro-SDK] Invalid Response.');
}
return xml2JSON.xml2json(resp.data);
}
/**
* Busca os detalhes de uma transação pelo código da notificação IPN.
* @param ipnCodigoTransacao
*/
async notificationStatus(ipnCodigoTransacao: string) {
const { email, token } = this.dadosConta;
const endpoint = `/v3/transactions/notifications/${ipnCodigoTransacao}?email=${email}&token=${token}`;
const resp: any = await this.api.get(endpoint).then(ret => {
return ret;
}).catch(err => {
console.log(err);
});
if(!resp) {
throw new Error('[@trowdev/PagSeguro-SDK] Invalid Response.');
}
return xml2JSON.xml2json(resp.data);
}
}