[{"data":1,"prerenderedAt":575},["ShallowReactive",2],{"navigation":3,"/blog/mpesa-api-starter":22,"/blog/mpesa-api-starter-surround":571},[4],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Blog","/blog","blog",[9,13,17],{"title":10,"path":11,"stem":12},"Desafios dos Programadores Iniciantes em Moçambique ao Criar Backends para APIs de Pagamentos M-Pesa","/blog/mpesa-api-starter","blog/mpesa-api-starter",{"title":14,"path":15,"stem":16},"Ofuzah - Bloqueie o Acesso à Internet de Qualquer Aplicação no Windows com Um Clique","/blog/ofuzah-internet-blocker","blog/ofuzah-internet-blocker",{"title":18,"path":19,"stem":20},"QR Code Scanner: Um Leitor de QR Codes e Códigos de Barras Grátis e Sem Anúncios","/blog/qrcode-scanner","blog/qrcode-scanner",false,{"id":23,"title":10,"author":24,"body":28,"date":564,"description":565,"extension":566,"image":567,"meta":568,"minRead":364,"navigation":348,"path":11,"seo":569,"stem":12,"__hash__":570},"blog/blog/mpesa-api-starter.md",{"name":25,"avatar":26},"Albino T. Calbe",{"src":27,"alt":25},"/profile.png",{"type":29,"value":30,"toc":550},"minimark",[31,44,55,58,63,68,79,90,94,108,112,134,138,152,154,158,165,179,181,183,188,192,195,231,234,238,241,254,258,272,433,437,440,455,468,471,474,478,485,488,496,515,520,527,531,534,537,546],[32,33,34,35,39,40,43],"p",{},"A integração com ",[36,37,38],"strong",{},"APIs de pagamento",", especialmente a do ",[36,41,42],{},"M-Pesa",", é uma das etapas mais desafiadoras para muitos programadores iniciantes em Moçambique. Embora a documentação do serviço ofereça uma visão geral, a implementação prática muitas vezes se transforma num verdadeiro teste de paciência — entre certificados SSL, chaves públicas e privadas, endpoints inconsistentes e autenticações complexas.",[32,45,46,47,50,51,54],{},"Neste artigo, partilho uma análise sincera sobre essas dificuldades e apresento uma ",[36,48,49],{},"solução prática",": um ",[36,52,53],{},"backend M-Pesa já pronto para uso",", que qualquer desenvolvedor pode clonar do GitHub e fazer deploy em minutos, utilizando apenas as suas próprias variáveis de ambiente obtidas no portal do desenvolvedor da M-Pesa.",[56,57],"hr",{},[59,60,62],"h2",{"id":61},"as-principais-dificuldades-dos-iniciantes","As Principais Dificuldades dos Iniciantes",[64,65,67],"h3",{"id":66},"_1-documentação-incompleta-ou-confusa","1. Documentação Incompleta ou Confusa",[32,69,70,71,74,75,78],{},"Muitos desenvolvedores relatam que a ",[36,72,73],{},"documentação oficial da API M-Pesa"," (fornecida pela Vodacom Moçambique) é pouco detalhada, principalmente em relação a exemplos de código prático.",[76,77],"br",{},"\nIsso leva os iniciantes a cometer erros simples, como formatar mal as requisições ou usar endpoints incorretos.",[80,81,82],"blockquote",{},[32,83,84,85,89],{},"“Passei dias a tentar entender porque minha requisição devolvia ",[86,87,88],"em",{},"403 Forbidden",", e o problema era apenas o cabeçalho mal formatado.” — Desenvolvedor júnior de Maputo",[64,91,93],{"id":92},"_2-dificuldade-em-configurar-o-ssl","2. Dificuldade em Configurar o SSL",[32,95,96,97,100,101,103,104,107],{},"Embora o ambiente ",[36,98,99],{},"sandbox"," permita testes sem SSL, o ambiente de produção exige certificados válidos.",[76,102],{},"\nPara quem está a trabalhar localmente ou num ambiente gratuito, como o ",[36,105,106],{},"Vercel",", configurar HTTPS pode ser uma dor de cabeça.",[64,109,111],{"id":110},"_3-autenticação-e-chaves-criptográficas","3. Autenticação e Chaves Criptográficas",[32,113,114,115,118,119,122,123,126,127,130,131,133],{},"O M-Pesa utiliza ",[36,116,117],{},"autenticação baseada em chaves públicas e privadas",", o que exige que o programador entenda bem conceitos de ",[36,120,121],{},"criptografia RSA",", ",[36,124,125],{},"assinaturas digitais"," e ",[36,128,129],{},"segurança de API",".",[76,132],{},"\nEsses temas são raramente abordados nos cursos iniciais de programação disponíveis em Moçambique, o que gera frustração.",[64,135,137],{"id":136},"_4-ausência-de-exemplos-em-typescriptnodejs","4. Ausência de Exemplos em TypeScript/Node.js",[32,139,140,141,144,145,147,148,151],{},"Grande parte dos exemplos disponíveis online está em ",[36,142,143],{},"PHP ou Java",", linguagens mais antigas no ecossistema local.",[76,146],{},"\nEntretanto, o novo mercado — dominado por ",[36,149,150],{},"Node.js, React, Next.js e Vite"," — exige soluções modernas e fáceis de integrar ao frontend.",[56,153],{},[59,155,157],{"id":156},"a-solução-backend-m-pesa-pronto-para-deploy","A Solução: Backend M-Pesa Pronto para Deploy",[32,159,160,161,164],{},"Pensando nesses desafios, preparei um ",[36,162,163],{},"backend completo e funcional",", pronto para ser usado por qualquer desenvolvedor que queira integrar pagamentos via M-Pesa com rapidez e segurança.",[32,166,167,168,171,172,175,176,178],{},"Esse projeto foi criado com ",[36,169,170],{},"NextJS",", e pode ser ",[36,173,174],{},"implantado gratuitamente na Vercel"," com apenas alguns cliques.",[76,177],{},"\nO código está hospedado no GitHub, e basta clonar o repositório e definir as variáveis de ambiente.",[56,180],{},[56,182],{},[184,185,187],"h1",{"id":186},"passos-para-criar-seu-próprio-backend","Passos para criar seu próprio backend",[59,189,191],{"id":190},"_1-clonar-o-repositório","1. Clonar o Repositório",[32,193,194],{},"Acesse o repositório no GitHub e clone-o para o seu computador:",[196,197,202],"pre",{"className":198,"code":199,"language":200,"meta":201,"style":201},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/calbedev/mpesa-api-starter.git\ncd mpesa-backend-ready\n","bash","",[203,204,205,221],"code",{"__ignoreMap":201},[206,207,210,214,218],"span",{"class":208,"line":209},"line",1,[206,211,213],{"class":212},"sBMFI","git",[206,215,217],{"class":216},"sfazB"," clone",[206,219,220],{"class":216}," https://github.com/calbedev/mpesa-api-starter.git\n",[206,222,224,228],{"class":208,"line":223},2,[206,225,227],{"class":226},"s2Zo4","cd",[206,229,230],{"class":216}," mpesa-backend-ready\n",[32,232,233],{},"Se preferir, pode também fazer o fork e trabalhar na sua própria versão.",[59,235,237],{"id":236},"_2-instalar-dependências","2. Instalar Dependências",[32,239,240],{},"No diretório do projeto, instale as dependências necessárias:",[196,242,244],{"className":198,"code":243,"language":200,"meta":201,"style":201},"pnpm install\n",[203,245,246],{"__ignoreMap":201},[206,247,248,251],{"class":208,"line":209},[206,249,250],{"class":212},"pnpm",[206,252,253],{"class":216}," install\n",[59,255,257],{"id":256},"_3-definir-as-variáveis-de-ambiente","3. Definir as variáveis de ambiente",[32,259,260,261,264,265,130],{},"Crie um ficheiro ",[203,262,263],{},".env"," e defina as seguintes variáveis, obtidas no ",[266,267,271],"a",{"href":268,"rel":269},"https://developer.mpesa.vm.co.mz/",[270],"nofollow","portal do desenvolvedor M-Pesa",[196,273,275],{"className":198,"code":274,"language":200,"meta":201,"style":201},"# M-Pesa API Configuration (OBRIGATÓRIO)\nMPESA_API_KEY=\"sua api key\"\nMPESA_PUBLIC_KEY= \"Sua public key\"\nMPESA_API_URL=api.sandbox.vm.co.mz \nMPESA_USE_SSL=false\n\n# API Security (OBRIGATÓRIO)\n# Defina uma chave secreta forte para proteger suas APIs\n# Esta chave será usada para autenticar requisições do frontend\nAPI_SECRET_KEY=\"defina uma chave secreta\"\n\n# Service Provider Configuration (OPCIONAL mas recomendado)\n# Necessário para operações B2B, B2C e Reversal\nMPESA_SERVICE_PROVIDER_CODE=171717\nMPESA_INITIATOR_IDENTIFIER=MPesa2018\nMPESA_SECURITY_CREDENTIAL=Mpesa2019\n",[203,276,277,283,302,318,332,343,350,356,362,368,383,388,394,400,411,422],{"__ignoreMap":201},[206,278,279],{"class":208,"line":209},[206,280,282],{"class":281},"sHwdD","# M-Pesa API Configuration (OBRIGATÓRIO)\n",[206,284,285,289,293,296,299],{"class":208,"line":223},[206,286,288],{"class":287},"sTEyZ","MPESA_API_KEY",[206,290,292],{"class":291},"sMK4o","=",[206,294,295],{"class":291},"\"",[206,297,298],{"class":216},"sua api key",[206,300,301],{"class":291},"\"\n",[206,303,305,308,310,313,316],{"class":208,"line":304},3,[206,306,307],{"class":287},"MPESA_PUBLIC_KEY",[206,309,292],{"class":291},[206,311,312],{"class":291}," \"",[206,314,315],{"class":216},"Sua public key",[206,317,301],{"class":291},[206,319,321,324,326,329],{"class":208,"line":320},4,[206,322,323],{"class":287},"MPESA_API_URL",[206,325,292],{"class":291},[206,327,328],{"class":216},"api.sandbox.vm.co.mz",[206,330,331],{"class":287}," \n",[206,333,335,338,340],{"class":208,"line":334},5,[206,336,337],{"class":287},"MPESA_USE_SSL",[206,339,292],{"class":291},[206,341,342],{"class":216},"false\n",[206,344,346],{"class":208,"line":345},6,[206,347,349],{"emptyLinePlaceholder":348},true,"\n",[206,351,353],{"class":208,"line":352},7,[206,354,355],{"class":281},"# API Security (OBRIGATÓRIO)\n",[206,357,359],{"class":208,"line":358},8,[206,360,361],{"class":281},"# Defina uma chave secreta forte para proteger suas APIs\n",[206,363,365],{"class":208,"line":364},9,[206,366,367],{"class":281},"# Esta chave será usada para autenticar requisições do frontend\n",[206,369,371,374,376,378,381],{"class":208,"line":370},10,[206,372,373],{"class":287},"API_SECRET_KEY",[206,375,292],{"class":291},[206,377,295],{"class":291},[206,379,380],{"class":216},"defina uma chave secreta",[206,382,301],{"class":291},[206,384,386],{"class":208,"line":385},11,[206,387,349],{"emptyLinePlaceholder":348},[206,389,391],{"class":208,"line":390},12,[206,392,393],{"class":281},"# Service Provider Configuration (OPCIONAL mas recomendado)\n",[206,395,397],{"class":208,"line":396},13,[206,398,399],{"class":281},"# Necessário para operações B2B, B2C e Reversal\n",[206,401,403,406,408],{"class":208,"line":402},14,[206,404,405],{"class":287},"MPESA_SERVICE_PROVIDER_CODE",[206,407,292],{"class":291},[206,409,410],{"class":216},"171717\n",[206,412,414,417,419],{"class":208,"line":413},15,[206,415,416],{"class":287},"MPESA_INITIATOR_IDENTIFIER",[206,418,292],{"class":291},[206,420,421],{"class":216},"MPesa2018\n",[206,423,425,428,430],{"class":208,"line":424},16,[206,426,427],{"class":287},"MPESA_SECURITY_CREDENTIAL",[206,429,292],{"class":291},[206,431,432],{"class":216},"Mpesa2019\n",[59,434,436],{"id":435},"_4-testar-localmente","4. Testar localmente",[32,438,439],{},"Antes de fazer o deploy, teste o projeto no seu ambiente local:",[196,441,443],{"className":198,"code":442,"language":200,"meta":201,"style":201},"pnpm run dev\n",[203,444,445],{"__ignoreMap":201},[206,446,447,449,452],{"class":208,"line":209},[206,448,250],{"class":212},[206,450,451],{"class":216}," run",[206,453,454],{"class":216}," dev\n",[32,456,457,458,462,463],{},"Acesse ",[266,459,460],{"href":460,"rel":461},"http://localhost:3000",[270],", se tudo estiver configurado corretamente, o status da api estará ok, como na imagem abaixo:\n",[464,465],"img",{"alt":466,"src":467},"Status da API","/status.jpeg",[32,469,470],{},"Acesse as página de testes para fazer os testes de todas as funcionalidades com formulários intuitivos e visualização de respostas em tempo real.",[32,472,473],{},"Acesse a página da documentação para aprender como integrar as APIs no seu frontend com exemplos práticos e detalhados.",[59,475,477],{"id":476},"_5-fazer-deploy-na-vercel","5. Fazer Deploy na Vercel",[479,480,481],"ol",{},[482,483,484],"li",{},"Crie uma conta em vercel.com",[32,486,487],{},"Clique em “Add New Project” → “Import Git Repository”.",[479,489,490,493],{"start":223},[482,491,492],{},"Escolha o repositório clonado no GitHub.",[482,494,495],{},"Configure as variáveis de ambiente na aba Environment Variables:",[497,498,499,501,503,505,507,509,511,513],"ul",{},[482,500,288],{},[482,502,307],{},[482,504,323],{},[482,506,337],{},[482,508,373],{},[482,510,405],{},[482,512,416],{},[482,514,427],{},[479,516,517],{"start":334},[482,518,519],{},"Clique em Deploy.",[32,521,522,523],{},"Em menos de 2 minutos, a Vercel compila e coloca o seu backend online com um domínio gratuito como:\n",[266,524,525],{"href":525,"rel":526},"https://mpesa-backend-ready.vercel.app",[270],[184,528,530],{"id":529},"minha-conclusão","Minha conclusão",[32,532,533],{},"Criar um backend M-Pesa do zero pode parecer uma tarefa impossível no início, mas com as ferramentas certas, torna-se um processo acessível e educativo.\nCom este projeto pronto para deploy, qualquer iniciante pode colocar a sua API no ar em minutos — aprendendo, testando e evoluindo com segurança.",[32,535,536],{},"O futuro do desenvolvimento em Moçambique depende de acesso, partilha de conhecimento e colaboração.\nE este é apenas o primeiro passo para transformar ideias locais em soluções digitais reais.",[32,538,541,545],{"align":539,"style":540},"right","font-size: 12px;",[542,543,544],"i",{}," texto aprimorado por IA","🤖",[547,548,549],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":201,"searchDepth":223,"depth":223,"links":551},[552,558,559,560,561,562,563],{"id":61,"depth":223,"text":62,"children":553},[554,555,556,557],{"id":66,"depth":304,"text":67},{"id":92,"depth":304,"text":93},{"id":110,"depth":304,"text":111},{"id":136,"depth":304,"text":137},{"id":156,"depth":223,"text":157},{"id":190,"depth":223,"text":191},{"id":236,"depth":223,"text":237},{"id":256,"depth":223,"text":257},{"id":435,"depth":223,"text":436},{"id":476,"depth":223,"text":477},"2025-10-15T00:00:00.000Z","Um olhar realista sobre as dificuldades enfrentadas por desenvolvedores moçambicanos ao integrar a API do M-Pesa, e como um backend pronto para deploy na Vercel pode simplificar esse processo.","md","/mpesa-starter-api.png",{},{"title":10,"description":565},"mwQRQMkpyUgT-r7pOSXrQ_kUoVJ9ft8SKtGtbf6vlZ4",[572,573],null,{"title":14,"path":15,"stem":16,"description":574,"children":-1},"Conheça o Ofuzah, um app grátis para Windows que permite bloquear ou permitir o acesso à Internet de cada aplicação, ideal para poupar dados móveis quando usa o hotspot do telemóvel.",1792227169675]