java实现微信企业号API服务端调用封装

  • 背景
  • 代码封装
    • 微信企业号-获取AccessToken(企业号的全局唯一票据)
    • 微信企业号-发送消息
    • 微信企业号-上传及获取媒体素材
    • 微信企业号-菜单操作
  • 主代码清单
  • 完整代码下载

背景

在进行微信企业号开发时,我们经常会在java服务端调用微信企业号的相关接口,如比
获取AccessToken、发送消息、创建菜单、上传媒体资源等。为了简化接口的调用,我把常用接口的调用进行了封装。具体如下:

代码封装

对基本的微信企业号API调用封装如下:

微信企业号-获取AccessToken(企业号的全局唯一票据)

 /*** 功能说明:获取AccessToken(企业号的全局唯一票据)* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:06:37* @param corpid 企业Id* @param corpsecret 管理组的凭证密钥* @return 返回企业号的全局唯一票据json字符串* @throws IOException*/public static String getAccessToken(String corpid, String corpsecret) throws IOException {String param = "corpid=%s&corpsecret=%s";param = String.format(param, corpid, corpsecret);String jsonAccessToken = HttpRequestUtil.sendGet(Global.ACCESSTOKENURL, param);return jsonAccessToken;}/*** 功能说明:获取AccessToken(企业号的全局唯一票据)实体对象* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:08:08* @param corpid 企业Id* @param corpsecret 管理组的凭证秘钥* @return 返回企业号的全局唯一票据实体对象* @throws IOException*/public static AccessToken getAccessTokenEntity(String corpid, String corpsecret) throws IOException {String jsonAccessToken = getAccessToken(corpid, corpsecret);return JSON.parseObject(jsonAccessToken, AccessToken.class);}

微信企业号-发送消息

 /*** 功能说明:发送文本消息* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:08:43* @param accessToken 企业号的全局唯一票据* @param jsonData 消息json数据* @return 返回接口调用结果* @throws IOException*/public static String sendTextMsg(String accessToken, String jsonData) throws IOException {String url = Global.SENDMSGURL + "?access_token=%s";url = String.format(url, accessToken);String jsonResult = HttpRequestUtil.sendPost(url, jsonData);return jsonResult;}/*** 功能说明:发送文本消息* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:09:39* @param accessToken 企业号的全局唯一票据* @param jsonData 消息json数据* @return 返回ResultMsg对象* @throws IOException*/public static ResultMsg sendTextMsg2(String accessToken, String jsonData) throws IOException {String jsonResult = sendTextMsg(accessToken, jsonData);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:发消息(包括文本消息、图像、声音、视频、文件、图文、微信后台图文)* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:10:28* @param accessToken 企业号的全局唯一票据* @param msg 要发送的消息对象* @return 返回ResultMsg结果对象* @throws IOException*/public static ResultMsg sendMsg(String accessToken, SendMsg msg) throws IOException {String jsonResult = sendTextMsg(accessToken, msg.toJsonString());ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}

微信企业号-上传及获取媒体素材

 /*** 功能说明:上传素材文件* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:11:06* @param accessToken 企业号的全局唯一票据* @param mediaType 要上传素材文件的类型* @param file 要上传的素材文件对象* @return 返回json结果字符串*/public static String uploadMedia(String accessToken, MediaType mediaType, File file) {String url = Global.UPLOADMEDIAURL + "?access_token=%s&type=%s";url = String.format(url, accessToken, mediaType.toString());String jsonResult = HttpRequestUtil.uploadPost(url, file);return jsonResult;}/*** 功能说明:获取素材文件* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:12:00* @param accessToken 企业号的全局唯一票据* @param media_id 要获取的素材文件的media_id* @return 返回对应素材文件的json字符串* @throws IOException*/public static String getMedia(String accessToken, String media_id) throws IOException {String param = "access_token=%s&media_id=%s";param = String.format(param, accessToken, media_id);String jsonResult = HttpRequestUtil.sendGet(Global.GETMEDIAURL, param);return jsonResult; }/*** 功能说明:获取应用素材总数以及每种类型素材的数目* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:12:45* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用的id,整型。可在应用的设置页面查看* @return 返回ResultMsg对象* @throws IOException*/public static ResultMsg getMaterialCount(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.GETMATERIALCOUNTURL, param);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}

