‫Instrutor: Então, neste vídeo, vamos integrar o
‫Stripe em nosso back-end, criando aquele endpoint de API que
‫criará e enviará de volta uma sessão de verificação do Stripe.
‫E então, neste ponto, vamos começar a criar
‫nosso próximo recurso.
‫E assim são as reservas.
‫E vou começar aqui com as rotas de reserva.
‫Então,
‫reservas de rotas. js.
‫E já fizemos isso muitas vezes agora.
‫Vou copiar todo esse
‫código e colocá-lo
‫aqui nas rotas de reserva.
‫E então simplesmente remova tudo isso.
‫E também este.
‫Também não precisamos de parâmetros de mesclagem e
‫teremos um controlador de reserva em vez de um controlador
‫de revisão.
‫Então, vamos criar um controlador de reserva.
‫Assim. js que
‫parece correto e vamos
‫também integrar isso no aplicativo. js.
‫E então vamos colocar isso bem aqui
‫após o roteador de revisão.
‫Portanto, aqui
‫estão apenas as reservas e, claro, aqui embaixo, integrem
‫isso à nossa API.
‫Então, as reservas
‫e aqui o roteador de reservas.
‫E eu acho que isso deveria ser apenas reserva.
‫Então, vamos consertar isso aqui também.
‫E, de fato, o chamamos de roteador de reservas.
‫E o mesmo aqui, não se trata de reservas,
‫mas de rotas de reserva.
‫Então, salve.
‫Feche este e
‫este e este aqui também.
‫E agora vamos realmente prosseguir e criar
‫nossa primeira rota aqui.
‫Então vamos roteador. get e a rota
‫que ele criará aqui mais uma vez não
‫seguirá o princípio do resto, porque este não será realmente sobre
‫como criar, obter ou atualizar qualquer reserva.
‫Em vez disso, essa rota será apenas para o
‫cliente obter uma sessão de checkout.
‫E então vamos chamar essa
‫sessão de checkout.
‫Em seguida, precisamos proteger essa rota
‫para que apenas usuários autenticados
‫possam realmente obter uma sessão de checkout.
‫Então isso faz sentido, certo?
‫Em seguida, adicione o controlador de reserva.
‫Vamos criar um manipulador
‫de rota chamado get checkout session.
‫Tudo bem.
‫Então,
‫vamos copiar este e criá-lo aqui nas exportações. getCheckoutSession, em seguida, a solicitação responde em
‫seguida.
‫E agora vamos começar a trabalhar.
‫Agora, na verdade, há mais uma coisa que precisamos fazer aqui
‫nas rotas que é especificar um parâmetro de URL.
‫E esse será o ID do tour.
‫Ok, então basicamente queremos que o cliente envie
‫junto com a ID do tour que está começando atualmente reservado.
‫E isso é para que possamos preencher a sessão de checkout com todos
‫os dados que forem necessários, como o nome do tour e
‫o preço do tour e tudo mais.
‫Tudo bem, agora temos acesso ao ID do passeio nesta
‫função de manipulador e a primeira coisa que realmente
‫faremos é encontrar
‫esse passeio em nosso banco de dados.
‫Tudo bem, então para isso precisamos, é claro, do modelo de turismo.
‫Então, vamos ao controlador de turnê e
‫começar a partir daí.
‫Também vamos precisar desse
‫catchAsync e, na verdade, de tudo isso.
‫Portanto, estou copiando tudo e, mesmo
‫que não precise imediatamente, provavelmente
‫irei precisar um pouco mais tarde de qualquer maneira.
‫Tudo bem.
‫Então, vamos fazer o layout de nossas etapas aqui novamente.
‫Então pegue o tour atualmente reservado.
‫Em seguida, como uma segunda etapa, criamos a sessão
‫de checkout e, finalmente, a enviamos ao cliente.
‫Tudo bem, então a primeira etapa é realmente fácil.
‫Então, vamos esperar.
‫Então faça um tour. findbyId
‫que é req. params. tourId.
‫Certo, então
‫esse foi o nome que demos no parâmetro URL.
‫E, claro, agora esta é
‫uma função assíncrona com um catchAsync além disso ou próximo a isso, na verdade.
‫Ótimo, a seguir, vamos criar essa sessão aqui.
‫E para isso realmente precisamos instalar este
‫pacote NPM da unidade.
‫Então vamos fazer isso aqui.
‫NPM instala o Stripe.
‫Enquanto isso, vamos ao painel do Stripe e
‫pegar nossa chave secreta daqui.
‫Basta clicar neste botão
‫aqui e, em seguida, copiá-lo.
‫E você vê que aqui nas chaves realmente
‫diz teste.
‫E então, novamente, estes aqui
‫são apenas para teste e depois que você tiver sua conta do Stripe
‫ativa, você pode obter suas chaves de API ativas.
‫Ok, agora como com qualquer outra
‫chave, iremos colocá-las aqui em nosso arquivo de configuração.
‫Então, a chave secreta do Stripe é igual
‫a esta.
‫E isso não está correto aqui.
‫Tudo bem, então copie este.
‫De volta ao nosso controlador de reservas.
‫Vamos agora exigir que este
‫pacote de unidade tenha sido instalado com sucesso aqui.
‫E apenas com todos os outros pacotes anteriores, certifique-se
‫de que você está realmente na
‫mesma versão que eu.
‫E você vê que estou aqui no novíssimo 7. 0 0
‫Então, isso é realmente novo.
‫E na verdade isso é
‫porque muitas coisas mudaram com o Stripe alguns dias atrás.
‫Então eu tive que mudar algumas dessas implementações.
‫De qualquer forma,
‫const stripe igual a require e então stripe.
‫Agora, isso aqui irá então expor uma função basicamente.
‫E geralmente o que fazemos imediatamente é passar nossa
‫chave secreta direto para isso.
‫E isso nos dará um objeto Stripe com
‫o qual podemos trabalhar.
‫Então isso agora está em processo. env. STRIPE_SECRET_KEY.
‫Ok, e agora vamos usar isso.
‫Então dizemos Stripe. Confira. sessão. crio.
‫E então o objeto usual de opções.
‫Tudo bem, agora há uma tonelada de
‫opções que podemos definir aqui.
‫Mas apenas três deles são necessários.
‫Portanto, o primeiro são os tipos de métodos de pagamento.
‫Tipos de métodos de pagamento.
‫Essa é uma matriz onde podemos especificar vários tipos
‫e cartão é para cartão de crédito.
‫E agora essas são todas as opções
‫de pagamento que podemos usar para finalizar a compra do Stripe.
‫Mas eu li que no futuro eles irão adicionar muito mais.
‫Então você pode se informar sobre isso.
‫Em seguida, precisamos especificar a URL de sucesso.
‫E esse é basicamente o URL que será
‫chamado assim que um cartão de crédito for cobrado com sucesso.
‫Assim, assim que a compra for bem-sucedida, o
‫usuário será redirecionado para este URL.
‫E, por enquanto, vamos simplesmente especificar isso como nossa página inicial.
‫Tudo bem e vamos fazer isso
‫como antes com req. protocolo: // e, em
‫seguida, solicitar. obter o host.
‫Então, basicamente, apenas o nosso URL inicial.
‫Em seguida, também precisamos especificar o URL de cancelamento.
‫Então, assim.
‫E este vai ser semelhante.
‫Basicamente, é a página para onde
‫o usuário vai se decidir cancelar o pagamento atual.
‫E, na verdade, vamos fazê-los ir para a
‫página do tour onde estavam antes.
‫E isso é basicamente uma turnê / turnê. lesma
‫Em seguida, também podemos especificar o e-mail do cliente.
‫E isso é muito útil porque é claro que já
‫temos acesso ao e-mail do cliente.
‫E assim, podemos economizar uma etapa para o usuário e
‫tornar a experiência de checkout muito mais suave.
‫Tudo bem, então lembre-se de que esta é uma rota protegida.
‫E, como sempre, o usuário já está a seu pedido.
‫E assim podemos dizer pedido. do utilizador. o email.
‫Em seguida, também podemos
‫especificar um campo personalizado que é chamado de ID de referência do cliente.
‫E isso soa um pouco estranho,
‫mas na verdade será muito importante para nós.
‫Portanto, este campo nos permitirá
‫passar alguns dados sobre a sessão que estamos criando no momento.
‫E isso é importante porque, mais tarde, quando
‫a compra for bem-sucedida, teremos
‫acesso ao objeto de sessão novamente.
‫E então, queremos criar uma nova reserva em
‫nosso banco de dados.
‫Portanto, lembre-se do diagrama
‫que mostrei a você na última aula.
‫Basicamente, estou falando
‫aqui da última etapa desse diagrama.
‫E lembre-se também de que
‫isso só funcionará com sites implantados.
‫Mas ainda assim, vamos nos preparar para isso aqui.
‫Ok, então, para criar uma nova reserva em nosso
‫banco de dados, precisaremos do ID do usuário, do tour e do preço.
‫Lembre-se disso?
‫E nesta sessão
‫já temos acesso ao e-mail do usuário
‫e a partir daí podemos
‫recriar o ID do usuário porque o e-mail aqui é único.
‫Também especificaremos o preço do passeio aqui
‫em um segundo, então tudo o que falta é o ID do passeio.
‫E é isso que vamos especificar aqui
‫neste campo personalizado, basicamente.
‫Isso é chamado de ID de referência do cliente.
‫E tudo o que acabei de explicar antes, na verdade, fará muito
‫mais sentido quando implementarmos a
‫última etapa de criação de uma
‫reserva no banco de dados, certo?
‫De qualquer forma, esse tour ID está disponível. params. tourId.
‫Tudo bem, e agora
‫finalmente, vamos especificar alguns detalhes sobre o produto em si.
‫Portanto, nosso tour neste caso.
‫E isso é chamado de
‫itens de linha, que aceitam uma série de objetos.
‫Basicamente, um por item
‫e, em nosso caso, será apenas um.
‫Devemos especificar o nome do
‫produto e ele está em turnê. nome e, como sempre, também adicionamos
‫o passeio a esse nome.
‫Então, também podemos especificar uma descrição.
‫E todos esses nomes de campo aqui, eles realmente vêm do Stripe.
‫Portanto, não podemos construir nossos próprios campos.
‫Portanto, se você tentar fazer isso, realmente obterá algum erro.
‫Tudo bem, então na descrição irei colocar o resumo do
‫passeio, aquela frase curta e legal
‫que irá descrever cada passeio.
‫Então, também podemos especificar uma matriz de imagens.
‫Agora, essas imagens aqui precisam ser imagens ao vivo.
‫Basicamente, imagens que são hospedadas na Internet porque
‫o Stripe irá, na verdade, fazer o upload
‫dessa imagem para seu próprio servidor.
‫E esta é outra das coisas que
‫só podemos realmente fazer depois que o site for implantado.
‫Mas, por enquanto, como um espaço reservado, vou basicamente usar os
‫do nosso site de exemplo hospedado no natours. dev.
‫Então, vamos para esse site.
‫Então é esse aqui na hora. dev.
‫E a imagem que vou escolher é a imagem da capa.
‫Então, vamos inspecionar essa imagem.
‫Então, este aqui e copie o endereço do link aqui.
‫Tudo bem.
‫Portanto, esta é
‫uma matriz porque podemos especificar várias imagens, mas na verdade queremos apenas uma delas.
‫E, de fato, temos natours. dev / images / tours e
‫o nome da imagem.
‫E este eu simplesmente substituirei por tour. capa da imagem.
‫E isso vai funcionar
‫por causa dos nomes das imagens no natours. dev são exatamente os mesmos que temos
‫aqui em nosso projeto.
‫Então faça um tour. imageCover.
‫Portanto, esta é
‫mais uma coisa que realmente precisamos mudar assim que colocarmos nosso site em produção.
‫E estou mantendo uma lista
‫dessas coisas para que não esqueçamos de nada.
‫De qualquer forma, o próximo é a quantia.
‫Então, basicamente, o preço do produto
‫que está sendo comprado.
‫Então essa é a turnê. preço e agora
‫precisamos multiplicar isso por 100.
‫Porque esse valor deve ser em centavos.
‫E assim, um dólar ou um euro ou realmente
‫a maioria das moedas têm 100 centavos.
‫Portanto, um dólar equivale a 100 centavos.
‫E então, para convertê-lo em centavos, basta multiplicar por 100.
‫Em seguida, também precisamos especificar a moeda.
‫E então, neste caso, é o USD.
‫Mas também pode ser
‫assim, para o Euro é EUR e para outras moedas, você
‫provavelmente deveria dar uma olhada na documentação.
‫É claro que não
‫posso cobrir todas as moedas que existem, certo?
‫Enfim, finalmente especificamos a quantidade.
‫E isso é apenas um tour neste caso.
‫Então é isso.
‫E então, basicamente, esta parte
‫aqui é a informação sobre a sessão em si.
‫E aqui estão as informações
‫sobre o produto que o usuário está prestes a comprar.
‫Tudo bem, agora vamos realmente armazenar a sessão.
‫Então const sessão e agora vamos
‫aguardar isso.
‫Portanto, criar aqui basicamente retorna uma premissa
‫porque definir todas essas opções aqui basicamente
‫fará uma chamada de
‫API para Stripe e, portanto, é claro que
‫é uma função assíncrona que devemos aguardar aqui.
‫Ok, mas de qualquer forma,
‫esta agora é nossa sessão e, portanto, a última etapa
‫é, claro, enviá-la de volta para o cliente.
‫Então, como sempre,
‫o status é sucesso.
‫E então vamos simplesmente enviar a sessão assim.
‫Tudo bem, então deveria ser isso.
‫Nosso roteador já está configurado, então
‫acho que podemos
‫tentar fazer isso no Postman.
‫Tudo bem, agora mais tarde
‫é claro que não vamos permitir que ninguém faça isso usando o
‫carteiro porque isso não faz muito sentido.
‫Mas agora, como estamos
‫apenas testando, faz muito sentido.
‫Tudo bem, então vamos
‫ao carteiro e criar uma nova solicitação.
‫Então isso vai ser
‫no bookings / uh, eu não tenho certeza.
‫Sim, sessão de checkout e / tourId.
‫Tudo bem, então vamos começar nossos tours aqui.
‫Para obter o ID basicamente de lá.
‫Então, vamos fazer o Sea Explorer.
‫Ok, e isso deve ser suficiente.
‫Oh, espere, é claro que não estamos logados.
‫Então faça o login aqui.
‫Agora estamos no admin,
‫mas vamos usar outra pessoa aqui.
‫E acho que usamos o
‫Leo antes, então vamos agora usar esse usuário.
‫Agora temos uma senha incorreta.
‫Tudo bem, então vamos ver o que mais temos.
‫Então, quais outros usuários poderíamos usar.
‫E, na verdade, vamos usar Monica aqui.
‫Por que não?
‫Então, espero que a senha dela esteja correta.
‫Bem, vamos tentar substituir isso
‫aqui por test1234.
‫Bem, talvez tenhamos mudado as
‫senhas de todos esses usuários em algumas outras palestras antes.
‫Então, vamos usar John aqui.
‫Sei que nunca usamos John, então
‫agora tem que funcionar.
‫Oh, eu realmente vejo o erro que cometi antes.
‫Então aqui não é natours, deve ser um exemplo. com.
‫Então, vamos tentar de novo com a Monica aqui.
‫Ou apenas com John.
‫Isso é mais difícil do que eu esperava.
‫Mas agora finalmente estamos logados.
‫Tudo bem, e com
‫isso, vamos tentar nossa sessão de checkout.
‫Estamos perdendo a autorização daqui.
‫Mais uma vez, e agora temos algum erro real aqui.
‫Então, algo que realmente está vindo do
‫código que acabamos de escrever.
‫Tudo bem.
‫Então, vamos verificar isso.
‫E o problema é que aqui são, na verdade, sessões.
‫Então, listre. Confira. sessões.
‫Mais uma vez.
‫Desta vez está demorando muito mais, o que é um bom sinal.
‫E temos outro erro.
‫Portanto, a linha 15 não pode ler o slug do nó.
‫Tudo bem, isso é estranho porque deve
‫haver uma lesma nesta turnê.
‫Então, uh sim, você vê que aqui
‫realmente está.
‫Então, talvez algo tenha
‫dado errado com a leitura dessa turnê.
‫O que eu realmente não consigo entender por que isso seria.
‫Mas vamos tentar registrar o tour no console.
‫Tudo bem, e na verdade nós obtemos nulos.
‫O que provavelmente significa
‫que há um tour ID não definido corretamente.
‫Oh, aqui está o problema.
‫Então eu tenho, ID tudo em
‫maiúsculas, mas aqui no controlador eu tenho o D em minúsculas.
‫Então, assim.
‫E esse é o
‫pequeno tipo de bug que acontece o tempo todo, obviamente.
‫Então, vamos ver qual é o próximo.
‫Ah, e na verdade desta vez acertamos.
‫Então você vê que é a sessão que acabamos de criar.
‫E edita mais algumas outras coisas aqui, mas isso realmente
‫não importa para nós agora.
‫O que é realmente interessante de ver é
‫que agora já podemos
‫ver esse pagamento, ou pelo menos essa solicitação
‫de pagamento, digamos em nossos painéis do drive.
‫Então se formos lá
‫e formos para pagamentos e depois para todos, vocês verão
‫que este último aqui na verdade aconteceu agora mesmo.
‫Então, se clicarmos nisso, você verá alguns dados sobre isso.
‫Então você vê, por exemplo, que na verdade é sobre
‫o Sea Explorer Tour.
‫Você também tem o preço, também tem a imagem.
‫Provavelmente também alguns dados sobre o usuário.
‫E na verdade não, realmente não.
‫Mas o que importa aqui é que diz incompleto.
‫E isso porque criamos apenas a sessão
‫de checkout no servidor.
‫Portanto, estamos perdendo
‫a segunda etapa em que, na
‫verdade, cobramos o cartão de crédito do cliente.
‫Então, já que estamos perdendo isso,
‫vamos fazer isso direito no próximo vídeo.