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

微信获取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类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccessToken {private String access_token;//过期时间【此处的过期时间我求的是时间戳为多少的时候过期,而不是一个时间段】private long expires_time;public AccessToken(String access_token, Integer expires_in){this.access_token = access_token;expires_time = System.currentTimeMillis() + expires_in * 1000;}public boolean isExpire(){return System.currentTimeMillis() > expires_time;}
}
②创建配置类,读取application.properties的appId与secret
@Configuration
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WxConfig {@Value("${wx.appId}")public String appId;@Value("${wx.secret}")public String secret;}

我们测试账号的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


<dependency><groupId>com.squareup.okhttp3groupId><artifactId>okhttpartifactId><version>3.8.0version>
dependency>

service:

@Service
public class WxService {//注入appId与secret@Autowiredprivate WxConfig wxConfig;//请求微信地址【get方式】private String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** 获取accessToken** @return*/public AccessToken getAccessToken() {String APPID = wxConfig.getAppId();String SECRET = wxConfig.getSecret();//拼接url【传入appId和secret】url = url.replace("APPID", APPID).replace("APPSECRET", SECRET);OkHttpClient client = new OkHttpClient();//构建请求Request request = new Request.Builder().url(url).build();Call call = client.newCall(request);Response response = null;try {//获取响应体response = call.execute();//{"access_token":"ACCESS_TOKEN","expires_in":7200} 返回体类型if (response != null) {ResponseBody body = response.body();String bodyStr = body.string();JSONObject jsonObject = JSONObject.parseObject(bodyStr);//获取过期时间String access_token = (String) jsonObject.get("access_token");Integer expires_in = (Integer) jsonObject.get("expires_in");AccessToken accessToken = new AccessToken(access_token, expires_in);return accessToken;}} catch (IOException e) {e.printStackTrace();}return null;}}

2 自定义公众号菜单

官方文档:
https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

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

 {"button":[{	"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC"},{"name":"菜单","sub_button":[{	"type":"view","name":"搜索","url":"http://www.soso.com/"},{"type":"miniprogram","name":"wxa","url":"http://mp.weixin.qq.com","appid":"wx286b93c14bbf93aa","pagepath":"pages/lunar/index"},{"type":"click","name":"赞一下我们","key":"V1001_GOOD"}]}]}
①导入依赖
 <dependency><groupId>com.squareup.okhttp3groupId><artifactId>okhttpartifactId><version>3.8.0version>dependency><dependency><groupId>com.alibabagroupId><artifactId>fastjsonartifactId><version>1.2.83version>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.24version>dependency>
②基础类创建【准备拼接返回json】

AbstractButton :

@Data
@NoArgsConstructor
public abstract class AbstractButton {private String name;public AbstractButton(String name){this.name = name;}
}

BaseButton :

@Data
public class BaseButton {@JSONField(name = "button")private List<AbstractButton> buttonList = new ArrayList<>();
}

ClickButton :

@Data
@NoArgsConstructor
public class ClickButton extends AbstractButton{private String type = "click";private String key;public ClickButton(String name){super(name);}
}

SubButton :

@Data
@NoArgsConstructor
public class SubButton extends AbstractButton{@JSONField(name = "sub_button")private List<AbstractButton> buttonList = new ArrayList<>();public SubButton(String name){super(name);}
}

ViewButton :

@Data
@NoArgsConstructor
public class ViewButton extends AbstractButton{private String type = "view";private String url;public ViewButton(String name){super(name);}
}

其他按钮参考该模式实现

③service实现

@Service
public class WxService {//自定义菜单【post方式】private String url_post = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8");/*** 测试自定义菜单*/public String testButtonBySelf(){//创建菜单对象BaseButton baseButton = new BaseButton();//第一部分一级菜单:创建clickButtonClickButton clickButton = new ClickButton("点击有惊喜");clickButton.setKey("click1001");//第二部分一级菜单:创建子菜单SubButton subButton = new SubButton("菜单");//创建子菜单中的viewButtonViewButton subViewButton = new ViewButton("百度一下");subViewButton.setUrl("https://www.baidu.com/");ClickButton subClickButton = new ClickButton("子菜单下的点击");subClickButton.setKey("subButtonClick1002");//将子菜单中的button添加到子菜单中List<AbstractButton> subButtonList = subButton.getButtonList();subButtonList.add(subViewButton);subButtonList.add(subClickButton);//第三部分一级菜单:创建viewButtonViewButton viewButton = new ViewButton("网易新闻");viewButton.setUrl("https://www.163.com/");//拼接buttonList<AbstractButton> baseButtonList = baseButton.getButtonList();baseButtonList.add(clickButton);baseButtonList.add(subButton);baseButtonList.add(viewButton);String jsonStr = JSONObject.toJSONString(baseButton);//发送POST请求OkHttpClient okHttpClient = new OkHttpClient();//请求体RequestBody body = RequestBody.create(TYPE_JSON, jsonStr);System.out.println("jsonStr========>" + jsonStr);//添加accessTokenAccessToken accessToken = getAccessToken();String access_token = accessToken.getAccess_token();url_post = url_post.replaceAll("ACCESS_TOKEN", access_token);Request request = new Request.Builder().url(url_post).post(body).build();try {String responseStr = okHttpClient.newCall(request).execute().body().string();System.out.println(responseStr);return responseStr;} catch (IOException e) {e.printStackTrace();}return "";}
}
④controller调用
@RestController
public class WxController {@Autowiredprivate WxService wxService;@GetMapping("/testButton")public String testButton(){String s = wxService.testButtonBySelf();return s;}
}
⑤测试

控制台打印:

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

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


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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部