MediaApi.java 14.2 KB
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<String, String> mapData = new HashMap<String, String>();
        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> mediaArticles) {
        String url = uploadNews + AccessTokenApi.getAccessTokenStr();

        Map<String, Object> dataMap = new HashMap<String, Object>();
        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> mediaArticles) {
        String url = add_news_url + AccessTokenApi.getAccessTokenStr();

        Map<String, Object> dataMap = new HashMap<String, Object>();
        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<String, String> dataMap = new HashMap<String, String>();
        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<String, Object> dataMap = new HashMap<String, Object>();
        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<String, Object> dataMap = new HashMap<String, Object>();
        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<String, Object> dataMap = new HashMap<String, Object>();
        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<String, Object> dataMap = new HashMap<String, Object>();
        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<MediaArticles> mediaArticlesList = new ArrayList<MediaArticles>();
    	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”的运营服务。公司最终整合 "
                                + "动态交通和静态交通的信息数据资源,通过物联网、云计算及大数据技术,"
                                + "为客户提供全方位的交通管理与综合交通 信息服务。"
                                + "公司秉承“构建绿色交通,享受安全便利出行”的使命,致力于实现客户价值最大化,矢志成为“智慧交通领域的领跑者”。<br/>"
                                + "<img alt=\"\" data-src=\"\" src=\"http://mmbiz.qpic.cn/mmbiz_jpg/GvjIxopRiaeod7SedB3Pl4wicvdIyE3xfRXv0ReyHr20MUmBia8Q0w8UPYGGJJyqFm71k8ZBXrtibU8uNPD7gK0iaCg/0\"/>");
    	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  
    		}

}