微信企业号-菜单操作

 /*** 功能说明:创建菜单* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:13:26* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @param param 要创建的菜单参数* @return 返回创建结果对象* @throws IOException*/public static ResultMsg createMenu(String accessToken, int agentId, MenuParam param) throws IOException {String url = Global.CREATEMENUURL + "?access_token=%s&agentid=%s";url = String.format(url, accessToken, agentId);String jsonResult = HttpRequestUtil.sendPost(url, param.toJsonString());ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:删除菜单* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:13:57* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @return 返回删除结果对象* @throws IOException*/public static ResultMsg delMenu(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.DELEMENURUL, param);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:获取菜单列表* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:14:24* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @return 返回菜单列表json字符串* @throws IOException*/public static String getMenu(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.GETMENUURL, param);return jsonResult;}

主代码清单

HttpRequestUtil.java

package com.wongoing.api;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/*** 功能说明:封装http请求:GET/POST/PUT/DELETE等方法* 修改说明:* @author 郑立兵* @date 2017年10月17日 上午8:42:30* @version V0.1* @param <T>*/
public class HttpRequestUtil {/*** 定义全局默认编码格式*/private static final String CHARSET_NAME = "UTF-8";/*** 定义全局OkHttpClient对象*/private static final OkHttpClient httpClient = new OkHttpClient();/*** 功能说明:同步调用* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:20:55* @param request* @return* @throws IOException*/public static Response execute(Request request) throws IOException {return httpClient.newCall(request).execute();}/*** 功能说明:开启异步线程调用* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:23:00* @param request* @param responseCallback*/public static void enqueue(Request request, Callback responseCallback) {httpClient.newCall(request).enqueue(responseCallback);}/*** 功能说明:开启异步线程调用,且不在意返回结果(实现空callback)* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:24:53* @param request*/public static void enqueue(Request request) {httpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call arg0, IOException arg1) {}@Overridepublic void onResponse(Call arg0, Response arg1) throws IOException {}});}/*** 功能说明:向指定URL发送GET方法的请求* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:19:11* @param url 发送请求的URL* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL所代表远程资源的响应结果* @throws IOException*/public static String sendGet(String url, String param) throws IOException {String result = "";String urlNameString = url + "?" + param;Request req = new Request.Builder().url(urlNameString).build(); Response response = httpClient.newCall(req).execute();if (!response.isSuccessful()){throw new IOException("Unexpected code " + response);}result = response.body().string();return result;}/*** 功能说明:向指定URL发送GET方法的请求* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:54:55* @param url 发送请求的URL* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @param encoding 设置响应信息的编码格式,如utf-8* @return URL所代表远程资源的响应结果* @throws IOException*/public static String sendGet(String url, String param, String encoding) throws IOException {String result = "";String urlNameString = url + "?" + param;Request req = new Request.Builder().url(urlNameString).build(); Response response = httpClient.newCall(req).execute();if (!response.isSuccessful()){throw new IOException("Unexpected code " + response);}result = response.body().string();if (null == encoding || encoding.equals("")) {return result;}byte[] bresult = result.getBytes();result = new String(bresult, encoding);return result;}/*** 功能说明:向指定URL发送POST方法的请求* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:54:55* @param url 发送请求的URL* @param jsonData 请求参数,请求参数应该是Json格式字符串的形式。* @return URL所代表远程资源的响应结果* @throws IOException*/public static String sendPost(String url, String jsonData) throws IOException {String result = "";RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), jsonData);Request req = new Request.Builder().url(url).header("Content-Type", "application/json").post(body).build(); Response response = httpClient.newCall(req).execute();if (!response.isSuccessful()){throw new IOException("Unexpected code " + response);}result = response.body().string();return result;}/*** 功能说明:向指定URL发送POST方法的请求* 修改说明:* @author zhenglibing* @date 2018年1月8日 上午10:54:55* @param url 发送请求的URL* @param jsonData 请求参数,请求参数应该是Json格式字符串的形式。* @param encoding 设置响应信息的编码格式,如utf-8* @param authorization 授权* @param postmanToken 票证* @return URL所代表远程资源的响应结果* @throws IOException*/public static String sendPost(String url, String jsonData, String encoding, String authorization, String postmanToken) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection con = realUrl.openConnection();HttpURLConnection conn = (HttpURLConnection) con;// 设置通用的请求属性conn.setRequestMethod("POST"); // 设置Post请求conn.setConnectTimeout(5 * 1000);conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); // 设置内容类型conn.setRequestProperty("authorization", authorization);conn.setRequestProperty("postman-token", postmanToken);// conn.setRequestProperty("Content-Length",// String.valueOf(param.length())); //设置长度// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 获取URLConnection对象对应的输出流out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), encoding));// 发送请求参数// out.print(param);out.write(jsonData);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}byte[] bresult = result.getBytes();result = new String(bresult, encoding);} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输出流、输入流finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}/*** 功能说明:向指定 URL 发送POST方法的请求* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:17:06* @param url 发送请求的 URL* @param jsonData 请求参数,请求参数应该是Json格式字符串的形式。* @param encoding 设置响应信息的编码格式,如utf-8* @return url所代表远程资源的响应结果* @throws IOException*/public static String sendPost(String url, String jsonData, String encoding) throws IOException {String result = "";RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), jsonData);Request req = new Request.Builder().url(url).header("Content-Type", "application/json").post(body).build(); Response response = httpClient.newCall(req).execute();if (!response.isSuccessful()){throw new IOException("Unexpected code " + response);}result = response.body().string();if (null == encoding || encoding.equals("")) {return result;}byte[] bresult = result.getBytes();result = new String(bresult, encoding);return result;}/*** 功能说明:上传文件* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:15:51* @param url 上传url* @param file 要上传的文件对象* @return 返回上传的结果*/public static String uploadPost(String url, File file) {DataOutputStream dos = null;FileInputStream fis = null;DataInputStream dis = null;BufferedReader in = null;String result = "";String end = "\r\n";String twoHyphens = "--"; // 用于拼接String boundary = "*****"; // 用于拼接 可自定义try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection con = realUrl.openConnection();HttpURLConnection conn = (HttpURLConnection) con;// 设置通用的请求属性conn.setRequestMethod("POST"); // 设置Post请求// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setConnectTimeout(5 * 1000);conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary); // 设置内容类型// 获取URLConnection对象对应的输出流dos = new DataOutputStream(conn.getOutputStream());//1、写入媒体头部分StringBuilder sb = new StringBuilder();sb.append(twoHyphens).append(boundary).append(end);sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"").append(end);sb.append("Content-Type:application/octet-stream").append(end).append(end);byte[] head = sb.toString().getBytes("utf-8");dos.write(head);//2、写入媒体正文部分, 对文件进行传输fis = new FileInputStream(file);dis = new DataInputStream(fis);byte[] buffer = new byte[8192]; // 8Kint count = 0;while ((count = dis.read(buffer)) != -1) {dos.write(buffer, 0, count);}//3、写入媒体结尾部分。byte[] foot = (end + twoHyphens + boundary + twoHyphens + end).getBytes("utf-8");dos.write(foot);dos.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}byte[] bresult = result.getBytes();result = new String(bresult, "utf-8");} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输出流、输入流finally {try {if (dos != null) {dos.close();}if (dis != null) {dis.close();}if (fis != null) {fis.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}/*** 功能说明:下载素材文件* 修改说明:* @author zhenglibing* @date 2018年1月9日 下午2:06:56* @param url 下载的接口地址* @param param 参数* @param outFileName 输出文件* @return 成功返回true,失败返回false* @throws IOException*/public static boolean downloadFile(String url, String param, String outFileName) throws IOException{boolean result = false;String urlNameString = url + "?" + param;Request req = new Request.Builder().url(url).build(); Response response = httpClient.newCall(req).execute();if (!response.isSuccessful()){throw new IOException("Unexpected code " + response);}if (response.body().contentType().toString().toLowerCase().contains("application/json") || response.body().contentType().toString().toLowerCase().contains("text/plain")) {throw new IOException("下载资源失败,下载地址为=" + urlNameString);} else {InputStream in = response.body().byteStream();FileOutputStream out = new FileOutputStream(outFileName);int bufferSize = 2048;byte[] data = new byte[bufferSize];int length = 0;while ((length = in.read(data, 0, bufferSize)) > 0){out.write(data, 0, length);}out.close();in.close();result = true;}return result;}
}

