微信企业号开发(8)--示例代码

来源:互联网 发布:淘宝店上传图片的大小 编辑:程序博客网 时间:2024/05/16 06:14

 [本文所描述的内容具有一定的时效性,请以实际开发所处环境为准]

在前面的几篇文章中,我们已经叙述了,微信企业号中常见功能的实现原理,今天我们按照文章的顺序,给出相应的功能节点的示例代码。但是,对于程序的结构,还请各位看官按照自己的实际需求重新设计,另外,在github上,已经有现成的关于微信开发的开源项目,有兴趣的读者也可以学习一下。

-------------------------------------------------------------------------------------------------------------------------------------

示例环境:

系统:win7 x64

开发工具:myeclipse2014

开发语言:java JDK1.7

示例1.建立连接--主动。

【主动建立连接需要有别的动作来实现才能看到效果,因此示例1中,我们以发消息为里说明主动连接的实现效果】

准备工作:

a.参照前文申请一个企业号

b.先登陆微信公众平台手动添加一个用户

c.两个重要参数:corpid,serect

d.json工具包:json-lib-2.3-jdk15.jar,它的依赖包:commons-beanutils-1.7.0.jar,commons-collections-3.2.1.jar,commons-lang-2.5.jar,commons-logging-1.0.4.jar,ezmorph-1.0.6.jar

示例代码如下:

