Skip to content

Instantly share code, notes, and snippets.

@lyceeducation
Last active February 28, 2023 17:36
Show Gist options
  • Save lyceeducation/3fd9f22b06c31303d6ffe4803b8dec14 to your computer and use it in GitHub Desktop.
Save lyceeducation/3fd9f22b06c31303d6ffe4803b8dec14 to your computer and use it in GitHub Desktop.
//PRA PEGAR O EMAIL E O TOKEN PRA SE AUTENTICAR NA API DO PAGSEGURO VC PRECISA IR NO PAINEL LA DO SANDBOX, NO MENU LATERAL NA ESQUERDA
// EM PERFIS DE INTEGRAÇÃO/VENDEDOR AI OS DADOS ESTAO NO INICIO DA PAGINA EM VENDEDOR DE TESTES;
//O PROCESSO DESCRITO ACIMA SÓ TE DA O EMAIL E O TOKEN DO AMBIENTE DE TESTE(SANDBOX), PRA PEGAR O EMAIL E O TOKEN DE PRODUÇÃO VOCE
//PRECISA LOGAR NA SUA CONTA DO PAGSEGURO FORA DO SANDBOX pagseguro.uol.com.br-> ACESSAR MINHA CONTA,
// NO MENU LATERAL NA ESQUERDA IR EM APLICAÇOES/MINHAS APLICAÇOES E CLICAR EM CRIAR NOVA APLICAÇÃO, AI VC PREENCHE TUDO QUE ELES PEDEM //QUE É OBRIGATORIO, DEPOIS VÁ EM PREFERENCIAS/INTEGRAÇÕES NO MENU LATERAL E EM UTILIZAÇÃO DE API CLIQUE EM GERAR UM TOKEN QUE VOCE VAI //USAR NO METODO INICIAR COM O EMAIL DA SUA CONTA DO PAGSEGURO QUE É O MESMO EMAIL USADO NO SANDBOX, EM PRODUÇÃO SO ALTERNE OS TOKENS;
//ABAIXO DOS IMPORTS
declare var PagSeguroDirectPayment: any;
//CLASE PRA INICIAR O OBJETO COM AS CREDENCIAIS
export class Credencial {
key: string;
urlSession: string;
urlPagSeguroDirectPayment: string;
urlTransacao: string;
urlAdesao: string;
urlPlano: string;
idSession: string;
email: string;
token: string;
isSandBox: boolean;
}
//CONTEUDO DA PROVIDER
public credencial: Credencial;
//METODO QUE DEFINE AS URLS E QUE CRIA A SESSION E INJETA O SCRIPT DO PAGSEGURO;
public iniciar(email, token, isSandBox): Promise<any> {
if (isSandBox) {
this.credencial.urlSession = "https://ws.sandbox.pagseguro.uol.com.br/v2/sessions?email=" + email + "&token=" + token;
this.credencial.urlPagSeguroDirectPayment = "https://stc.sandbox.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.directpayment.js";
this.credencial.urlTransacao = 'https://ws.sandbox.pagseguro.uol.com.br/v2/transactions/';
this.credencial.urlAdesao = "https://ws.sandbox.pagseguro.uol.com.br/pre-approvals?email=" + email + "&token=" + token;
this.credencial.urlPlano = "https://ws.sandbox.pagseguro.uol.com.br/pre-approvals/request?email=" + email + "&token=" + token;
} else {
this.credencial.urlSession = "https://ws.pagseguro.uol.com.br/v2/sessions?email=" + email + "&token=" + token;
this.credencial.urlPagSeguroDirectPayment = "https://stc.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.directpayment.js";
this.credencial.urlTransacao = 'https://ws.pagseguro.uol.com.br/v2/transactions/';
this.credencial.urlAdesao = "https://ws.pagseguro.uol.com.br/pre-approvals?email=" + email + "&token=" + token;
this.credencial.urlPlano = "https://ws.pagseguro.uol.com.br/pre-approvals/request?email=" + email + "&token=" + token;
}
return new Promise((resolve, reject) => {
//PEGANDO A SESSION PELA API(nao da pra fazer a requisição pelo app);
this.getSession().subscribe((retorno: any) => {
this.credencial.idSession = retorno.idSession;
//INJETANDO O JS DO PAGSEGURO
this.carregaPagSeguroDirectPayment().then(() => {
//USANDO O JS DO PAGSEGURO PRA SETAR O ID DA SESSION RETORNADA DA API;
PagSeguroDirectPayment.setSessionId(this.credencial.idSession);
this.storage.set('credencial', this.credencial);
console.log(PagSeguroDirectPayment);
resolve(true);
});
}, err => {
console.error('erro get session', err);
reject(err);
});
})
}
//METODO QUE VAI NA API(NODEJS) PEGA A SESSION;
private getSession() {
return this.http.post(this.API_URL + 'pagseguro/getSession', { 'sessionUrl': this.credencial.urlSession }).map(res => res);
}
//METODO PRA LISTAR OS PLANOS CADASTRADOS NO PAGSEGURO(no sandbox so da pra cadastrar via requisição na api, em produçao vc cria no sistema);
//OU VOCE PODE CADASTRAR OS PLANOS NO SISTEMA E COPIAR OS DADOS NECESSARIO ESTATICAMENTO NO APP;
getPlanos() {
let options: string = "&startCreationDate=2019-01-01T00:00&endCreationDate=2019-12-13T00:00&status=ALL"
return this.http.get(this.API_URL + 'pagseguro/getPlanos', { params: { "url": this.credencial.urlPlano + options } }).map(res => res);
}
// CARREGA O JAVASCRIPT DO PAGSEGURO PARA NOSSA VARIÁVEL
// DA PRA USAR OUTROS METODOS PRA CARREGAR UM SCRIPT EXTERNO;
carregaPagSeguroDirectPayment() {
return new Promise((resolve) => {
let script: HTMLScriptElement = document.createElement('script');
script.addEventListener('load', r => resolve());
script.src = this.credencial.urlPagSeguroDirectPayment;
document.head.appendChild(script);
});
}
//METODO PRA CRIAÇÃO DOS PLANOS(somente em sandbox, em produção se cria pelo sistema que é mais facil);
criarPlano(ref, nomePlano) {
let dados = {
"email": this.credencial.email,//EMAIL PASSADO NO INICIAR()
"token": this.credencial.token,//TOKEN PASSADO NO INICIAR()
"isSandBox": true,//
"nomePlano": nomePlano,
"periodo": 'SEMIANNUALLY',//mensal, semestral ou anual(em ingles)
"amount": '100.00', // VALOR DA MENSALIDADE
"expiration": 10,// DURAÇÃO DO PLANO, NAO DESCOBRI O QUE PASSAR PRA NAO TER ESSE LIMITE, MAS NO SITE DA PRA CRIAR SEM EXPIRAÇÃO
"receiver": this.credencial.email,
"reference": ref, //CODIGO DE REFERENCIA DO PLANO, O USUARIO NAO VE ESSE DADO, PODE SER QUALQUER STRING
"url": this.credencial.urlPlano
}
return this.http.post(this.API_URL + 'pagseguro/criarPlano', dados).map(res => res);
}
// BUSCA A BANDEIRA DO CARTÃO (EX: VISA, MASTERCARD ETC...) E DEPOIS BUSCA AS PARCELAS;
// ESTA FUNÇÃO É CHAMADA QUANDO O INPUT QUE RECEBE O NÚMERO DO CARTÃO PERDE O FOCO;
// DA PRA COLOCAR O USUARIO PRA ESCOLHER A BANDEIRA DO CARTAO DELE NA TELA TAMBEM MAS ESSE METODO JA PEGA AUTOMATICO;
buscaBandeira(num: string): Promise<string> {
let numCard = num.replace(/\s/g, '');// REMOVENDO TODOS OS ESPAÇOS ENTRE OS GRUPOS DE 4 NUMEROS PORQUE ESTOU USANDO UMA MASCARA QUE SEPARA OS NUMEROS;
return new Promise((resolve, reject) => {
PagSeguroDirectPayment.setSessionId(this.credencial.idSession);
PagSeguroDirectPayment.getBrand({
cardBin: numCard,
success: response => {
console.table(response);
resolve(this.dados.bandCard);
},
error: response => { console.log('buscaBandeira', response); reject(response) }
});
})
}
// VERIFICA QUAL BANDEIRA FOI INFORMADA PELO CLIENTE AO DIGITAR OS DADOS DO CARTÃO E RETORNA AS
// PARCELAS DISPONPIVEIS E VAI BUSCAR AS PARCELAS NA API DO PAGSEGURO PARA O CLIENTE ESCOLHER
// SO PRECISA USAR ESSE METODO DO PAGSEGURO SE ESTIVER FAZENDO UMA VENDA DE UM PRODUTO DIFERENTE DE UMA ASSINATURA(TIPO UM PRODUTO DE UMA LOJA)
//NAO ME APROFUNDEI NOS JUROS DAS PARCELAS, MAS NESSE CASO O PAGSEGURO JA DEFINE OS JUROS E A QUANTIDADE MAXIMA DE PARCELAS;
buscaParcelas() {
PagSeguroDirectPayment.getInstallments({
amount: '100', //valor total da compra (deve ser informado)
brand: this.dados.bandCard, //bandeira do cartão (capturado na função buscaBandeira)
maxInstallmentNoInterest: 3, // QUANTIDADE DE PARCELAS QUE NAO SERAO COBRADOS JUROS
success: response => {
// this.dados.parcelas = response.installments[this.dados.bandCard];
console.table(response);
},
error: response => { console.log('buscaParcelas', response) }
});
}
// INICIA OS PROCESSOS PARA QUE SEJA REALIZADO O PAGAMENTO
// AO CLICAR NO BOTÃO PAGAR
// NA REFERENCIA EU COLOQUE O NOME DO PLANO_TIMESTAMP PEGANDO O TIMESTAMP COM O MOMENTJS(MOMENT())
pagar(dadosCartao: Cartao, dadosComprador, planoSelecionado, referencia): Promise<any> {
return new Promise((resolve, reject) => {
//BUSCA O HASH DO COMPRADOR JUNTO A API DO PAGSEGURO
dadosComprador.hash = PagSeguroDirectPayment.getSenderHash();
//CRIA O HASK DO CARTÃO DE CRÉDITO JUNTO A API DO PAGSEGURO
PagSeguroDirectPayment.createCardToken({
cardNumber: dadosCartao.cardNumber,
cvv: dadosCartao.cvv,
expirationMonth: dadosCartao.expirationMonth,// MES DE EXPIRAÇÃO DO CARTAO
expirationYear: dadosCartao.expirationYear,//ANO DE EXPIRAÇÃO DO CARTAO
brand: dadosCartao.brand,// BANDEIRA DO CARTAO
success: response => {
dadosCartao.token = response.card.token;//ESSE TOKEN É ESSENCIAL PRA CONCLUIR O PAGAMENTO, ELE QUE IDENTIFICA O CARTAO
//NESTE MOMENTO JÁ TEMOS TUDO QUE PRECISAMOS!
//HORA DE ENVIAR OS DADOS PARA O SERVIDOR PARA CONCRETIZAR O PAGAMENTO
this.concluirPagamento(dadosCartao, dadosComprador, planoSelecionado, referencia).subscribe(response => {
resolve(response);
//PEGUE O CODIGO DA TRANSAÇÃO E SALVE NO BANCO SE QUISER, E AQUI OU NA PAGE SALVE NO BANCO QUE O USUARIO CONCLUIU O PAGAMENTO
}, error => {
reject(error);
});
},
error: response => { console.log('Create card token erro', response); reject(response) }
});
})
}
// MÉTODO QUE SE COMUNICA COM A API DO APP PASSANDO OS DADOS FORMATADOS(NA FUNCAO MONTAR DADOS OU NESSA MESMA FUNCAO/METODO) DO GEITO QUE O PAGSEGURO QUER;
public concluirPagamento(dadosCartao: any, dadosComprador, planoSelecionado: string, referencia) {
console.log('chegou aqui');
let dadosFinal = this.montarDados({ 'comprador': dadosComprador, 'cartao': dadosCartao, 'plano': planoSelecionado, 'referencia': referencia });
console.log('dadosFinal', dadosFinal);
//EU PASSO A URL PRA ADESAO A UM PLANO QUE TA NA DOC "https://dev.pagseguro.uol.com.br/reference#api-pagamento-recorrente-adesao-ao-plano"
return this.http.post(this.API_URL + 'pagseguro/confirmarPagamento', { 'url': this.credencial.urlAdesao, 'dados': dadosFinal }).map(res => res);
}
//MODELO DE DADOS A SER ENVIADO PARA ADERIR A UMA ASSINATURA;
// "https://ws.sandbox.pagseguro.uol.com.br/pre-approvals?email=" + email + "&token=" + token; URL PARA SEREM ENVIADOS OS DADOS
// O TOKEN DE PRODUÇÂO È DIFERENTE DO SANDBOX MAS O EMAIL È O MESMO
montarDados(dados: any) {
return {
//DADOS DO PLANO A SER ASSINADO
'plan': dados.plano,
'reference': dados.referencia,
//DADOS BASICOS DO COMPRADOR
'sender': {
'name': '',
'email': '[email protected]',
'hash': '',
'phone': {
'areaCode': '',
'number': ''
},
//ENDEREÇO DO COMPRADOR
'address': {
'street': '',
'number': '',
'complement': '',
'district': '',
'state': '',
'city': '',
'country': 'BRA',
'postalCode': ''
},
//DOCUMENTO DO COMPRADOR
//AQUI TEM QUE SER UM ARRAY DE OBJETOS SENAO DA ERRO
'documents': [{
'type': 'CPF',
'value': ''
}],
},
//METODO DE PAGAMENTO
"paymentMethod": {
'type': 'CREDITCARD', // Assinaturas so aceitam cartoes de credito
'creditCard': {
'token': '',
'holder': {
'name': '',
'birthDate': '',
'phone': {
'areaCode': '',
'number': ''
},
'billingAddress': {
'street': '',
'number': '',
'complement': '',
'district': '',
'state': '',
'city': '',
'country': 'BRA',
'postalCode': ''
},
//AQUI TEM QUE SER UM ARRAY DE OBJETOS SENAO DA ERRO
'documents': [{
'type': 'CPF',
'value': ''
}]
}
}
}
}
//FIM DO OBJETO
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment