Java 后端实现微信网页授权、获取 access_token 与 openid 及推送模板消息的代码详解
微信网页授权和获取 `access_token` 和 `openid` 的过程通常涉及前端和后端的协作。以下是一个简化的流程和示例代码,展示如何在 Java 后端中获取 `access_token` 和 `openid`,以及如何推送微信模板消息。 1. 前端获取授权 首先,用户在前端点击一个按钮或其他元素,以触发微信授权。 ```html <!-- 引入微信 JS SDK --> <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> wx.config({ debug: true, appId: 'YOUR_APP_ID', timestamp: YOUR_TIMESTAMP, nonceStr: 'YOUR_NONCE_STR', signature: 'YOUR_SIGNATURE', jsApiList: ['chooseImage', 'uploadImage'] }); </script> ``` 2. 后端获取 access_token 和 openid 当用户在前端完成授权后,微信会将用户重定向回你指定的回调 URL,并携带一个 code 参数。你需要使用这个 code 参数向后端请求 `access_token` 和 `openid`。 请求 access_token 和 openid ```java import java.net.HttpURLConnection; import java.net.URL; import java.io.BufferedReader; import java.io.InputStreamReader; import org.json.JSONObject; public class WeChatService { private static final String APP_ID = "YOUR_APP_ID"; private static final String APP_SECRET = "YOUR_APP_SECRET"; private static final String TOKEN = "YOUR_TOKEN"; // 验证用的令牌,用于防止 CSRF 攻击 private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&code="; private static final String OPENID_URL = "https://api.weixin.qq.com/sns/userinfo?access_token="; public static JSONObject getAccessTokenAndOpenId(String code) throws Exception { String urlString = ACCESS_TOKEN_URL + code; URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); return new JSONObject(response.toString()); // 解析返回的 JSON 字符串为 JSONObject } } ``` 3. 使用 access_token 和 openid 推送模板消息 使用 `access_token` 和 `openid` 来推送微信模板消息。这通常在后端完成。 推送模板消息的请求: 注意:为了推送模板消息,你需要在微信公众平台上设置模板并获取模板ID。 * 请求地址:`https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN` * 请求方法:POST * 请求数据:JSON 格式,参考微信官方文档。以下是一个示例: ```java public static void sendTemplateMessage(String accessToken, String openId, String templateId, JSONObject data) throws Exception { String urlString = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken; URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 需要设置允许输出数据,否则请求无法发送。 connection.setRequestProperty("Content-Type", "application/json"); // 设置请求的内容类型为 JSON。 try (OutputStream os = connection.getOutputStream()) { // 注意:需要捕获异常,防止出现资源泄露。 os.write(JSONObject.toJSONString(data).getBytes("UTF-8")); // 将 JSON 数据转换为字节数组并写入输出流。注意:这里使用了 UTF-8 编码。 } catch (Exception e) ######[AI写代码神器 | 1023点数解答 | 2024-02-28 10:21:50]
- 钉钉消息标题不显示及加速问题排查与代码改进方案(阿里通义 | 497点数解答 | 2024-10-15 22:54:56)474
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)423
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)325
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1203
- Java技巧:用 indexOf 方法获取字符串中某子字符串所有出现位置( | 691点数解答 | 2023-12-28 19:49:03)330
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)365
- Oracle:为 osp 用户授予表空间 users 表的增删改查权限( | 135点数解答 | 2023-12-27 16:38:20)339
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)248
- Spring项目:实现UserMapper接口及XML映射文件,查询所有用户信息(GPT | 445点数解答 | 2024-09-12 14:40:40)207
- 解决 consoleapplication40.cpp 中 buildtree 模板参数推导失败错误的方法(字节豆包 | 138点数解答 | 2024-11-10 23:42:06)248
- Android 课程作业考试管理 APP 开发:全功能实现与上线优化之路(GPT | 84点数解答 | 2024-12-14 13:46:35)285
- Android 学生学习管理 APP:功能完备开发全攻略(字节豆包 | 30点数解答 | 2024-12-14 13:47:04)245