Last active
February 28, 2023 17:36
-
-
Save lyceeducation/3fd9f22b06c31303d6ffe4803b8dec14 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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