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:
- signature: Assinatura digital para validação.
- timestamp: Carimbo de data/hora da requisição.
- nonce: Número aleatório gerado pelo servidor.
- 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
signaturerecebido. Se forem idênticos, o servidor deve responder exclusivamente com o valor deechostr.
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.