微信获取accessToken及自定义公众号菜单

喜欢ヅ旅行 2024-04-03 13:20 249阅读 0赞

微信获取accessToken及自定义公众号菜单

1 微信获取accessToken

1.1 accessToken介绍及接口文档

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

详细介绍:https://developers.weixin.qq.com/doc/offiaccount/Basic\_Information/Get\_access\_token.html

在这里插入图片描述

1.2 获取accessToken

①创建AccessToken类
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class AccessToken {
  5. private String access_token;
  6. //过期时间【此处的过期时间我求的是时间戳为多少的时候过期,而不是一个时间段】
  7. private long expires_time;
  8. public AccessToken(String access_token, Integer expires_in){
  9. this.access_token = access_token;
  10. expires_time = System.currentTimeMillis() + expires_in * 1000;
  11. }
  12. public boolean isExpire(){
  13. return System.currentTimeMillis() > expires_time;
  14. }
  15. }
②创建配置类,读取application.properties的appId与secret
  1. @Configuration
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class WxConfig {
  6. @Value("${wx.appId}")
  7. public String appId;
  8. @Value("${wx.secret}")
  9. public String secret;
  10. }

我们测试账号的appID与secret在:
https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
在这里插入图片描述
测试账号申请参考:https://editor.csdn.net/md/?articleId=127282111

③获取accessToken

报文发送,我采用okHttp

  1. <!--报文发送-->
  2. <dependency>
  3. <groupId>com.squareup.okhttp3</groupId>
  4. <artifactId>okhttp</artifactId>
  5. <version>3.8.0</version>
  6. </dependency>