Global.java

package com.wongoing.webchat.enterprise;/*** 功能说明:企业微信全局接口地址* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:27:43* @version 0.1*/
public interface Global {/*** 微信公众平台,获取AccessToken的接口地址,Https请求方式:GET* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect*/public static final String ACCESSTOKENURL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";/*** 微信公众平台,发送消息接口地址,Https请求方式::POST* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN*/public static final String SENDMSGURL = "https://qyapi.weixin.qq.com/cgi-bin/message/send";/*** 微信公众平台,上传图片、语音、视频等媒体资源文件以及普通文件(如doc,ppt)的接口地址,Https请求方式:POST* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE*/public static final String UPLOADMEDIAURL = "https://qyapi.weixin.qq.com/cgi-bin/media/upload";/*** 微信公众平台,通过media_id获取图片、语音、视频等文件的接口地址,Https请求方式:GET* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID*/public static final String GETMEDIAURL = "https://qyapi.weixin.qq.com/cgi-bin/media/get";/*** 微信公众平台,获取应用素材总数以及每种类型素材的数目,Https请求方式:GET* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/material/get_count?access_token=ACCESS_TOKEN&agentid=AGENTID*/public static final String GETMATERIALCOUNTURL = "https://qyapi.weixin.qq.com/cgi-bin/material/get_count";/*** 微信公众平台,创建应用菜单接口地址,Https请求方式:POST* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=1*/public static final String CREATEMENUURL = "https://qyapi.weixin.qq.com/cgi-bin/menu/create";/*** 微信公众平台,删除菜单接口地址,Https请求方式:GET* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN&agentid=1*/public static final String DELEMENURUL = "https://qyapi.weixin.qq.com/cgi-bin/menu/delete";/*** 微信公众平台,获取菜单列表接口地址,Https请求方式:GET* 接口地址示例:https://qyapi.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN&agentid=1*/public static final String GETMENUURL = "https://qyapi.weixin.qq.com/cgi-bin/menu/get";
}

