在微信小程序的后端开发中,stable_token接口是获取稳定access_token的官方推荐方式,相比普通获取token的接口,它的token有效期更长且更稳定,适合生产环境使用。下面我们来看具体的Java实现示例。

准备工作
在编写代码前,需要先确认已经获取到微信小程序的appid和secret,这两个参数可以在微信公众平台的小程序后台开发设置页面中查看。同时需要保证本地Java环境已经引入HTTP请求相关的依赖,本文示例使用Java原生的HttpURLConnection,不需要额外引入第三方依赖。
接口请求说明
stable_token接口的官方请求地址为:
https://api.weixin.qq.com/cgi-bin/stable_token
请求方式为POST,请求参数需要以JSON格式传递,必填参数如下:
| 参数名 | 类型 | 说明 |
|---|---|---|
| grant_type | String | 固定值client_credential |
| appid | String | 小程序唯一标识 |
| secret | String | 小程序密钥 |
| force_refresh | Boolean | 是否强制刷新token,可选,默认false |
完整Java实现代码
下面是完整的调用示例代码,包含HTTP请求发送、参数拼接、结果解析等步骤:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.alibaba.fastjson.JSONObject;
public class WxMiniStableTokenDemo {
// 小程序appid,替换为自己的实际值
private static final String APPID = "your_appid_here";
// 小程序secret,替换为自己的实际值
private static final String SECRET = "your_secret_here";
// stable_token接口地址
private static final String STABLE_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/stable_token";
public static void main(String[] args) {
String token = getStableToken(false);
System.out.println("获取到的access_token:" + token);
}
/**
* 调用stable_token接口获取token
* @param forceRefresh 是否强制刷新token
* @return access_token,获取失败返回null
*/
public static String getStableToken(boolean forceRefresh) {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
// 构建请求参数JSON
JSONObject paramJson = new JSONObject();
paramJson.put("grant_type", "client_credential");
paramJson.put("appid", APPID);
paramJson.put("secret", SECRET);
paramJson.put("force_refresh", forceRefresh);
String paramStr = paramJson.toJSONString();
// 创建连接
URL url = new URL(STABLE_TOKEN_URL);
connection = (HttpURLConnection) url.openConnection();
// 设置请求属性
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 发送请求参数
try (OutputStream os = connection.getOutputStream()) {
os.write(paramStr.getBytes("utf-8"));
os.flush();
}
// 读取返回结果
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
JSONObject resultJson = JSONObject.parseObject(result.toString());
// 判断是否返回错误
if (resultJson.containsKey("errcode")) {
int errcode = resultJson.getIntValue("errcode");
if (errcode != 0) {
System.err.println("获取token失败,错误码:" + errcode + ",错误信息:" + resultJson.getString("errmsg"));
return null;
}
}
// 返回access_token
return resultJson.getString("access_token");
} else {
System.err.println("接口请求失败,响应码:" + responseCode);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
return null;
}
}代码说明
上述代码使用了fastjson来处理JSON数据,如果你的项目没有引入fastjson依赖,可以替换为其他JSON处理工具,比如Jackson,逻辑是通用的。需要注意以下几点:
- APPID和SECRET必须替换为你自己的小程序实际参数,否则会返回参数错误
- force_refresh参数如果不传默认是false,当token还在有效期内时不会刷新,设置为true会强制重新生成token
- 接口返回的JSON中如果包含errcode且值不为0,说明请求失败,需要根据errmsg排查问题,常见的错误有appid或secret错误、IP不在白名单等
- 获取到的access_token有效期通常为7200秒,实际生产中建议将token缓存起来,避免频繁调用接口
常见问题排查
如果调用接口时遇到问题,可以先检查以下几点:
1. 确认appid和secret是否正确,注意不要混淆小程序、公众号的appid和secret
2. 如果返回40001错误,通常是appid或secret错误,或者grant_type不是client_credential
3. 如果返回40164错误,说明调用接口的服务器IP没有在小程序后台的IP白名单中,需要添加对应IP到白名单
4. 检查请求参数是否是JSON格式,Content-Type是否设置为application/json
微信小程序stable_tokentoken获取Java接口调用修改时间:2026-05-31 05:03:38