package com.jfinal.weixin.sdk.api; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.util.IOUtils; import com.jfinal.kit.PathKit; import com.jfinal.kit.PropKit; import com.jfinal.weixin.sdk.utils.HttpUtils; import com.jfinal.weixin.sdk.utils.JsonUtils; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 素材管理 * @author l.cm * 文档:http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html */ public class MediaApi { /** * 上传的临时多媒体文件有格式 * 分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) */ public static enum MediaType { IMAGE, VOICE, VIDEO, THUMB; // 转化成小写形式 public String get() { return this.name().toLowerCase(); } } // 新增临时素材 private static String upload_url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token="; /** * 上传临时素材 * @param mediaType 上传的临时多媒体文件有格式 * @param file 需要上传的文件 * @return ApiResult */ public static ApiResult uploadMedia(MediaType mediaType, File file) { String url = upload_url + AccessTokenApi.getAccessTokenStr() + "&type=" + mediaType.get(); String jsonStr = HttpUtils.upload(url, file, null); return new ApiResult(jsonStr); } // 文档中是需要用https,实际采用https会报错 private static String uploadVideoUrl = "http://file.api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token="; /** * 视频群发的消息素材上传 * @param mediaId 用于群发的消息的media_id * @param title 消息的标题 * @param description 消息的描述 * @return {ApiResult} */ public static ApiResult uploadVideo(String mediaId, String title, String description) { String url = uploadVideoUrl + AccessTokenApi.getAccessTokenStr(); Map mapData = new HashMap(); mapData.put("media_id", mediaId); mapData.put("title", title); mapData.put("description", description); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(mapData)); return new ApiResult(jsonResult); } private static String uploadNews = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token="; /** * 上传图文消息素材【订阅号与服务号认证后均可用】 * @param mediaArticles 素材实体 * @return {ApiResult} */ public static ApiResult uploadNews(List mediaArticles) { String url = uploadNews + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("articles", mediaArticles); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } private static String get_url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token="; /** * 获取临时素材 * @param media_id 素材Id * @return MediaFile */ public static MediaFile getMedia(String media_id) { String url = get_url + AccessTokenApi.getAccessTokenStr() + "&media_id=" + media_id; return HttpUtils.download(url); } private static String get_jssdk_media = "https://api.weixin.qq.com/cgi-bin/media/get/jssdk?access_token="; /** * 高清语音素材获取接口 * * 公众号可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。 * 该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。 * * @param media_id 素材Id * @return MediaFile */ public static MediaFile getJssdkMedia(String media_id) { String url = get_jssdk_media + AccessTokenApi.getAccessTokenStr() + "&media_id=" + media_id; return HttpUtils.download(url); } private static String add_news_url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token="; /** * 新增永久图文素材 * @param mediaArticles 图文列表 * @return ApiResult */ public static ApiResult addNews(List mediaArticles) { String url = add_news_url + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("articles", mediaArticles); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } private static String uploadImgUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token="; /** * 上传图文消息内的图片获取URL * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。 * 图片仅支持jpg/png格式,大小必须在1MB以下。 * @param imgFile 图片文件 * @return ApiResult */ public static ApiResult uploadImg(File imgFile) { String url = uploadImgUrl + AccessTokenApi.getAccessTokenStr(); String jsonResult = HttpUtils.upload(url, imgFile, null); return new ApiResult(jsonResult); } private static String addMaterialUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="; /** * 新增其他类型永久素材 * @param file 文件 * @param mediaType 素材类型 * @return ApiResult */ public static ApiResult addMaterial(File file, MediaType mediaType) { String url = addMaterialUrl + AccessTokenApi.getAccessTokenStr() + "&type=" + mediaType.get(); String jsonResult = HttpUtils.upload(url, file, null); return new ApiResult(jsonResult); } /** * 新增视频永久素材 * 素材的格式大小等要求与公众平台官网一致。 * 具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式 * @param file 文件 * @param title 文件标题 * @param introduction 介绍 * @return ApiResult */ public static ApiResult addMaterial(File file, String title, String introduction) { String url = addMaterialUrl + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("title", title); dataMap.put("introduction", introduction); String jsonResult = HttpUtils.upload(url, file, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } // 获取永久素材 private static String get_material_url = "https://api.weixin.qq.com/cgi-bin/material/get_material?access_token="; /** * 获取永久素材 * @param media_id 要获取的素材的media_id * @return InputStream 流,考虑到这里可能返回json或file请自行使用IOUtils转换 */ public static InputStream getMaterial(String media_id) { String url = get_material_url + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("media_id", media_id); return HttpUtils.download(url, JsonUtils.toJson(dataMap)); } // 删除永久素材 private static String del_material_url = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token="; /** * 删除永久素材 * @param media_id 要获取的素材的media_id * @return ApiResult 返回信息 */ public static ApiResult delMaterial(String media_id) { String url = del_material_url + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("media_id", media_id); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } private static String update_news_url = "https://api.weixin.qq.com/cgi-bin/material/update_news?access_token="; /** * 修改永久图文素材 * @param media_id 要修改的图文消息的id * @param index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0 * @param mediaArticles 图文素材 * @return ApiResult 返回信息 */ public static ApiResult updateNews(String media_id, int index, MediaArticles mediaArticles) { String url = update_news_url + AccessTokenApi.getAccessTokenStr(); Map dataMap = new HashMap(); dataMap.put("media_id", media_id); dataMap.put("index", index); dataMap.put("articles", mediaArticles); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } // 获取素材总数 private static String get_materialcount_url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token="; /** * 获取素材总数 * @return ApiResult 返回信息 */ public static ApiResult getMaterialCount() { String url = get_materialcount_url + AccessTokenApi.getAccessTokenStr(); String jsonResult = HttpUtils.get(url); return new ApiResult(jsonResult); } // 获取素材列表 private static String batchget_material_url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token="; /** * 获取素材列表 * @param mediaType 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news) * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回 * @param count 返回素材的数量,取值在1到20之间 * @return ApiResult 返回信息 */ public static ApiResult batchGetMaterial(MediaType mediaType, int offset, int count) { String url = batchget_material_url + AccessTokenApi.getAccessTokenStr(); if(offset < 0) offset = 0; if(count > 20) count = 20; if(count < 1) count = 1; Map dataMap = new HashMap(); dataMap.put("type", mediaType.get()); dataMap.put("offset", offset); dataMap.put("count", count); String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap)); return new ApiResult(jsonResult); } public static void main(String[] args) { PropKit.use("a_little_config.txt"); ApiConfig apiConfig = new ApiConfig(); apiConfig.setAppId(PropKit.get("appId")); apiConfig.setAppSecret(PropKit.get("appSecret")); ApiConfigKit.putApiConfig(apiConfig); //1.传图片为永久素材 System.out.println(PathKit.getWebRootPath()); File file = new File(PathKit.getWebRootPath()+"/src/main/webapp/img/640.jpg"); ApiResult imgResult = MediaApi.addMaterial(file,MediaType.IMAGE); System.out.println("上传图片="+imgResult); //http://mmbiz.qpic.cn/mmbiz_jpg/GvjIxopRiaeqNudlENIB4d8fX2MTcp3uTIdZQ152jf1cZcM1HicKI4G1H8ibEndgECvvsTZMSnibVQNpr1wEvxBYjQ/0?wx_fmt=jpeg JSONObject json = JSONObject.parseObject(imgResult.getJson()); //上传图文消息 List mediaArticlesList = new ArrayList(); MediaArticles mediaArticles = new MediaArticles(); mediaArticles.setTitle("公司简介"); mediaArticles.setThumb_media_id(json.getString("media_id")); mediaArticles.setDigest("​中兴智能交通股份有限公司"); mediaArticles.setShow_cover_pic(false); mediaArticles.setContent("中兴智能交通股份有限公司成立于2000年4月,是中兴通讯股份有限公司投资的致力于交通运输领域智能交通 业务的专业公司,是中国第一批从事智能交通(ITS)产业的高新技术企业。"+ "公司的主营业务面向城市交通(公安交通、公共交通、智慧停车)," + "城际交通(高速公路和铁路)和综合交通信 息服务领域,为城市公安交通、" + "公共交通、智慧停车、高速公路和轨道交通五大综合交通运输领域提供交通规划、方 案设计、" + "系统建设、运营和服务,构建以智能交通核心产品技术的产品研发、生产、" + "系统建设和维护为一体的动静态 交通业务生态服务体系。" + "为客户提供个性化的智能交通解决方案和技术服务," + "同时公司在以智慧停车产品的研发、生产、 销售和服务为基础的静态交通服务的基础上," + "为用户出行提供“互联网+智慧停车”的“020”的运营服务。公司最终整合 " + "动态交通和静态交通的信息数据资源,通过物联网、云计算及大数据技术," + "为客户提供全方位的交通管理与综合交通 信息服务。" + "公司秉承“构建绿色交通,享受安全便利出行”的使命,致力于实现客户价值最大化,矢志成为“智慧交通领域的领跑者”。
" + "\"\""); mediaArticlesList.add(mediaArticles); ApiResult result= MediaApi.addNews(mediaArticlesList); System.out.println(result);//{"media_id":"O_g1TE11gGxFk1ZxRG0hjSQXX-hN541uJeYm0ZcJBKU"} InputStream inputStream = MediaApi.getMaterial(JSONObject.parseObject(result.getJson()).getString("media_id")); System.out.println(AccessTokenApi.getAccessTokenStr()); //curl "https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=-i7zksrYfHCa0cngOYQ7rDY-WnC8wE9Z-t9mrizm52j_xivT7S_f1wRRfJwxOU38zl1iUl2x6sf_manseP0mUI2eEA70gSOvQNHwYmN3QGTW74yBM4-TsUD8fxia29IVHKBdAFAWZQ" -d '{"media_id":"uoyEvtwgPnjvtY6EA6jgIDstDlIABN-EW7s9nQmPLtE"}' > /Users/wangfs/Desktop/a.html } }