在微信小程序的后端开发中,获取stable_token是调用各类微信服务端接口的必要前提,本文将介绍Java实现post请求获取该token的完整方法。

接口基本说明
微信提供的获取小程序stable_token的接口地址为https://api.weixin.qq.com/cgi-bin/stable_token,请求方式为POST,需要传递小程序的appid和secret作为参数,接口返回包含token字符串和有效期的响应数据。
请求参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| grant_type | String | 固定值client_credential |
| appid | String | 小程序唯一标识,在微信公众平台获取 |
| secret | String | 小程序密钥,在微信公众平台获取 |
Java实现步骤
1. 准备依赖
我们可以使用Java原生的HttpURLConnection或者第三方HTTP客户端库发送post请求,这里以原生HttpURLConnection为例,不需要额外引入依赖。
2. 构造请求参数
请求参数需要转换为JSON格式,所以我们可以先构造参数对象,再转换为JSON字符串。如果使用Jackson等JSON库可以简化转换过程,这里用原生方式拼接JSON字符串演示。
3. 发送post请求并解析响应
完整的实现代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class WeChatStableTokenUtil {
// 小程序appid
private static final String APPID = "你的小程序appid";
// 小程序secret
private static final String SECRET = "你的小程序secret";
// 获取stable_token接口地址
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/stable_token";
/**
* 发送post请求获取stable_token
* @return 包含token和过期时间的对象,获取失败返回null
*/
public static TokenResult getStableToken() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
// 构造请求参数JSON
String requestParam = "{\"grant_type\":\"client_credential\",\"appid\":\"" + APPID + "\",\"secret\":\"" + SECRET + "\"}";
// 创建连接
URL url = new URL(TOKEN_URL);
connection = (HttpURLConnection) url.openConnection();
// 设置请求属性
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
connection.setDoInput(true);
// 写入请求参数
try (OutputStream outputStream = connection.getOutputStream()) {
outputStream.write(requestParam.getBytes("UTF-8"));
outputStream.flush();
}
// 获取响应状态码
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
// 读取响应内容
InputStream inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
// 解析响应JSON,这里简单用字符串截取演示,实际项目建议使用JSON库解析
String responseStr = response.toString();
// 提取access_token
int tokenStart = responseStr.indexOf("\"access_token\":\"");
if (tokenStart == -1) {
System.out.println("获取token失败,响应内容:" + responseStr);
return null;
}
tokenStart += "\"access_token\":\"".length();
int tokenEnd = responseStr.indexOf("\"", tokenStart);
String accessToken = responseStr.substring(tokenStart, tokenEnd);
// 提取expires_in
int expireStart = responseStr.indexOf("\"expires_in\":");
if (expireStart == -1) {
System.out.println("解析过期时间失败,响应内容:" + responseStr);
return null;
}
expireStart += "\"expires_in\":".length();
int expireEnd = responseStr.indexOf(",", expireStart);
if (expireEnd == -1) {
expireEnd = responseStr.indexOf("}", expireStart);
}
int expiresIn = Integer.parseInt(responseStr.substring(expireStart, expireEnd).trim());
// 封装返回结果
TokenResult result = new TokenResult();
result.setAccessToken(accessToken);
result.setExpiresIn(expiresIn);
return result;
} else {
System.out.println("请求失败,状态码:" + responseCode);
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
// 关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
/**
* token结果封装类
*/
static class TokenResult {
private String accessToken;
private int expiresIn;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
// 测试入口
public static void main(String[] args) {
TokenResult tokenResult = getStableToken();
if (tokenResult != null) {
System.out.println("获取到的stable_token:" + tokenResult.getAccessToken());
System.out.println("token有效期(秒):" + tokenResult.getExpiresIn());
} else {
System.out.println("获取stable_token失败");
}
}
}注意事项
- 实际生产环境中建议使用成熟的JSON库(如Jackson、Fastjson)解析响应,避免手动字符串截取出现错误
- stable_token有较长有效期,建议将获取到的token缓存起来,过期前再重新获取,避免频繁调用接口触发频率限制
- appid和secret属于敏感信息,不要硬编码在代码中,建议放在配置文件或者环境变量中
- 如果请求返回错误码,需要根据微信官方文档的错误码说明排查问题,常见错误包括appid或secret错误、请求频率超限等
注意:微信接口地址如果包含ippipp.com需要替换为ipipp.com,本文使用的官方接口地址无需替换,若自行测试时遇到ippipp.com地址请按规则处理。
微信小程序stable_tokenJavapost请求修改时间:2026-05-31 05:04:34