Ligar serviços: emails, pagamento, IA
Objetivos deste capítulo
- Compreender o que é uma API e como a tua app dialoga com serviços externos
- Enviar emails e aceitar um pagamento sem programar
- Adicionar uma funcionalidade de IA mantendo as chaves secretas no servidor
A app que fala com o mundo
O sucesso da app do Tom ultrapassa a turma dele: uma colega de português usa-a com os alunos do 8.º ano, e um professor de matemática de outra escola escreveu-lhe para saber «como instalá-la para a escola dele — e quanto custa». Três vontades emergem: enviar aos alunos um resumo semanal por email, adicionar uma mensagem de encorajamento gerada por IA quando um aluno termina o dia, e propor uma versão «turma» paga para os professores das outras escolas. Três funcionalidades, um mesmo mecanismo: pôr a app a dialogar com serviços externos.
Este diálogo passa por API (interfaces de programação). O princípio: um serviço — o Resend para os emails, o Stripe para o pagamento, o Claude para a IA — expõe um balcão na Internet. A tua app apresenta-se lá com um pedido estruturado («envia este email para este endereço») e uma chave API que prova a sua identidade, e o serviço executa e responde. Não precisas de compreender como o Resend encaminha um email, tal como não precisas de compreender uma central elétrica para ligar uma tomada: a API é a tomada.
A regra de ouro: as chaves ficam no servidor
Antes da mínima ligação, uma regra absoluta. A tua chave API é um cartão bancário: quem a possuir consome o serviço em teu nome e à tua custa. Ora, todo o código que corre num navegador é legível por qualquer pessoa — um simples F12 chega. Conclusão implacável: uma chave secreta nunca deve jamais encontrar-se no código do lado do navegador. Vive do lado do servidor, onde ninguém a pode ler.
«Mas eu não tenho servidor!» Tens, quase: a Vercel (e os concorrentes) propõe funções de servidor — pequenos pedaços de código alojados neles, que se executam a pedido. O esquema é sempre o mesmo: o navegador chama a tua função de servidor (sem chave), a função chama o serviço externo (com a chave, guardada numa variável de ambiente), e devolve ao navegador apenas o resultado. A IA sabe criar estas funções na perfeição — o teu trabalho é exigir esta arquitetura nos teus prompts.
flowchart LR N["Navegador do aluno"] -->|"Pedido sem nenhuma chave"| F["Função de servidor na Vercel"] F -->|"Chamada com a chave secreta"| S["Serviço externo: Resend, Stripe ou Claude"] S -->|"Resposta"| F F -->|"Resultado limpo"| N
Enviar emails: o resumo semanal
Primeira ligação: o email. Não se enviam emails automáticos a partir da caixa Gmail pessoal — os fornecedores bloqueiam-no depressa e é frágil. Passa-se por um serviço de email transacional como o Resend, o Postmark ou o Brevo: concebidos para apps, fiáveis, e gratuitos em pequena escala (o Resend oferece 100 emails por dia, muito acima das necessidades do Tom). O prompt do Tom, completo:
Adiciona o envio de um email de resumo à minha app de acompanhamento de hábitos. Contexto: app HTML/JS na Vercel, dados no Supabase, autenticação por link mágico. O que quero: 1. um botão «receber o meu resumo da semana» na página principal 2. ao clique, uma função de servidor Vercel calcula os streaks e as marcações da semana do utilizador ligado, e envia-lhe um email limpo e legível via Resend 3. a chave API do Resend fica no servidor, numa variável de ambiente da Vercel — nunca no código do navegador 4. limite estrito: um envio por utilizador e por dia no máximo, com uma mensagem clara se o limite for atingido Guia-me primeiro para criar a conta Resend e configurar a variável de ambiente na Vercel, e depois programa a função. Uma etapa de cada vez, espero testar antes da seguinte.
Para na linha 4: «um envio por utilizador e por dia». Porquê limitar uma funcionalidade gratuita? Porque todo o botão que aciona um serviço externo pode ser martelado — por um aluno brincalhão ou por um robô — e cada envio consome a tua quota. Pôr um limite logo na conceção é um reflexo de arquiteto: proteges o teu serviço antes que ele precise. Generalizaremos este reflexo no capítulo 9.
Receber um pagamento sem programar: Stripe Payment Links
Para a versão «turma» paga, o Tom receia o pior: o pagamento online é coisa séria, regulamentada, ansiogénica. Boa surpresa: o Stripe, o serviço de pagamento mais usado pelos programadores, propõe os Payment Links — páginas de pagamento alojadas pelo Stripe, criadas em alguns cliques no painel de controlo deles, sem uma linha de código. Crias um produto («Versão turma — 29 €/ano»), o Stripe gera um URL, e a tua app só tem de mostrar um botão a apontar para esse URL. O Stripe gere o cartão bancário, a segurança, a faturação, os reembolsos.
- Cria uma conta em stripe.com e fica em modo de teste por enquanto.
- No painel de controlo: Produtos → adicionar «Versão turma» com o seu preço.
- Gera o Payment Link do produto e copia o URL.
- Pede à IA que adicione uma página «versão turma» com os benefícios e um botão para esse link.
- Testa o percurso completo em modo de teste, e depois ativa o modo real quando tudo estiver validado.
4242 4242 4242 4242 (qualquer data futura e qualquer código): podes desenrolar um verdadeiro percurso de compra sem gastar um cêntimo. Só passa ao modo real depois de testares o percurso completo, email de confirmação incluído.Os Payment Links têm limites — sem desbloqueio automático de funcionalidades na app depois do pagamento, por exemplo. Para a v1 do Tom, é perfeito: o professor paga via o link, o Tom recebe a notificação do Stripe e ativa a turma à mão. Cinco clientes por mês geram-se manualmente; no dia em que forem cinquenta, ligará a automatização (os «webhooks») — um problema de rico, para mais tarde. Automatizar o que só acontece cinco vezes por mês é um mau negócio.
Adicionar um toque de IA na tua app
Última ligação, a mais saborosa: usar a IA dentro da tua app — e já não apenas para a construir. A ideia do Tom: quando um aluno marca o último hábito do dia, aparece uma curta mensagem de encorajamento personalizada, gerada pela API do Claude. A mesma arquitetura do email: função de servidor, chave em variável de ambiente, limite de uso. Com duas precauções novas, próprias da IA:
Adiciona uma função «encorajamento do dia» à minha app de acompanhamento de hábitos. Quando o utilizador marca o último hábito do dia, chama a API do Claude a partir de uma função de servidor Vercel para gerar uma curta mensagem de encorajamento personalizada: - tom caloroso mas não piegas, adaptado a alunos do ensino básico - menciona o streak atual e o hábito mais regular da semana - 2 frases no máximo, em português Restrições técnicas: 1. a chave API fica numa variável de ambiente, apenas do lado do servidor 2. limite: uma chamada por utilizador e por dia 3. prevê uma mensagem por omissão simpática se a chamada falhar ou ultrapassar 5 segundos — a app NUNCA deve partir por causa desta função Mostra-me o texto exato do prompt que a função enviará ao Claude, para que eu o possa ajustar.
Duas linhas merecem a tua atenção. «Prevê uma mensagem por omissão se a chamada falhar»: é a degradação elegante — uma funcionalidade bónus nunca deve poder partir a app que a transporta. E «mostra-me o texto exato do prompt»: pois é, a tua app contém agora ela própria um prompt, que podes refinar como aprendeste a refinar os teus. Escreves prompts que geram código que envia prompts — o ciclo é saboroso, e dominas cada andar.
Quando um serviço externo cai
Última lição deste capítulo: a tua app depende agora de serviços que não controlas. O Resend, o Stripe ou a API do Claude podem ter uma avaria, abrandar, ou mudar as regras. Três hábitos à medida: verificar a página de estado do serviço antes de procurar o bug do teu lado («Resend status» num motor de busca), prever um comportamento de recurso para cada ligação (mensagem por omissão, botão desativado com explicação), e nunca fazer depender a função central da tua app de um serviço externo. Os hábitos do Tom marcam-se mesmo que a IA, o email e o pagamento estejam os três em baixo — é isso, uma arquitetura saudável.
A tua app sabe agora escrever, cobrar e refletir. Mas cada ligação também aumentou a sua superfície de exposição: chaves a proteger, entradas a validar, limites a fazer respeitar. Antes de ir mais longe, é hora de proteger seriamente o conjunto — é o programa do capítulo 9.
Contexto
O Tom planeia as três ligações ao longo de duas semanas, por ordem de valor: primeiro o resumo por email (pedido pelos alunos), depois o encorajamento por IA (o orgulho pessoal dele), por fim o Payment Link (para o colega impaciente). Escolhe para a tua própria app UMA ligação que faça sentido — email, pagamento ou IA — e realiza-a de ponta a ponta com a arquitetura segura. Uma só, mas bem feita.
Instruções
- Escolhe a tua ligação e escreve em duas frases o valor para o utilizador (se não conseguires, escolhe outra).
- Cria a conta do serviço em causa (Resend, Stripe ou Anthropic) e localiza a chave API e a página de utilização.
- Envia o teu prompt exigindo: função de servidor, chave em variável de ambiente, limite de uso por utilizador, comportamento de recurso.
- Configura a variável de ambiente na Vercel seguindo o acompanhamento da IA, e depois testa a funcionalidade de ponta a ponta.
- Faz o controlo anti-fuga: F12 → Sources → procura «key» — nenhuma chave secreta deve aparecer do lado do navegador.
- Testa o limite (aciona duas vezes, verifica a recusa educada) e o recurso (pergunta à IA como simular uma avaria do serviço), e depois faz commit.
Em resumo
- Uma API é um balcão: a tua app envia um pedido estruturado com a sua chave, o serviço executa e responde.
- Regra de ouro: as chaves secretas vivem do lado do servidor (funções Vercel + variáveis de ambiente), nunca no navegador.
- Emails automáticos = serviço transacional (Resend…), nunca a tua caixa pessoal.
- Stripe Payment Links: uma verdadeira página de pagamento sem uma linha de código — e um modo de teste com o cartão 4242.
- Uma funcionalidade de IA na tua app é um prompt do lado do servidor: refina-o como refinas os teus.
- Cada ligação recebe desde o primeiro dia: um limite de uso, um teto de despesa e um comportamento de recurso.
- O coração da tua app nunca deve depender de um serviço externo: todo o bónus deve poder cair sem partir nada.
Quiz — verifica a tua compreensão
1. Porque é que uma chave API secreta nunca deve estar no código do lado do navegador?
2. Qual é o papel de uma função de servidor (tipo Vercel) nesta arquitetura?
3. Porque é que o Tom escolhe os Stripe Payment Links em vez de uma integração completa?
4. O que deve fazer a app do Tom se a chamada à API de IA falhar?
5. Que proteções pôr desde o primeiro dia numa ligação de API de IA?