WebChat.java

package com.wongoing.webchat.enterprise;import java.io.File;
import java.io.IOException;import com.alibaba.fastjson.JSON;
import com.wongoing.api.HttpRequestUtil;
import com.wongoing.webchat.enterprise.entity.AccessToken;
import com.wongoing.webchat.enterprise.entity.MediaType;
import com.wongoing.webchat.enterprise.entity.MenuParam;
import com.wongoing.webchat.enterprise.entity.ResultMsg;
import com.wongoing.webchat.enterprise.entity.SendMsg;/*** 功能说明:企业微信接口调用封装类,封装所有企业微信接口调用方法* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:07:16* @version 0.1*/
public class WebChat {/*** 功能说明:获取AccessToken(企业号的全局唯一票据)* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:06:37* @param corpid 企业Id* @param corpsecret 管理组的凭证密钥* @return 返回企业号的全局唯一票据json字符串* @throws IOException*/public static String getAccessToken(String corpid, String corpsecret) throws IOException {String param = "corpid=%s&corpsecret=%s";param = String.format(param, corpid, corpsecret);String jsonAccessToken = HttpRequestUtil.sendGet(Global.ACCESSTOKENURL, param);return jsonAccessToken;}/*** 功能说明:获取AccessToken(企业号的全局唯一票据)实体对象* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:08:08* @param corpid 企业Id* @param corpsecret 管理组的凭证秘钥* @return 返回企业号的全局唯一票据实体对象* @throws IOException*/public static AccessToken getAccessTokenEntity(String corpid, String corpsecret) throws IOException {String jsonAccessToken = getAccessToken(corpid, corpsecret);return JSON.parseObject(jsonAccessToken, AccessToken.class);}/*** 功能说明:发送文本消息* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:08:43* @param accessToken 企业号的全局唯一票据* @param jsonData 消息json数据* @return 返回接口调用结果* @throws IOException*/public static String sendTextMsg(String accessToken, String jsonData) throws IOException {String url = Global.SENDMSGURL + "?access_token=%s";url = String.format(url, accessToken);String jsonResult = HttpRequestUtil.sendPost(url, jsonData);return jsonResult;}/*** 功能说明:发送文本消息* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:09:39* @param accessToken 企业号的全局唯一票据* @param jsonData 消息json数据* @return 返回ResultMsg对象* @throws IOException*/public static ResultMsg sendTextMsg2(String accessToken, String jsonData) throws IOException {String jsonResult = sendTextMsg(accessToken, jsonData);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:发消息(包括文本消息、图像、声音、视频、文件、图文、微信后台图文)* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:10:28* @param accessToken 企业号的全局唯一票据* @param msg 要发送的消息对象* @return 返回ResultMsg结果对象* @throws IOException*/public static ResultMsg sendMsg(String accessToken, SendMsg msg) throws IOException {String jsonResult = sendTextMsg(accessToken, msg.toJsonString());ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:上传素材文件* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:11:06* @param accessToken 企业号的全局唯一票据* @param mediaType 要上传素材文件的类型* @param file 要上传的素材文件对象* @return 返回json结果字符串*/public static String uploadMedia(String accessToken, MediaType mediaType, File file) {String url = Global.UPLOADMEDIAURL + "?access_token=%s&type=%s";url = String.format(url, accessToken, mediaType.toString());String jsonResult = HttpRequestUtil.uploadPost(url, file);return jsonResult;}/*** 功能说明:获取素材文件* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:12:00* @param accessToken 企业号的全局唯一票据* @param media_id 要获取的素材文件的media_id* @return 返回对应素材文件的json字符串* @throws IOException*/public static String getMedia(String accessToken, String media_id) throws IOException {String param = "access_token=%s&media_id=%s";param = String.format(param, accessToken, media_id);String jsonResult = HttpRequestUtil.sendGet(Global.GETMEDIAURL, param);return jsonResult; }/*** 功能说明:获取应用素材总数以及每种类型素材的数目* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:12:45* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用的id,整型。可在应用的设置页面查看* @return 返回ResultMsg对象* @throws IOException*/public static ResultMsg getMaterialCount(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.GETMATERIALCOUNTURL, param);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:创建菜单* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:13:26* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @param param 要创建的菜单参数* @return 返回创建结果对象* @throws IOException*/public static ResultMsg createMenu(String accessToken, int agentId, MenuParam param) throws IOException {String url = Global.CREATEMENUURL + "?access_token=%s&agentid=%s";url = String.format(url, accessToken, agentId);String jsonResult = HttpRequestUtil.sendPost(url, param.toJsonString());ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:删除菜单* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:13:57* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @return 返回删除结果对象* @throws IOException*/public static ResultMsg delMenu(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.DELEMENURUL, param);ResultMsg result = JSON.parseObject(jsonResult, ResultMsg.class);return result;}/*** 功能说明:获取菜单列表* 修改说明:* @author zhenglibing* @date 2018年1月8日 下午2:14:24* @param accessToken 企业号的全局唯一票据* @param agentId 企业应用id,整型,可在应用的设置页面查看* @return 返回菜单列表json字符串* @throws IOException*/public static String getMenu(String accessToken, int agentId) throws IOException {String param = "access_token=%s&agentid=%s";param = String.format(param, accessToken, agentId);String jsonResult = HttpRequestUtil.sendGet(Global.GETMENUURL, param);return jsonResult;}
}

完整代码下载

完整代码下载

java实现微信企业号API服务端调用封装相关推荐

