前面已经成功的获取了access_token,应该已经猜到,菜单的创建和模板消息的发送这两个接口,都要用到access_token.
菜单的创建
数据结构分析
Button的类型可以分为cilck和view,分别是点击的时间推送和跳转网页.看下面开发文档中的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
|
这是一个button数组,里面有两个按钮分别是"今日歌曲",“菜单”,“菜单"按钮又有二级按钮"搜索”,“视频”,“赞一下我们”.这样分析之后,可知要创建几个实体类来封装json数据包,这里主要以viewbutton为例.
具体实现
新建Button类,ClickButton类(继承Button),VIewButton类(继承Button),和Menu类.各种参数参考开发文档.Button类代码如下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class Button {
private String type;
private String name;
private Button[] sub_button;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public Button[] getSub_button() {
return sub_button;
}
public void setSub_button(Button[] sub_button) {
this.sub_button = sub_button;
}
public void setType(String type) {
this.type = type;
}
}
|
Menu类
1
2
3
4
5
6
7
8
9
10
11
|
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
|
接下来可以看到创建菜单是通过向微信服务器发送POST请求的.所以在WechatUtil类增加一个doPost()方法,同样也是返回JSONOBject对象.传入两个参数:请求地址和需要post的数据(这里是菜单的json数据).
public JSONObject doPost(String url,String outStr){}
接着继续添加代码,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public Menu initMenu(){
Menu menu=new Menu();
ViewButton viewButton=new ViewButton();
viewButton.setUrl("http://http://leezoom.xyz");
viewButton.setName("新建通知");
ViewButton viewButton1=new ViewButton();
viewButton1.setName("课表");
viewButton1.setUrl("http://leezoom.xyz");
//子菜单
ViewButton viewButton2=new ViewButton();
viewButton2.setName("绑定微信");
viewButton2.setUrl("http://leezoom.xyz");
//子菜单
ViewButton viewButton3=new ViewButton();
viewButton3.setName("全部通知");
viewButton3.setUrl("http://leezoom.xyz");
Button button=new Button();
button.setName("我");
button.setSub_button(new Button[]{viewButton3,viewButton2});
menu.setButton(new Button[]{viewButton,viewButton1,button});
return menu;
}
public int creatMenu(String menu,String token){
int errcode=0;
String url=BUtton_URL.replace("ACCESS_TOKEN",token);
JSONObject jsonObject=doPost(url,menu);
if (jsonObject!=null){
errcode=jsonObject.getInt("errcode");
}
return errcode;
}
|
然后也在WechatInitial类中进行测试.
1
2
3
4
5
6
7
8
|
String menu= JSONObject.fromObject(wechatUtil.initMenu()).toString();
int errcode=wechatUtil.creatMenu(menu,access_token);
if (errcode==0){
System.out.println("创建菜单成功");
System.out.println(menu);
}else {
System.out.println("创建菜单失败"+errcode);
}
|
然后然后查看手机微信端,等一下,似乎有延迟,
模板消息的发送(主动发送消息)
数据结果分析
这个做法都差不多,先看看开发文档的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"data":{
"first": {
"value":"恭喜你购买成功!",
"color":"#173177"
},
"keynote1":{
"value":"巧克力",
"color":"#173177"
},
"keynote2": {
"value":"39.8元",
"color":"#173177"
},
"keynote3": {
"value":"2014年9月22日",
"color":"#173177"
},
"remark":{
"value":"欢迎再次购买!",
"color":"#173177"
}
}
}
|
这也太麻烦了,不知是我能力有限还是.直接写好消息然后发送字符串是也可以的,加入几个变量便可实现.但我还是想用JSONObject来组装,于是写了一些奇怪的代码.
具体实现
由于要在网页内发送消息,暂定发送的内容为:通知内容和时间.
新建模板
首先要在测试号新建模板,所谓模板消息嘛.如图,注意参数的格式,以.DATA结尾.
封装消息
然后创建与之对应的实体类,我分别创建了ArrivedTime类,Content类,都继承Datas,然后用Data类封装他们,再用ModMsg封装Data类.
继续在WechatUtil中添加代码,也同样是利用之前写的doPost方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public ModMsg initModMsg(String mcontent,String openid){
ModMsg modMsg=new ModMsg();
CalUtil calUtil=new CalUtil();
modMsg.setTouser(openid);//用户的openid
modMsg.setUrl("http://120.24.73.230/Echoo1/sendmsg.jsp");
Data data=new Data();
//内容
Content content=new Content();
content.setValue(mcontent);
content.setColor("#173177");
//时间
ArrivedTime arrivedTime=new ArrivedTime();
arrivedTime.setValue(calUtil.getCurrentDate());
arrivedTime.setColor("#000000");
data.setContent(content);
data.setArrivedTime(arrivedTime);
modMsg.setData(data);
return modMsg;
}
public int sendModMessage(String modmsg,String token){
int errcode=0;
String url=SEND_MODMSG.replace("ACCESS_TOKEN",token);
JSONObject jsonObject=doPost(url,modmsg);
if (jsonObject!=null){
errcode=jsonObject.getInt("errcode");
}
return errcode;
}
|
先在WechatInitial中测试,当然最后是要在网页上发送的.这里暂时不讲这个了,有时间写一写网页的,预计会写在<一个微信公众号的诞生 番外篇>23333.貌似跑题了.
1
2
3
4
5
6
7
8
9
10
|
String content="明天下午的三四两节线代课不上了";
String openid="OPENID";
String modmsg=JSONObject.fromObject(wechatUtil.initModMsg(content,openid)).toString();
int errcode1=(wechatUtil.sendModMessage(modmsg,access_token));
if (errcode1==0){
System.out.println("发送模板信息成功");
System.out.println(modmsg);
}else {
System.out.println("发送模板信息失败"+errcode1);
}
|
把openid改成自己的,然后请查看手机==
群发(todo)
实现一下,群发貌似就是套个循环??