微信开发小程序开发授权获取 access_token
在小程序开发中,不能够把https://api.weixin.qq.com放到前台请求,发不出来肯定是不能够使用的,微信小程序也已经发布了通知。
后端 API
小程序还提供了一系列在后端服务器使用 HTTPS 请求调用的 API,帮助开发者在后台完成各类数据分析、管理和查询等操作。如 getAccessToken
,code2Session
等。详细介绍请参考 API 文档。
access_token
access_token
是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken
接口获取并进行妥善保存。
为了 access_token
的安全性,后端 API 不能直接在小程序内通过 wx.request 调用,即 api.weixin.qq.com
不能被配置为服务器域名。开发者应在后端服务器使用getAccessToken
获取 access_token
,并调用相关 API;
请求参数说明
- 对于 GET 请求,请求参数应以 QueryString 的形式写在 URL 中。
- 对于 POST 请求,部分参数需以 QueryString 的形式写在 URL 中(一般只有
access_token
,如有额外参数会在文档里的 URL 中体现),其他参数如无特殊说明均以 JSON 字符串格式写在 POST 请求的 body 中。
返回参数说明
注意:当API调用成功时,部分接口不会返回 errcode 和 errmsg,只有调用失败时才会返回。
实现代码:
@Service
public class WechatAccessTokenService {@Value("${wechat.app-id}")private String appId;@Value("${wechat.app-secret}")private String appSecret;private final OkHttpClient httpClient = new OkHttpClient();// 内存缓存(简单实现,生产环境建议用Redis)private String cachedAccessToken;private long tokenExpireTime;/*** 获取微信AccessToken*/public String getAccessToken() throws IOException {// 检查缓存是否有效(提前5分钟过期)if (cachedAccessToken != null && System.currentTimeMillis() < tokenExpireTime - 300000) {return cachedAccessToken;}// 从微信API获取新tokenString url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appId, appSecret);Request request = new Request.Builder().url(url).build();try (Response response = httpClient.newCall(request).execute()) {if (!response.isSuccessful()) {throw new IOException("HTTP请求失败: " + response.code());}String responseBody = response.body().string();// 解析JSON响应JsonObject jsonResponse = JsonParser.parseString(responseBody).getAsJsonObject();if (jsonResponse.has("errcode") && jsonResponse.get("errcode").getAsInt() != 0) {throw new IOException("微信接口错误: " + jsonResponse.get("errmsg").getAsString());}String accessToken = jsonResponse.get("access_token").getAsString();int expiresIn = jsonResponse.get("expires_in").getAsInt();// 更新缓存this.cachedAccessToken = accessToken;this.tokenExpireTime = System.currentTimeMillis() + (expiresIn * 1000);return accessToken;}}
}
@RestController
public class AccessTokenController {@Autowiredprivate WechatAccessTokenService wechatAccessTokenService;/*** 获取AccessToken接口* GET /getAccessToken*/@GetMapping("/getAccessToken")public Map<String, Object> getAccessToken() {Map<String, Object> response = new HashMap<>();try {String accessToken = wechatAccessTokenService.getAccessToken();response.put("code", 200);response.put("msg", "成功");response.put("data", Map.of("access_token", accessToken,"expires_in", 7200));} catch (Exception e) {response.put("code", 500);response.put("msg", "获取AccessToken失败: " + e.getMessage());response.put("data", null);}return response;}
}