  1. C#实现微信企业号API服务端调用封装

    C#实现微信企业号API服务端调用封装 背景 代码封装 时间戳方法 基础方法:验证服务器接口.服务端解密.服务端加密.获取AccessToken.生成企业获取Code URL.获取授权用户信息.获取调 ...

  2. 微信app支付服务端开发记录

    微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...

  3. java开发的微信公众号服务端生产环境中的两个大坑

    摘要: 我们开发的公众号,由于将功能开发完毕后,未对服务进行压力测试,因此用到的组件中的参数值全是默认的,服务上线后一段时间运行得倒没什么问题,随着服务得访问量增加,一些多线程并发的问题就逐步暴露出来 ...

  4. 微信小程序服务端开发遇到的一些坑

    微信小程序服务端开发遇到的一些坑 开发环境 问题集合 小程序不支持基于进入客服事件推送消息 小程序不支持永久素材 RestTemplate无法解析上传图片素材的返回 tips 其他小问题 开发环境 基 ...

  5. java项目_好程序员Java分享从入门到服务端项目开发的过程

    好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...

  6. 基于spring-boot+uni-app实现app支付功能(微信/支付宝)服务端

    基于spring-boot+uni-app实现app支付功能(微信/支付宝)服务端 支付宝支付 1 准备工作 申请支付能力 接口加签方式 2代码 依赖 支付宝支付配置类 支付宝控制层 异步通知 微信支 ...

