微信公众号开发
第三章 素材
1.临时素材
公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放(注:自定义菜单接口和素材管理接口向第三方平台旗下未认证订阅号开放)。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
2.方法
在进行媒体(图片,语音,视频,音乐)消息开发时,需先上传媒体到微信服务器,得到media_id,才能进行接下来的后续开发
3.素材格式:
具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过2M,长度不超过60秒(公众平台官网可以在文章中插入小于30分钟的语音,但这些语音不能用于群发等场景,只能放在文章内,这方面接口暂不支持),支持mp3/wma/wav/amr格式
临时素材参数说明:
/** * 上传临时素材 * @param api * @param filePath * @param accessToken * @param type * @return * @throws IOException */ public static String uploadLs(String filePath,String accessToken,String type) throws IOException{ JSONObject jsonObject = uploadCommon(UPLOAD_URL, filePath, accessToken, type); String typeName = "media_id"; if(!"image".equals(type)){//如果是图片格式的直接用media_id,否则用type拼接 _media_id typeName = type + "_media_id"; } String mediaId = jsonObject.getString(typeName); return mediaId; } /** * 上传图文消息内的图片获取URL * @param filePath * @param accessToken * @param type * @return * @throws IOException */ public static JSONObject uploadImage(String filePath,String accessToken) throws IOException{ JSONObject jsonObject = uploadCommon(UPLOAD_SEND_IMAGE, filePath, accessToken, null); return jsonObject; } /** * 文件上传 (通用) * @param filePath * @param accessToken * @param Type * @return * @throws IOException */ public static JSONObject uploadCommon(String api,String filePath,String accessToken,String type) throws IOException{ File file = new File(filePath); if(!file.exists() || !file.isFile()){ throw new IOException("文件不存在"); } String url = null; if(type==null){ url = api.replace("ACCESS_TOKEN", accessToken); }else{ url = api.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type); } URL urlObj = new URL(url); //连接 HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); con.setRequestMethod("POST"); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false);//忽略缓存 //设置请求头信息 con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); //设置边界 String BOUNDARY = "----------" + System.currentTimeMillis(); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); StringBuilder sb = new StringBuilder(); sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition:form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] head = sb.toString().getBytes("UTF-8"); //获得输出流 OutputStream out = new DataOutputStream(con.getOutputStream()); //输出表头 out.write(head); //文件正文部分 //把文件以流的方式 推入到url中 DataInputStream in = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut))!=-1){ out.write(bufferOut,0,bytes); } in.close(); //结尾部分 byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");//定义最后数据分割线 out.write(foot); out.flush(); out.close(); StringBuffer buffer = new StringBuffer(); BufferedReader reader = null; String result = null; try { //定义BufferedReader输入流来读取url的响应 reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line = null; while((line = reader.readLine())!=null){ buffer.append(line); } if(result == null){ result = buffer.toString(); } } catch (IOException e) { e.printStackTrace(); }finally { if(reader!=null){ reader.close(); } } JSONObject jsonObj = JSONObject.fromObject(result); //System.out.println(jsonObj); /*String typeName = "media_id"; if(!"image".equals(type)){//如果是图片格式的直接用media_id,否则用type拼接 _media_id typeName = type + "_media_id"; } String mediaId = jsonObj.getString(typeName);*/ return jsonObj; } /** * 上传图文消息素材(推送前一步) * @param token * @param news * @return */ public static JSONObject updateSendNews(String token,String news){ String url = UPLOAD_SEND_NEWS.replace("ACCESS_TOKEN", token); JSONObject jsonObject = doPostStr(url, news); return jsonObject; } /** * 图文消息群发推送 * @param token * @param sendnews * @return */ public static JSONObject sendNews(String token,String sendnews){ String url = SEND_NEWS.replace("ACCESS_TOKEN", token); JSONObject jsonObject = doPostStr(url, sendnews); return jsonObject; } /** * 图文消息预览 * @param token * @param previewnews * @return */ public static JSONObject previewNews(String token,String previewnews){ String url = PREVIEW_NEWS.replace("ACCESS_TOKEN", token); JSONObject jsonObject = doPostStr(url, previewnews); return jsonObject; }
(下一章:微信公众号-消息回复)