1. 环境准备与注册
1.1 申请并获取 AppID/AppSecret
微信小程序的 AppID/AppSecret是后端接入的核心凭证,务必在微信开放平台完成注册并创建小程序项目。
在注册完成后进入开发设置,可以看到 AppID 与 AppSecret,请将它们妥善保存,并避免在前端代码中暴露。
1.2 本地开发环境配置
本教程以 Java 11+ 为示例开发语言,推荐使用 Maven/Gradle 进行依赖管理,搭配 IDE(如 IntelliJ IDEA)进行快速开发。
关键依赖包括:
Http 客户端、JSON 解析、以及 AES 解密相关的加密库。通过构建工具即可快速引入,例如导入 org.apache.commons:commons-codec、com.fasterxml.jackson.core:jackson-databind 等。
2. 服务端架构概览
2.1 主要接口的调用流程
在 Java 开发微信小程序接口的全流程中,前端通过 wx.login 获取临时 code,服务器端使用 code2Session 接口换取 session_key 与 openid,随后可以进行数据解密和业务逻辑处理。
从接入到调用的完整实战指南强调在服务器端集中管理凭证、对敏感数据进行解密及校验,以确保安全和稳定性。

3. 获取并管理 access_token
3.1 为什么需要 access_token
部分微信接口(如模板消息、数据拉取等)需要通过全局 access_token 进行鉴权,需按官方规范定期刷新并缓存,避免重复请求带来的性能损耗。
token 的有效期通常较短,必须实现自动续期逻辑并妥善缓存,避免因令牌失效导致接口请求失败。
3.2 Java 示例:获取 access_token
// Java 11+ 示例:获取全局 access_token
String appId = "YOUR_APP_ID";
String appSecret = "YOUR_APP_SECRET";
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());if (response.statusCode() == 200) {JSONObject json = new JSONObject(response.body());String accessToken = json.getString("access_token");int expiresIn = json.getInt("expires_in");// 将 accessToken 缓存到合适的位置,并定时刷新
}
4. 使用 code2Session 获取 session_key 与 openid
4.1 调用入口与参数
前端通过 wx.login 获取临时的 code,服务器端通过 code2Session 接口换取 session_key 与 openid,以进行后续数据处理。
请求参数包括 appid、secret、js_code 和 grant_type,需遵循官方规定的编码方式与错误码处理。
4.2 Java 示例:发送 code2Session 请求
// code2Session 示例:通过 code 换取 session_key 与 openid
String appId = "YOUR_APP_ID";
String appSecret = "YOUR_APP_SECRET";
String jsCode = "RECEIVED_CODE_FROM_FRONTEND";
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId +"&secret=" + appSecret + "&js_code=" + jsCode +"&grant_type=authorization_code";HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());if (response.statusCode() == 200) {JSONObject json = new JSONObject(response.body());String sessionKey = json.optString("session_key", null);String openId = json.optString("openid", null);// 将 sessionKey 与 openId 与业务数据关联存储
}
5. 解密用户数据与数据安全
5.1 处理 encryptedData 与 iv
微信小程序端回传的 encryptedData 与 iv 需要借助 session_key 进行解密,解密后的数据通常包含用户信息、头像、手机号等敏感字段。
AES/CBC/PKCS5Padding 是常用的解密模式,正确的解密流程能确保数据的可用性与完整性。
5.2 Java 示例:AES-CBC 解密
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.nio.charset.StandardCharsets;public static String decryptData(String encryptedData, String sessionKey, String iv) throws Exception {byte[] data = Base64.getDecoder().decode(encryptedData);byte[] key = Base64.getDecoder().decode(sessionKey);byte[] ivBytes = Base64.getDecoder().decode(iv);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(key, "AES");IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] decrypted = cipher.doFinal(data);return new String(decrypted, StandardCharsets.UTF_8);
}
5.3 结果校验与数据完整性
为了防止数据被篡改,需要对原始数据 rawData 与 session_key 进行签名校验,官方要求使用 SHA1 算法进行比对。
import java.security.MessageDigest;public static boolean verifySignature(String rawData, String sessionKey, String signature) throws Exception {String toSign = rawData + sessionKey;MessageDigest md = MessageDigest.getInstance("SHA-1");byte[] digest = md.digest(toSign.getBytes(StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b));}String computed = sb.toString();return computed.equalsIgnoreCase(signature);
}
6. 调用其他微信小程序接口的实际流程
6.1 发送模板消息
模板消息是常见的业务通知场景,调用需要 access_token 并发送合规的 JSON 负载。
典型流程包括:先获取 access_token、构造符合要求的 payload、再通过 POST 请求提交给官方接口。
// 发送模板消息示例
String accessToken = "已缓存的 access_token";
String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + accessToken;
String payload = "{"+ "\"touser\":\"OPENID\","+ "\"template_id\":\"TEMPLATE_ID\","+ "\"page\":\"index\","+ "\"form_id\":\"FORM_ID\","+ "\"data\":{ ... }"+ "}";HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).POST(HttpRequest.BodyPublishers.ofString(payload)).header("Content-Type", "application/json").build();
HttpResponse<String> resp = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
// 根据 resp.setStatus 及返回 JSON 进行业务处理
6.2 数据安全与日志追踪
在调用各类接口时,务必做好 错误码处理、重试机制,以及对关键参数(如 openid、session_key、access_token)进行安全级别较高的日志记录与脱敏处理。
7. 常见异常处理与日志
7.1 常见错误码及含义
常见错误如 40001(invalid credential)、40002(invalid grant_type)、45009(频率限制)、40003(非法请求) 等,需要在后端实现统一的错误码映射与重试策略。
建议使用统一的异常封装类,在业务中对每种错误返回明确的错误信息和处理路径。
7.2 日志与监控
采用结构化日志记录关键字段,如 traceId、openId、requestId、时间戳等,便于跨服务链路追踪。
对接口调用进行度量与告警,确保在高并发时也能保持稳定性与可观测性。