  7. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  8. 金蝶服务端调用OSF服务

    在金蝶使用中会用前端和后端调用OSF服务 1.  前端调用方法: shr.callService({serviceName : "transformationService",pa ...

  9. JAVA数据加密压缩传输给服务端(Gzip加AES)

    上一话说到HTTP数据传输用Gzip方式压缩,用springboot分别写了客户端和服务端的代码测试. 对应博客地址 Java数据压缩HTTP方式传输Gzip(附带测试代码及springboot-HT ...

  10. 阿里云服务器上搭建微信小程序服务端环境。

    无论是搭建个人博客空间也好,微信小程序也罢,搭建环境必需的两点:云服务器.域名,下面一步步给搭建演示如果在一台阿里云服务器上搭建微信小程序服务端环境. 1.云服务器准备:可在阿里云购买ECS服务器   ...

最新文章

  1. Hibernate之对象关系映射文件
  2. Quartus II18.0安装教程
  3. 使用docker-compose配置redis服务
  4. VC获取父进程PID
  5. python图像转字符画_python图像处理-字符画风格图片
  6. c# selenium chrome 文件下载_Selenium 框架原理以及环境安装
  7. bzoj4998: 星球联盟
  8. linux思科认证,思科CCIE认证知识点之IPv6地址
  9. 在实际工作中,WPS对比office,谁更强?
  10. 自己写个简易版 PicGo
  11. java崩溃停在崩溃代码上_通过编写Java代码让Jvm崩溃
  12. ios中UIWebview和asiHttprequest的用法
  13. 机器学习可解释性(二) 之 可解释模型
  14. 简述计算机键盘上shift键的作用,Shift键的作用
  15. C语言实现lagrange theorem拉格朗日定理的算法(附完整源码)
  16. 光流传感器 定位精度_光流定位原理是什么??
  17. Kubernetes(k8s)的Secret以密文的方式存储数据
  18. Ubuntu 20.4 美化桌面、美化引导界面、Mac 既视感
  19. 彻底删除oracle数据,彻底删除Oracle数据库的方法
  20. 计算机科学与技术的专业概论论文,计算机科学与技术专业概论论文.docx

热门文章

  1. sqli-labs(18-22)
  2. luogu P1653 猴子
  3. 研究生研一学习机器学习ML、深度学习DL的规划
  4. 刀具半径补偿 c语言,C语言程序实现数控加工刀具半径补偿原理与坐标计算.pdf...
  5. luoguP3403 跳楼机
  6. python计算圆周率_【Python】计算圆周率到小数点后任意位数
  7. CodeForces 312B Archer
  8. vs2019中出现PyTorch is not linked with support for cuda devices的解决方法
  9. 《创业基础》创新创业章节测试【3-8】
  10. 《人生七年》-------殊途同归