package test;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import net.sf.json.JSONObject;/** *@author 作者 E-mail:ingo *@version 创建时间:2016年1月31日下午4:32:14 *类说明 */public class Main {public static void main(String[] args) {//企业号idString corpid = "wxabc591........5";//企业号密钥String serect = "QqLOOyGEa.......BXM3B1n43a";//token获取地址String accesstokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SERCRET";accesstokenurl = accesstokenurl.replace("ID", corpid).replace("SERCRET", serect);//获取tokenJSONObject accesstoken = HttpRequest(accesstokenurl,"GET",null);String token = accesstoken.getString("access_token");//消息发送接口地址String posturl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";posturl = posturl.replace("ACCESS_TOKEN", token);//消息内容String postdata = STextMsg("ingo", "", "", "12", "test");//发送消息JSONObject result = HttpRequest(posturl,"GET",postdata);//结果输出System.out.println(result);}/**      * text消息      * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3"      * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 "      * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 "      * @param msgtype 消息类型,此时固定为:text      * @param agentid 企业应用的id,整型。可在应用的设置页面查看      * @param content 消息内容      * @param safe 表示是否是保密消息,0表示否,1表示是,默认0      * */      public static String STextMsg(String touser,String toparty,String totag,String agentid,String content){          String PostData = "{\"touser\": \"%s\",\"toparty\": \"%s\",\"totag\": \"%s\",\"msgtype\": \"text\",\"agentid\":\"%s\",\"text\": {\"content\": \"%s\"},\"safe\":\"0\"}";          return String.format(PostData, touser,toparty,totag,agentid,content);      }      public static JSONObject HttpRequest(String requestUrl, String requestMethod,              String outputStr) {          JSONObject jsonObject = null;          StringBuffer buffer = new StringBuffer();          OutputStream out = null;          InputStream input = null;          InputStreamReader inputReader = null;          BufferedReader reader = null;          HttpURLConnection connection = null;          try {              // 建立连接              URL url = new URL(requestUrl);              connection = (HttpURLConnection) url.openConnection();              // 设置http头部信息              connection.setDoOutput(true);              connection.setDoInput(true);              connection.setUseCaches(false);              connection.setRequestMethod(requestMethod);              // 写入消息实体              if (outputStr != null) {                  out = connection.getOutputStream();                  out.write(outputStr.getBytes("UTF-8"));              }              // 流处理              input = connection.getInputStream();              inputReader = new InputStreamReader(input, "UTF-8");              reader = new BufferedReader(inputReader);              String line;              while ((line = reader.readLine()) != null) {                  buffer.append(line);              }              String re = buffer.toString();            jsonObject = JSONObject.fromObject(re);          } catch (Exception e) {              //日志处理等,请自行实现          e.printStackTrace();        } finally {              try {                  if (outputStr != null) {                      out.close();                  }                  // 关闭连接、释放资源                  if (reader != null) {                      reader.close();                  }                  if (inputReader != null) {                      inputReader.close();                  }                  if (input != null) {                      input.close();                  }                  input = null;                  connection.disconnect();              } catch (Exception e) {                  //日志处理等,请自行实现              e.printStackTrace();            }          }          return jsonObject;      }  }
运行结果:

{"errcode":0,"errmsg":"ok"}


示例2.管理素材文件

package test;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import net.sf.json.JSONObject;/** *@author 作者 E-mail:ingo *@version 创建时间:2016年1月31日下午4:32:14 *类说明 */public class Main {public static void main(String[] args) {//企业号idString corpid = "wxabc......d5";//企业号密钥String serect = "QqLOO......M3B1n43a";//token获取地址String accesstokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SERCRET";accesstokenurl = accesstokenurl.replace("ID", corpid).replace("SERCRET", serect);//获取tokenJSONObject accesstoken = HttpRequest(accesstokenurl,"GET",null);String token = accesstoken.getString("access_token");String filePath = "http://img4.imgtn.bdimg.com/it/u=805849949,3076359299&fm=206&gp=0.jpg";//上传素材文件JSONObject result = uploadMedia(token, "image", filePath);System.out.println(result);}/**      * 上传媒体文件      * @param accessToken 接口访问凭证      * @param type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)      * @param media form-data中媒体文件标识,有filename、filelength、content-type等信息      * @param mediaFileUrl 媒体文件的url      * 上传的媒体文件限制          * 图片(image):1MB,支持JPG格式          * 语音(voice):2MB,播放长度不超过60s,支持AMR格式          * 视频(video):10MB,支持MP4格式          * 普通文件(file):20MB      * */      public static JSONObject uploadMedia(String accessToken, String type, String mediaFileUrl) {      JSONObject jsonObject = null;        // 拼装请求地址          String uploadMediaUrl = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";          uploadMediaUrl = uploadMediaUrl.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);          // 定义数据分隔符          String boundary = "------------7da2e536604c8";          try {              URL uploadUrl = new URL(uploadMediaUrl);              HttpURLConnection uploadConn = (HttpURLConnection) uploadUrl.openConnection();              uploadConn.setDoOutput(true);              uploadConn.setDoInput(true);              uploadConn.setRequestMethod("POST");              // 设置请求头Content-Type              uploadConn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);              // 获取媒体文件上传的输出流              OutputStream outputStream = uploadConn.getOutputStream();              URL mediaUrl = new URL(mediaFileUrl);              HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();              meidaConn.setDoOutput(true);              meidaConn.setRequestMethod("GET");              // 从请求头中获取内容类型              String contentType = meidaConn.getContentType();              // 根据内容类型判断文件扩展名              String fileExt = ".jpg";            // 请求体开始              outputStream.write(("--" + boundary + "\r\n").getBytes());              outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"file1%s\"\r\n", fileExt).getBytes());              outputStream.write(String.format("Content-Type: %s\r\n\r\n", contentType).getBytes());              // 获取媒体文件的输入流              BufferedInputStream bis = new BufferedInputStream(meidaConn.getInputStream());              byte[] buf = new byte[8096];              int size = 0;              while ((size = bis.read(buf)) != -1) {                  // 将媒体文件写到输出流(往微信服务器写数据)                  outputStream.write(buf, 0, size);              }              // 请求体结束              outputStream.write(("\r\n--" + boundary + "--\r\n").getBytes());              outputStream.close();              bis.close();              meidaConn.disconnect();              // 获取媒体文件上传的输入流              InputStream inputStream = uploadConn.getInputStream();              InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");              BufferedReader bufferedReader = new BufferedReader(inputStreamReader);              StringBuffer buffer = new StringBuffer();              String str = null;              while ((str = bufferedReader.readLine()) != null) {                  buffer.append(str);              }              bufferedReader.close();              inputStreamReader.close();              // 释放资源              inputStream.close();              inputStream = null;              uploadConn.disconnect();              // 使用JSON-lib解析返回结果               jsonObject = JSONObject.fromObject(buffer.toString());          } catch (Exception e) {              //日志处理等,请自行完善。          }          return jsonObject;      }      public static JSONObject HttpRequest(String requestUrl, String requestMethod,              String outputStr) {          JSONObject jsonObject = null;          StringBuffer buffer = new StringBuffer();          OutputStream out = null;          InputStream input = null;          InputStreamReader inputReader = null;          BufferedReader reader = null;          HttpURLConnection connection = null;          try {              // 建立连接              URL url = new URL(requestUrl);              connection = (HttpURLConnection) url.openConnection();              // 设置http头部信息              connection.setDoOutput(true);              connection.setDoInput(true);              connection.setUseCaches(false);              connection.setRequestMethod(requestMethod);              // 写入消息实体              if (outputStr != null) {                  out = connection.getOutputStream();                  out.write(outputStr.getBytes("UTF-8"));              }              // 流处理              input = connection.getInputStream();              inputReader = new InputStreamReader(input, "UTF-8");              reader = new BufferedReader(inputReader);              String line;              while ((line = reader.readLine()) != null) {                  buffer.append(line);              }              String re = buffer.toString();            jsonObject = JSONObject.fromObject(re);          } catch (Exception e) {              //日志处理等,请自行实现          e.printStackTrace();        } finally {              try {                  if (outputStr != null) {                      out.close();                  }                  // 关闭连接、释放资源                  if (reader != null) {                      reader.close();                  }                  if (inputReader != null) {                      inputReader.close();                  }                  if (input != null) {                      input.close();                  }                  input = null;                  connection.disconnect();              } catch (Exception e) {                  //日志处理等,请自行实现              e.printStackTrace();            }          }          return jsonObject;      }  }

运行结果:

{"type":"image","media_id":"1RlmNyD4bntO_v_XMBBH_1ACSQkcFBWt3-UCj_TeN2nU8d28LQ-j406IUPTbv1VAZnU5DCVLkXoDHEQDp2kIYTQ","created_at":1454291860}


示例3.自定义菜单
本节示例,需要大家创建多个文件。在实际应用中,请重新设计组织架构。

public class Button {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}

public class CommonButton extends Button{private String type;  private String key;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}  }

public class ViewButton extends Button{private String type;      private String url;        public String getType() {          return type;      }        public void setType(String type) {          this.type = type;      }        public String getUrl() {          return url;      }        public void setUrl(String url) {          this.url = url;      }  }

public class BaseMenu extends Button {private Button[] sub_button;public Button[] getSub_button() {return sub_button;}public void setSub_button(Button[] sub_button) {this.sub_button = sub_button;}}

public  String create_JSONMenu(String agentid,BaseMenu bm1,BaseMenu bm2,BaseMenu bm3){Menu menu = new Menu(); MenuArray ma = new MenuArray();ma.setSub_BaseMenu(new BaseMenu[]{bm1,bm2,bm3});ma = mAisNull(ma);switch(ma.getSub_BaseMenu().length){case 1:menu.setButton(new Button[] { isOnly(isFull(ma.getSub_BaseMenu()[0]))});break;case 2:menu.setButton(new Button[] { isOnly(isFull(ma.getSub_BaseMenu()[0])),isOnly(isFull(ma.getSub_BaseMenu()[1]))});break;case 3:menu.setButton(new Button[] { isOnly(isFull(ma.getSub_BaseMenu()[0])),isOnly(isFull(ma.getSub_BaseMenu()[1])),isOnly(isFull(ma.getSub_BaseMenu()[2]))});break;}        String jsonMenu = JSONObject.fromObject(menu).toString();        System.out.println("jsonMenu--"+jsonMenu);        String Postjson = "{\"msgType\":\"menu\",\"group\":\"create\",\"content\":{\"agentid\":\"%s\",\"menu\":%s}}";Postjson = String.format(Postjson,agentid, jsonMenu);        return Postjson;}


public class Menu {private Button[] button;        public Button[] getButton() {          return button;      }        public void setButton(Button[] button) {          this.button = button;      }  } 


public class MenuArray extends BaseMenu {private BaseMenu[] sub_BaseMenu;public BaseMenu[] getSub_BaseMenu() {return sub_BaseMenu;}public void setSub_BaseMenu(BaseMenu[] sub_BaseMenu) {this.sub_BaseMenu = sub_BaseMenu;}}


public  MenuArray mAisNull(MenuArray ma){List<BaseMenu> menuArray = new ArrayList<BaseMenu>();BaseMenu [] bms = ma.getSub_BaseMenu();for(BaseMenu bm:bms){if(bm.getSub_button()[0]!=null){menuArray.add(bm);}}ma.setSub_BaseMenu(menuArray.toArray(new BaseMenu[0]));return ma;}

public  void main(String[] args){CommonButton btn11 = create_Common_Button("测试菜单-11","1");CommonButton btn12 = create_Common_Button("测试菜单-12","2");CommonButton btn13 = create_Common_Button("测试菜单-13","3");CommonButton btn14 = create_Common_Button("测试菜单-14","4");CommonButton btn15 = create_Common_Button("测试菜单-15","5");ViewButton btn21 = create_View_Button("链接菜单-1", "http://baidu.com");ViewButton btn22 = create_View_Button("链接菜单-2", "http://baidu.com");ViewButton btn25 = create_View_Button("链接菜单-3", "http://baidu.com");BaseMenu bb1 = create_BaseButton("一级菜单-1",btn11, btn12, btn13,btn14,btn15);BaseMenu bb2 = create_BaseButton("二级菜单-2",btn21, null, null,null,null);BaseMenu bb3 = create_BaseButton("三级菜单-3",btn22, null, null,null,null);String menu = create_JSONMenu("9",bb1, bb2, bb3);//menu代表已经组装好的数据。//请自行查阅菜单创建接口地址,上传方式//发送函数见上文,这里不再重复}
-------------------------------------------------------------------------------------------------------------------------------------

至此,微信企业号开发(8)--示例代码结束


备注:

1.微信企业号开发的基本内容到此结束,其他内容的实现请读者参考官方文档来实现。

2.由于开发文档处于变动之中,请读者们一定按照最新的文档进行开发,上文仅供参考。


参考资料:

微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/home/index.html





3 0