Configuração de Servidor e Autenticação na API do WeChat

Entendendo as Contas Oficiais do WeChat

Antes de iniciar a integração técnica, é fundamental distinguir os três tipos principais de contas oferecidas pela plataforma WeChat (MP), pois cada uma possui permissões e objetivos distintos:

  • Contas de Assinatura (Subscription Accounts): Focadas em disseminação de conteúdo e mídia. Permitem o envio frequente de mensagens e são ideais para blogs e portais de notícias.
  • Contas de Serviço (Service Accounts): Voltadas para empresas e serviços ao cliente. Oferecem APIs mais avançadas, incluindo suporte a pagamentos (WeChat Pay), e maior visibilidade nas notificações do usuário.
  • Contas Corporativas (WeChat Work/Enterprise): Utilizadas para comunicação interna e gestão organizacional, restritas a colaboradores da própria empresa.

Ativação do Modo Desenvolvedor

Para interagir programaticamente com o ecossistema WeChat, é necessário configurar um servidor próprio que se comunique com os servidores da Tencent. O processo de ativação exige uma URL pública e um Token de segurança definido pelo desenvolvedor.

Ao registrar a URL no painel administrativo, o WeChat enviará uma requisição GET contendo quatro parâmetros fundamentais:

  1. signature: Assinatura digital para validação.
  2. timestamp: Carimbo de data/hora da requisição.
  3. nonce: Número aleatório gerado pelo servidor.
  4. echostr: String aleatória que deve ser retornada pelo seu servidor se a validação for bem-sucedida.

Lógica de Validação e Segurança

O fluxo de segurança para confirmar que a requisição provém de fato do WeChat segue estes passos:

  • Agrupar o Token (definido por você), o timestamp e o nonce em um array de strings.
  • Ordenar este array em ordem alfabética (diferente de outras APIs que usam pares chave-valor, o WeChat utiliza apenas os valores concatenados).
  • Concatenar as strings resultantes e gerar um hash SHA-1.
  • Comparar o hash gerado localmnete com o parâmetro signature recebido. Se forem idênticos, o servidor deve responder exclusivamente com o valor de echostr.

Implementação em Java

Abaixo, apresentamos uma implementação de referência utilizando Serlvets para gerenciar o handshake inicial.


import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet responsável por gerenciar a autenticação com o servidor WeChat
 */
public class WeChatAuthHandler extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        
        String sign = req.getParameter("signature");
        String time = req.getParameter("timestamp");
        String random = req.getParameter("nonce");
        String echo = req.getParameter("echostr");

        PrintWriter writer = resp.getWriter();
        
        // Verifica a integridade da requisição
        if (WeChatSecurityProvider.isRequestValid(sign, time, random)) {
            writer.print(echo);
        }
        writer.close();
    }
}

A classe utilitária de segurança para procesamento do hash:


import java.security.MessageDigest;
import java.util.Arrays;

public class WeChatSecurityProvider {
    // Este valor deve ser o mesmo configurado no painel do WeChat
    private static final String APP_TOKEN = "SEU_TOKEN_AQUI";

    public static boolean isRequestValid(String signature, String timestamp, String nonce) {
        String[] data = { APP_TOKEN, timestamp, nonce };
        Arrays.sort(data);

        StringBuilder rawContent = new StringBuilder();
        for (String s : data) {
            rawContent.append(s);
        }

        String encrypted = "";
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] digest = md.digest(rawContent.toString().getBytes());
            encrypted = convertToHex(digest);
        } catch (Exception e) {
            return false;
        }

        return encrypted != null && encrypted.equalsIgnoreCase(signature);
    }

    private static String convertToHex(byte[] buffer) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : buffer) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

Configuração do Web XML

Para expor o serviço, registre o Servlet no arquivo de configuração da sua aplicação web:


<servlet>
    <servlet-name>wechatHandler</servlet-name>
    <servlet-class>com.example.wechat.WeChatAuthHandler</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>wechatHandler</servlet-name>
    <url-pattern>/wechat-gateway</url-pattern>
</servlet-mapping>

Após realizar o deploy em um servidor com IP público e HTTPS, basta inserir a URL correspondente (ex: https://meusite.com/wechat-gateway) no portal do desenvolvedor do WeChat e submeter para validação. Uma vez confirmado, a plataforma liberará o acesso ao AppID e AppSecret, essenciais para chamadas de API subsequentes.

Tags: WeChat API Java Servlet SHA-1 Autenticação de Servidor desenvolvimento web

Publicado em 11-2 14:34