service:

  1. @Service
  2. public class WxService {
  3. //注入appId与secret
  4. @Autowired
  5. private WxConfig wxConfig;
  6. //请求微信地址【get方式】
  7. private String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
  8. /**
  9. * 获取accessToken
  10. *
  11. * @return
  12. */
  13. public AccessToken getAccessToken() {
  14. String APPID = wxConfig.getAppId();
  15. String SECRET = wxConfig.getSecret();
  16. //拼接url【传入appId和secret】
  17. url = url.replace("APPID", APPID).replace("APPSECRET", SECRET);
  18. OkHttpClient client = new OkHttpClient();
  19. //构建请求
  20. Request request = new Request.Builder().url(url).build();
  21. Call call = client.newCall(request);
  22. Response response = null;
  23. try {
  24. //获取响应体
  25. response = call.execute();
  26. //{"access_token":"ACCESS_TOKEN","expires_in":7200} 返回体类型
  27. if (response != null) {
  28. ResponseBody body = response.body();
  29. String bodyStr = body.string();
  30. JSONObject jsonObject = JSONObject.parseObject(bodyStr);
  31. //获取过期时间
  32. String access_token = (String) jsonObject.get("access_token");
  33. Integer expires_in = (Integer) jsonObject.get("expires_in");
  34. AccessToken accessToken = new AccessToken(access_token, expires_in);
  35. return accessToken;
  36. }
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. return null;
  41. }
  42. }

2 自定义公众号菜单

官方文档:
https://developers.weixin.qq.com/doc/offiaccount/Custom\_Menus/Creating\_Custom-Defined\_Menu.html

在这里插入图片描述
请求示例:

  1. {
  2. "button":[
  3. {
  4. "type":"click",
  5. "name":"今日歌曲",
  6. "key":"V1001_TODAY_MUSIC"
  7. },
  8. {
  9. "name":"菜单",
  10. "sub_button":[
  11. {
  12. "type":"view",
  13. "name":"搜索",
  14. "url":"http://www.soso.com/"
  15. },
  16. {
  17. "type":"miniprogram",
  18. "name":"wxa",
  19. "url":"http://mp.weixin.qq.com",
  20. "appid":"wx286b93c14bbf93aa",
  21. "pagepath":"pages/lunar/index"
  22. },
  23. {
  24. "type":"click",
  25. "name":"赞一下我们",
  26. "key":"V1001_GOOD"
  27. }]
  28. }]
  29. }
①导入依赖
  1. <!--报文发送-->
  2. <dependency>
  3. <groupId>com.squareup.okhttp3</groupId>
  4. <artifactId>okhttp</artifactId>
  5. <version>3.8.0</version>
  6. </dependency>
  7. <!--处理json数据-->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>fastjson</artifactId>
  11. <version>1.2.83</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.projectlombok</groupId>
  15. <artifactId>lombok</artifactId>
  16. <version>1.18.24</version>
  17. </dependency>
②基础类创建【准备拼接返回json】

AbstractButton :

  1. @Data
  2. @NoArgsConstructor
  3. public abstract class AbstractButton {
  4. private String name;
  5. public AbstractButton(String name){
  6. this.name = name;
  7. }
  8. }

BaseButton :

  1. @Data
  2. public class BaseButton {
  3. @JSONField(name = "button")
  4. private List<AbstractButton> buttonList = new ArrayList<>();
  5. }

ClickButton :

  1. @Data
  2. @NoArgsConstructor
  3. public class ClickButton extends AbstractButton{
  4. private String type = "click";
  5. private String key;
  6. public ClickButton(String name){
  7. super(name);
  8. }
  9. }

SubButton :

  1. @Data
  2. @NoArgsConstructor
  3. public class SubButton extends AbstractButton{
  4. @JSONField(name = "sub_button")
  5. private List<AbstractButton> buttonList = new ArrayList<>();
  6. public SubButton(String name){
  7. super(name);
  8. }
  9. }

ViewButton :

  1. @Data
  2. @NoArgsConstructor
  3. public class ViewButton extends AbstractButton{
  4. private String type = "view";
  5. private String url;
  6. public ViewButton(String name){
  7. super(name);
  8. }
  9. }

其他按钮参考该模式实现

③service实现
  1. @Service
  2. public class WxService {
  3. //自定义菜单【post方式】
  4. private String url_post = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
  5. public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
  6. /**
  7. * 测试自定义菜单
  8. */
  9. public String testButtonBySelf(){
  10. //创建菜单对象
  11. BaseButton baseButton = new BaseButton();
  12. //第一部分一级菜单:创建clickButton
  13. ClickButton clickButton = new ClickButton("点击有惊喜");
  14. clickButton.setKey("click1001");
  15. //第二部分一级菜单:创建子菜单
  16. SubButton subButton = new SubButton("菜单");
  17. //创建子菜单中的viewButton
  18. ViewButton subViewButton = new ViewButton("百度一下");
  19. subViewButton.setUrl("https://www.baidu.com/");
  20. ClickButton subClickButton = new ClickButton("子菜单下的点击");
  21. subClickButton.setKey("subButtonClick1002");
  22. //将子菜单中的button添加到子菜单中
  23. List<AbstractButton> subButtonList = subButton.getButtonList();
  24. subButtonList.add(subViewButton);
  25. subButtonList.add(subClickButton);
  26. //第三部分一级菜单:创建viewButton
  27. ViewButton viewButton = new ViewButton("网易新闻");
  28. viewButton.setUrl("https://www.163.com/");
  29. //拼接button
  30. List<AbstractButton> baseButtonList = baseButton.getButtonList();
  31. baseButtonList.add(clickButton);
  32. baseButtonList.add(subButton);
  33. baseButtonList.add(viewButton);
  34. String jsonStr = JSONObject.toJSONString(baseButton);
  35. //发送POST请求
  36. OkHttpClient okHttpClient = new OkHttpClient();
  37. //请求体
  38. RequestBody body = RequestBody.create(TYPE_JSON, jsonStr);
  39. System.out.println("jsonStr========>" + jsonStr);
  40. //添加accessToken
  41. AccessToken accessToken = getAccessToken();
  42. String access_token = accessToken.getAccess_token();
  43. url_post = url_post.replaceAll("ACCESS_TOKEN", access_token);
  44. Request request = new Request.Builder().url(url_post).post(body).build();
  45. try {
  46. String responseStr = okHttpClient.newCall(request).execute().body().string();
  47. System.out.println(responseStr);
  48. return responseStr;
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. return "";
  53. }
  54. }
④controller调用
  1. @RestController
  2. public class WxController {
  3. @Autowired
  4. private WxService wxService;
  5. @GetMapping("/testButton")
  6. public String testButton(){
  7. String s = wxService.testButtonBySelf();
  8. return s;
  9. }
  10. }
⑤测试

控制台打印:

  1. jsonStr========>{
  2. "button":[{
  3. "key":"click1001","name":"点击有惊喜","type":"click"},{
  4. "name":"菜单","sub_button":[{
  5. "name":"百度一下","type":"view","url":"https://www.baidu.com/"},{
  6. "key":"subButtonClick1002","name":"子菜单下的点击","type":"click"}]},{
  7. "name":"网易新闻","type":"view","url":"https://www.163.com/"}]}
  8. {
  9. "errcode":0,"errmsg":"ok"}

测试号:
在这里插入图片描述

点击百度一下:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读