需求: 一套系统,分PC端和微信公众号,共用一套数据,希望在PC端的后台管理系统发布信息时,在微信公众号的显示: 1.进行群发推送 2.一个子菜单的点击弹出最新发布的信息内容(其实就是每个信息都是永久素材,点击后在公众号内弹出图文消息) 技术实现细节: 需要解决几个技术
1.上传图片到微信公众号平台,用于图文信息内容的图片
官方文档说明:
http请求方式: POST https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F [email protected] "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"在做的过程中,有一些问题:
1.后端java去发送post请求 图片类型 File和MultipartFile都会报41005错误
解决不了,后来想到了方案2:
2.在前端用form提交,成功 ,但是问题是form提交直接跳转页面,显示返回参数,不能做后续处理,后来想到用jquery的异步提交form表单可以不用跳转继续后续处理,但是又出现了跨域问题。。。。。。。失败
3.最后,解决:java调用外部进程,执行curl命令,
本身curl Windows是没有的 要专门下载
代码:
String []cmd_img = {"C:\\Users\\netlab606\\Desktop\\curl-7.55.1-win64-mingw\\curl-7.55.1-win64-mingw\\bin\\curl.exe", "-F","media=@"+path,WxConfig.UPLOADIMG+WxConfig.ACCESS_TOKEN};
ProcessBuilder pb=new ProcessBuilder(cmd_img);
pb.redirectErrorStream(true);
Process p;
try {
p = pb.start();
BufferedReader br=null;
String line=null;
br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
System.out.println(line);
if(line.contains("media_id")){
int start=line.indexOf("media_id")+11;
int end=line.indexOf(",",start)-1;
WxConfig.THUMB_MEDIA_ID=line.substring(start,end);
System.out.println(WxConfig.THUMB_MEDIA_ID);
}
}
br.close();
2.新加永久素材
官方文档:
接口调用请求说明
http请求方式: POST,https协议
https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
调用示例
{
"articles": [{
"title": TITLE,
"thumb_media_id": THUMB_MEDIA_ID,
"author": AUTHOR,
"digest": DIGEST,
"show_cover_pic": SHOW_COVER_PIC(0 / 1),
"content": CONTENT,
"content_source_url": CONTENT_SOURCE_URL
},
//若新增的是多图文素材,则此处应还有几段articles结构
]
}
使用
https://api.weixin.qq.com/cgi-bin/material/add_material?type=thumb&access_token=
这个接口返回的media_id 作为thumb_media_id 代码同上 使用curl命令发送请求 注意图片大小 有限制 测试 70kb左右可以 上限不知道
获得thumb_media_id后的 真正新增永久素材的核心代码:
JSONObject json1=new JSONObject();
JSONObject json2=new JSONObject();
json2.put("title",communityIntro.getName());
json2.put("thumb_media_id",WxConfig.THUMB_MEDIA_ID);
json2.put("show_cover_pic","1");
json2.put("content",communityIntro.getDetail());
JSONArray jsonArray=new JSONArray();
jsonArray.add(json2);
json1.put("articles",jsonArray);
String result=new HttpRequestor().postJson(json1,WxConfig.ADD_NEWS+WxConfig.ACCESS_TOKEN);
int start_2=result.indexOf("media_id")+11;
int end_2=result.indexOf("}",start_2)-1;
WxConfig.MEDIA_ID=result.substring(start_2,end_2);
3. 群发 大致代码同上
群发接口 也需要三步:
a.获得缩略图的thumb_media_id
b.获得群发的图文消息的media_id
c.开始群发
这里要注意,a步的thumb_media_id 接口调用 要使用:http://file.api.weixin.qq.com/cgi-bin/media/upload?type=thumb&access_token= 这个地址 不同于新增永久素材使用的
所以不能使用新增永久素材生成的thumb_media_id
b步 的接口也不同于素材,要使用
https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=
c步 接口:https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=
具体参数 参考 官方文档