2017-11-05 10:00:58 towtotow 阅读数 380
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14301 人正在学习 去看看 秦子恒

微信公众平台中,

临时素材是一种重要的素材,

它的特点是:
1. 没有数量限制,你可以上传任意数量的临时素材

2. 微信服务器保存时间短,只有3天,到期后media_id就不能使用了


32upload.jpg


这一节课程中,

我们先来实现临时图片的上传…

php上传公众号临时素材视频教程在线观看

http://edu.csdn.net/course/detail/2860/45751

2016-09-15 12:00:42 sam976 阅读数 4427
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14301 人正在学习 去看看 秦子恒

关键字:curl、微信开发、上传永久素材

前言

微信开发,需要使用的素材(如图片、视频)必须先上传到微信服务器,通过微信服务器返回的meida_id在腾讯系域名内使用。当然可以直接使用代码来实现上传请求,获取微信服务器返回的media_id,但是这样的方式略显麻烦,幸亏微信开发可以通过curl命令直接上传素材获取返回的url。

curl下载安装

curl是一种命令行工具,作用是发出网络请求,得到和提取返回的数据。在curl工具下载页根据系统下载相应的版本,比如Windows系统下载win32版本,需要注意的是,如果没有使用ssl协议(https),直接下载无ssl版本即可,比如curl-7.16.0-win32-nossl.zip。如果使用了ssl协议(https),就得下载ssl版本,比如curl-7.16.0-win32-ssl.zip,使用ssl版本还需要下载OpenSSL软件(安装exe即可)实现SSL协议。

curl上传素材

下载完成的curl压缩包解压之后,打开dos命令行工具(cmd),从dos进入curl根目录(cd..)。输入curl命令即可上传素材到微信服务器。命令如下:

curl  -F media=@1.jpg -F type=image "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=LJLJ3oEHi8rcuJnUv6RryYHpiVybevrtR4upY_W5_gqXLDhtAHj2-qaxYzfMKe2gSQtO4mPsmoWmu9LUPvLv7cNtnmtC1ezZj2lxwqd9U1eY35rTeuhoyufpcfmf4XgLLXZdAAACOQ"

命令需要注意两点:①上传素材的地址相对于curl目录,路径要确认无误,否则curl会找不到素材,一般把素材放在curl目录中。②什么微信公众号使用该素材,就得用该微信公众号的appid和appsecret生成的access_token,否则在微信公众号中无法使用该素材。

在dos中返回的字符串

{"media_id":"1YTbzmBpzu9_MDbee6yPlfvtqNbJufAbqJmsb3kkFA","url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/gMreo1rjy9LIGD9GVeNyWmPHV2nzmiaBXhs8qVaDloQ4iaIhHhIwJAu4ZnmuyIPFqvGCZDacTn748eq4iaBmYXj3Q\/0?wx_fmt=jpeg"}

其中的media_id就可以在微信中唯一标记我们上传的永久素材。
2018-02-06 10:16:28 BuFanQi_Info 阅读数 2403
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14301 人正在学习 去看看 秦子恒

简介

微信素材分为临时素材和永久素材两种

  • 新增临时素材
    公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
    注意点:
    1、临时素材media_id是可复用的。
    2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
    3、上传临时素材的格式、大小限制与公众平台官网一致。
    图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
    视频(video):10MB,支持MP4格式
    缩略图(thumb):64KB,支持JPG格式

  • 新增永久素材
    对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。
    请注意:
    1、最近更新:永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
    2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
    3、素材的格式大小等要求与公众平台官网一致:
    图片(image): 2M,支持bmp/png/jpeg/jpg/gif格式
    语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式
    视频(video):10MB,支持MP4格式
    缩略图(thumb):64KB,支持JPG格式
    4、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过”上传图文消息内的图片获取URL”接口上传图片获取。
    5、”上传图文消息内的图片获取URL”接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
    6、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。
    PS:=============请查阅JAVA微信公众号开发第1篇之环境配置与开发接入进行基本微信接入配置============

上传微信素材

使用wxService.mediaUpload(mediaType, fileType, inputStream)方法

/**
    * <p>Title: addImgMaterial</p>
    * <p>Description: 上传我的二维码(永久)</p>
    * @param headurl 头像
    * @param wxqr    二维码
    * @return
    * @throws WxErrorException
    * @throws IOException
    */
    public WxMediaUploadResult addImgMaterial(String nickname,String openid,String headurl,String wxqr) throws WxErrorException, IOException{
        WxMediaUploadResult wxMediaUploadResult=wxService.mediaUpload(WxConsts.MEDIA_IMAGE,WxConsts.FILE_JPG,PictureMerge.getImageStream(PictureMerge.myQr(nickname,openid,headurl, wxqr)));
        return wxMediaUploadResult;
    }

博主这是通过头像、带参二维码和系统背景图生成用户针对本公众号的专属二维码,具体生成方法请查阅JAVA工具类之多图片合成与图片添加文字博文

总结

本文博主通过引入微信jar的方式,使用封装的方法进行素材上传,详细读者可以查阅微信jar源码,了解详细开发步骤。
这里写图片描述

效果

这里写图片描述
这里写图片描述

2018-11-02 14:08:35 Thinkingcao 阅读数 1286
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14301 人正在学习 去看看 秦子恒

1、前言

微信公众号在使用的接口的时候是通过media_id来进行的,所以在使用的接口的时候我们往往需要先上传素材,素材管理分为临时素材和永久素材

1)、临时素材媒体文件在微信后台保存时间为3天,即3天后media_id失效,详细文档查看:上传临时素材

2)、开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。
除了可以上传以上提到的4种素材外,还可以上传图文素材。
以下是一些说明:
a. 公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
b. 图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。
c. "上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
d. 图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。

3)、支持上传素材的格式和限制如下

图片(image): 2M,支持PNG\JPEG\JPG\GIF格式。

语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式。

视频(video):10MB,支持MP4格式。

缩略图(thumb):64KB,支持JPG格式。

2、微信框架

 微信开源框架全家桶使用 : https://github.com/Wechat-Group/weixin-java-tools   
 微信公众号框架参考     : weixin-java-mp 
 本项目微信公众号框架   : weixin-java-mp3.0.0 
 <dependency>
         <groupId>com.github.binarywang</groupId>
         <artifactId>weixin-java-mp</artifactId>
         <version>3.0.0</version>
 </dependency>

3、微信素材管理工具类

package com.thinkgem.jeesite.modules.wechat.commonUtil;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.fs.FileUtils;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.WxMpMassNews;
import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult;
import me.chanjar.weixin.mp.bean.material.WxMpMaterial;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialCountResult;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialFileBatchGetResult;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews.WxMpMaterialNewsArticle;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult;
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;

/**
 * <pre>
 * 微信素材管理 <br />
 * 注 : 封面图需要用永久、富文本中图片永久和临时都可以、群发图文如果临时用下就用临时素材,否则用永久素材(大部分选永久)
 * @author cao_wencao
 * @date 2018年8月8日
 * </pre>
 */
@Slf4j
@Component
public class WeChatUtils {
    @Autowired
    private WxMpService wxMpService;

    private static Map<String, Map<String, Object>> mediaIds = Maps.newLinkedHashMap();

    /**
     * <pre>
     * 上传群发用的图文消息,上传后才能群发图文消息.
     * 
     * @see #massGroupMessageSend(WxMpMassTagMessage) 按分组群发
     * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) 按openid群发
     * @author cao_wencao
     * @param news
     * @return
     * </pre>
     */
    public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) {
        // 图文上传
        WxMpMassUploadResult massUploadResult = null;
        try {
            massUploadResult = wxMpService.getMassMessageService().massNewsUpload(news);
            if (null != massUploadResult) {
                log.info("\n【上传图文素材】成功:  {}", massUploadResult.getMediaId());
                return massUploadResult;
            }
        }
        catch (Exception e) {
            log.error("\n【上传图文素材】失败 :  {}", e.getMessage());
            e.printStackTrace();
        }
        return massUploadResult;

    }

    /**
     * <pre>
     * 上传临时多媒体文件 
     * 比如图文消息的封面图 图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
     * 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式 视频(video):10MB,支持MP4格式
     * 缩略图(thumb):64KB,支持JPG格式
     * 
     * @author cao_wencao
     * @param mediaType
     *            媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
     * @param fileType
     *            文件后缀
     * 
     * @param inputStream
     *            文件输入流
     * @return type,media_id,created_at
     * </pre>
     */
    public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) {
        if (null == inputStream || null == mediaType || null == fileType) {
            return null;
        }
        WxMediaUploadResult res = null;
        try {
            res = this.wxMpService.getMaterialService().mediaUpload(mediaType, fileType, inputStream);
            log.info("\n【多媒体文件上传】成功MediaId : {} ", res.getMediaId());
            return res;
        }
        catch (Exception e) {
            log.error("\n【多媒体文件上传】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return res;
    }

    /**
     * <pre>
     * 上传图文消息内的图片获取URL(图文消息里面的图片)
     * 
     * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">新增永久素材</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
     * </pre>
     *
     * @param file
     *            上传的文件对象
     * @return WxMediaImgUploadResult 返回图片url
     * 
     */
    public WxMediaImgUploadResult uploadimg(File file) {
        if (null == file) {
            return null;
        }
        WxMediaImgUploadResult imageUploadResult = null;
        try {
            imageUploadResult = this.wxMpService.getMaterialService().mediaImgUpload(file);
            log.info("\n【上传图文消息内的图片】成功  : {}", imageUploadResult.getUrl());
            return imageUploadResult;
        }
        catch (Exception e) {
            log.error("\n【上传图文消息内的图片】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        return imageUploadResult;
    }

    /**
     * <pre>
     * 获取临时素材
     * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)。请注意,视频文件不支持https下载,调用该接口需http协议。
     * 本接口即为原“下载多媒体文件”接口。
     * 根据微信文档,视频文件下载不了,会返回null
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738727&token=&lang=zh_CN">获取临时素材</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
     * </pre>
     *
     * @param mediaId
     *            媒体文件Id
     * @return 保存到本地的临时文件
     * @throws Exception
     */
    public File DownloadMaterial(String mediaId) {
        if (null == mediaId) {
            return null;
        }

        File file = null;
        try {
            file = this.wxMpService.getMaterialService().mediaDownload(mediaId);
            return file;
        }
        catch (Exception e) {
            log.error("\n【下载临时素材】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        return file;

    }

    // =======================================永久素材 :
    // 下载、上传、删除、更新====================================================

    /**
     * <pre>
     * 新增其他类型永久素材 非图文永久素材上传 
     * @author cao_wencao
     * @param mediaType
     *            媒体文件类型 :分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
     *            images支持 :bmp/png/jpeg/jpg/gif格式
     * @param fileType
     * @param fileName
     * @return WxMpMaterialUploadResult : "media_id":MEDIA_ID,  "url":URL(永久素材类型为images才会返回url)
     * </pre>
     */
    public WxMpMaterialUploadResult uploadFilesToWeChat(String mediaType, String fileType, String fileName, InputStream inputStream) {
        if (null == mediaType || null == fileType || null == inputStream || null == fileName) {
            return null;
        }
        WxMpMaterialUploadResult uploadResult = null;
        try {
            File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType);
            WxMpMaterial wxMaterial = new WxMpMaterial();
            wxMaterial.setFile(tempFile);
            wxMaterial.setName(fileName);
            // 视频类永久素材需要在构造时传入视频名title和简介introduction,目前已知视频支持mp4格式。
            if (WxConsts.MediaFileType.VIDEO.equals(mediaType)) {
                wxMaterial.setVideoTitle("title");
                wxMaterial.setVideoIntroduction("test video description");
            }
            // 上传素材至微信服务器
            uploadResult = wxMpService.getMaterialService().materialFileUpload(mediaType, wxMaterial);
            // 图片才会有url,其他均是media_id
            if (null != uploadResult && !StringUtils.isBlank(uploadResult.getMediaId())) {
                log.info("\n【上传素材mediaType】 : {},{}成功!", uploadResult.getUrl(), uploadResult.getMediaId());
                return uploadResult;
            }
        }
        catch (Exception e) {
            log.error("\n【上传素材mediaType】: {}失败 ", e.getMessage());
            e.printStackTrace();
        }
        return uploadResult;

    }

    /**
     * <pre>
     * 新增永久图文素材 
     * 方法名: uploadNewsToWeChat 
     * 参数: WxMpMaterialNews 
     * 返回值:
     * WxMpMaterialUploadResult 图文素材支持单图文和多图文,由类 WxMpMaterialNews 进行封装,图文的数据通过类
     * WxMpMaterialNews.WxMpMaterialNewsArticle 封装。 多图文消息在 WxMpMaterialNews 中调用
     * addArticle 方法添加多个 WxMpMaterialNewsArticle 对象即可。 接口返回 新增图文消息的media_id
     * 
     * @author cao_wencao
     * @param materialNews
     *            要上传的图文消息的素材
     * @return String
     * </pre>
     */
    public WxMpMaterialUploadResult uploadNewsToWeChat(WxMpMaterialNews materialNews) {
        String media_id = null;
        WxMpMaterialUploadResult uploadResult = null;
        try {
            uploadResult = wxMpService.getMaterialService().materialNewsUpload(materialNews);
            if (null != uploadResult && !StringUtils.isBlank(uploadResult.getMediaId())) {
                media_id = uploadResult.getMediaId();
                log.info("\n【上传图文消息】成功:{}", media_id);
                return uploadResult;
            }
        }
        catch (Exception e) {
            log.error("\n【上传图文素材】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        return uploadResult;
    }

    /**
     * <pre>
     * 图文永久素材下载 根据 media_id 获取图文消息,
     * 结果由 WxMpMaterialNews 封装,该类的结构和微信服务器返回的 json,
     * 格式数据的结构保持一致。
     * 
     * @author cao_wencao
     * @param newsMediaId
     *            要下载的图文消息的id
     * @return WxMpMaterialNews
     * </pre>
     */
    public WxMpMaterialNews newsInfoDownload(String newsMediaId) {
        WxMpMaterialNews wxMpMaterialNews = null;
        try {
            wxMpMaterialNews = wxMpService.getMaterialService().materialNewsInfo(newsMediaId);
            log.info("\n【下载图文素材】成功 : {}", wxMpMaterialNews.toJson().toString());
            return wxMpMaterialNews;
        }
        catch (Exception e) {
            log.error("\n【下载图文素材】失败 :{}", newsMediaId);
            e.printStackTrace();
        }
        return wxMpMaterialNews;
    }

    /**
     * <pre>
     * 永久素材删除 根据 media_id 删除素材
     * 
     * @author cao_wencao
     * @param mediaId
     *            要删除的图文消息的id
     * @return Boolean
     * </pre>
     */
    public Boolean DeleteMaterial(String mediaId) {
        Boolean result = false;
        try {
            result = wxMpService.getMaterialService().materialDelete(mediaId);
            log.info("\n【删除永久素材】成功 : {} ;/n返回值 : {} ", mediaId, result);
            return result;
        }
        catch (Exception e) {
            log.error("\n【删除永久素材】失败 : {} ;/n返回值 : {} ", mediaId, result);
            e.printStackTrace();
        }
        return result;
    }

    /**
     * <pre>
     * 获取图文素材列表 并且下载
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738734&token=&lang=zh_CN">获取素材列表</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
     * @param offset
     *            从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
     * @param count
     *            返回素材的数量,取值在1到20之间
     * </pre>
     */
    public WxMpMaterialNews materialNewsBatchGet(int offset, int count) throws Exception {
        if (offset < 0 || count <= 0) {
            return null;
        }
        WxMpMaterialNewsBatchGetResult newsBatchGetResult = null;
        WxMpMaterialNews wxMpMaterialNews = null;
        try {
            newsBatchGetResult = this.wxMpService.getMaterialService().materialNewsBatchGet(offset, count);
            if (newsBatchGetResult.getTotalCount() > 0 || newsBatchGetResult.getItemCount() > 0) {
                List<WxMaterialNewsBatchGetNewsItem> items = newsBatchGetResult.getItems();
                for (int i = 0; i < items.size(); i++) {
                    String mediaId = items.get(i).getMediaId();
                    if (StringUtils.isBlank(mediaId)) {
                        log.debug("【获取微信图文素材mediaId】失败!");
                        return null;
                    }
                    // 调取图文素材下载接口 ,参数 :mediaId
                    wxMpMaterialNews = newsInfoDownload(mediaId);
                }
            }
            if (newsBatchGetResult.getTotalCount() == 0 || newsBatchGetResult.getItemCount() == 0) {
                log.info("【获取微信图文素材列表】为空!");
                return null;
            }
        }
        catch (Exception e) {
            log.error("\n【获取微信图文素材列表】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        return wxMpMaterialNews;
    }

    /**
     * <pre>
     * 图片或声音永久素材下载
     * 根据 media_id 获取声音或者图片的输入流 
     * 
     * @author cao_wencao
     * @param mediaId
     *            要下载的图文消息的id
     * @return InputStream
     * </pre>
     */
    public InputStream materialImageOrVoiceDownload(String mediaId) {
        if (null == mediaId) {
            return null;
        }
        InputStream inputStream = null;
        try {
            inputStream = wxMpService.getMaterialService().materialImageOrVoiceDownload(mediaId);
            if (null != inputStream) {
                log.info("\n【下载图片或声音永久素材】成功 : {}", mediaId);
                return inputStream;
            }
        }
        catch (Exception e) {
            log.error("\n【下载图片或声音永久素材】失败 :{} \n媒体ID : {} ", e.getMessage(), mediaId);
            e.printStackTrace();
        }
        finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return inputStream;
    }

    /**
     * <pre>
     * 获取视频永久素材
     * 
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">获取永久素材</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
     * </pre>
     *
     * @param mediaId
     *            永久素材的id
     */
    public WxMpMaterialVideoInfoResult materialVideoInfo(String mediaId) {
        if (null == mediaId) {
            return null;
        }
        WxMpMaterialVideoInfoResult videoInfoResult = null;
        try {
            videoInfoResult = this.wxMpService.getMaterialService().materialVideoInfo(mediaId);
            if (null != videoInfoResult) {
                log.info("\n【下载视频永久素材】成功 : {}", mediaId);
                return videoInfoResult;
            }
        }
        catch (Exception e) {
            log.error("\n【下载取视频永久素材】失败 : {} \n媒体ID : mediaId", e.getMessage(), mediaId);
            e.printStackTrace();
        }
        return videoInfoResult;
    }

    /**
     * <pre>
     * 分页获取其他媒体素材列表
     * @author cao_wencao
     * @param type    素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
     * @param offset  从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
     * @param count   返回素材的数量,取值在1到20之间
     * @return
     */
    public WxMpMaterialFileBatchGetResult materialFileBatchGet(String type, int offset, int count) {
        if (null == type || offset < 0 || count <= 0) {
            return null;
        }
        WxMpMaterialFileBatchGetResult fileBatchGetResult = null;
        try {
            fileBatchGetResult = this.wxMpService.getMaterialService().materialFileBatchGet(type, offset, count);
            if (fileBatchGetResult.getTotalCount() < 0 || fileBatchGetResult.getItemCount() < 0) {
                log.error("【获取微信图文素材列表】失败!");
            }
        }
        catch (Exception e) {
            log.error("\n【获取微信图文素材列表】失败 : {}", e.getMessage());
            e.printStackTrace();
        }
        return fileBatchGetResult;

    }

    /**
     * <pre>
     * 修改永久图文素材 根据更新图文对象更新图文素材,对于多图文消息,如需更新其中某一个,需要设置更新对象中的index属性
     * 
     * @author cao_wencao
     * @param newsMediaId
     *            要修改的图文消息的id
     * @param index
     *            要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
     * @param materialNews
     *            图文消息内容及相关
     * @return
     * </pre>
     */
    public boolean UpdateNewsInfo(String newsMediaId, int index, WxMpMaterialNews materialNews) {
        // 获取图文永久素材的信息
        WxMpMaterialNews wxMpMaterialNews = null;
        try {
            wxMpMaterialNews = wxMpService.getMaterialService().materialNewsInfo(newsMediaId);
            log.info("\n【获取图文永久素材】成功 :{}", wxMpMaterialNews.toJson().toString());
        }
        catch (Exception e) {
            log.error("\n【获取永久图文素材】失败 : {} ", newsMediaId);
            e.printStackTrace();
        }
        // 图文素材更新实体类
        WxMpMaterialArticleUpdate wxMpMaterialArticleUpdate = new WxMpMaterialArticleUpdate();
        // dest article 目的article
        WxMpMaterialNews.WxMpMaterialNewsArticle article = new WxMpMaterialNewsArticle();
        // 更新一条单图文
        List<WxMpMaterialNewsArticle> newsArticleList = materialNews.getArticles();
        // source article 来源article2
        WxMpMaterialNews.WxMpMaterialNewsArticle article2 = new WxMpMaterialNewsArticle();
        for (int i = 0; i < newsArticleList.size(); i++) {
            article2 = newsArticleList.get(i);
            article.setContent(article2.getContent());
            article.setAuthor(article2.getAuthor());
            article.setContentSourceUrl(article2.getContentSourceUrl());
            article.setDigest(article2.getDigest());
            article.setShowCoverPic(article2.isShowCoverPic());
            article.setThumbMediaId(newsMediaId);
            article.setNeedOpenComment(article2.getNeedOpenComment());
            article.setOnlyFansCanComment(article2.getOnlyFansCanComment());
            article.setThumbUrl(article2.getThumbUrl());
            article.setTitle(article2.getTitle());
            article.setUrl(article2.getUrl());
            wxMpMaterialArticleUpdate.setMediaId(newsMediaId);
            wxMpMaterialArticleUpdate.setArticles(article);
            wxMpMaterialArticleUpdate.setIndex(index);
        }
        boolean updateResult = false;
        try {
            updateResult = wxMpService.getMaterialService().materialNewsUpdate(wxMpMaterialArticleUpdate);
            log.info("\n【修改永久图文素材】成功 : {} ", updateResult);
            return updateResult;
        }
        catch (Exception e) {
            log.error("\n【修改永久图文素材】失败 : {} ", updateResult);
            e.printStackTrace();
        }
        return updateResult;
    }

    /**
     * <pre>
     * 获取图文永久素材的信息
     * 
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">获取永久素材</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
     * </pre>
     *
     * @param mediaId
     *            永久素材的id
     */
    public WxMpMaterialNews getMaterialInfo(String mediaId) {
        WxMpMaterialNews wxMpMaterialNews = null;
        try {
            wxMpMaterialNews = wxMpService.getMaterialService().materialNewsInfo(mediaId);
            if (null != wxMpMaterialNews) {
                log.info("\n【从微信媒体库获取图文永久素材】成功 :{}", wxMpMaterialNews.toJson().toString());
                return wxMpMaterialNews;
            }
        }
        catch (WxErrorException e) {
            log.error("\n【从微信媒体库获取永久图文素材】异常 ,媒体ID :{}", mediaId);
            e.printStackTrace();
        }
        return null;
    }

    
    /**
     * <pre>
     * 获取各类素材总数
     * 开发者可以根据本接口来获取永久素材的列表,需要时也可保存到本地。
     * 请注意:
     *  1.永久素材的总数,也会计算公众平台官网素材管理中的素材
     *  2.图片和图文消息素材(包括单图文和多图文)的总数上限为5000,其他素材的总数上限为1000
     *  3.调用该接口需https协议
     * 
     * 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738733&token=&lang=zh_CN">获取素材总数</a>
     * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=ACCESS_TOKEN
     *  "voice_count":COUNT, 语音总数量
     *  "video_count":COUNT, 视频总数量
     *  "image_count":COUNT, 图片总数量
     *  "news_count":COUNT   图文总数量
     * </pre>
     */
    public String materialCount(String materiaType) {
        WxMpMaterialCountResult resultCount = null; //素材总数返回类
        String newsCount = null; // 图文素材数量
        String imageCount = null;// 图片素材数量
        try {
            resultCount = wxMpService.getMaterialService().materialCount();
            JSONObject jsonObject = (JSONObject) JSON.toJSON(resultCount);
            if (null != resultCount && WxConsts.MaterialType.IMAGE.equals(materiaType)) {
                imageCount = jsonObject.getString("imageCount"); // 图片素材总数
                log.info("【获取图片总数成功,image_Count】:{}条", imageCount);
                return imageCount;
            }if (null != resultCount && WxConsts.MaterialType.NEWS.equals(materiaType)) {
                newsCount = jsonObject.getString("newsCount"); // 图文素材总数
                log.info("【获取图文总数成功,news_Count】:{}条", newsCount);
                return newsCount;
            }
        }
        catch (WxErrorException e) {
            log.error("\n【获取各类素材总数】异常 {}", e.getMessage());
            e.printStackTrace();
        }
        return null;

    }

}

 

2017-12-07 11:07:43 qq_29062579 阅读数 3310
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14301 人正在学习 去看看 秦子恒

开发微信公众号的时候遇到了很多细节的问题,不多测试只看文档真的没办法发现,这个就是我发现的问题,为何我调用微信端的图文消息上传api老是提示 40007错误,也就是无效的media_id,这里有两个细节。1是这里写图片描述
上面的图片是调用的是微信接收消息群发接口的一个上传图文消息素材的api,这里必须使用的thumb_id是临时素材的media_id,如果你使用的是永久素材的media_id就会报错。而这个素材上传成功后是成为临时素材 ,因为可以查看素材库,上传成功后是找不到这个图文素材的。(强调:所以这里的thumb_id使用的必须是临时素材的media_id)。
那么永久素材的media_id是用在哪里呢?自然是有提供一个永久的图文消息素材的api,这个是在素材接口里面的。下图可查找这里写图片描述
细节2:这个thumb_id 需要的media_id的类型必须是thumb的,type有分为好几种这里写图片描述
所以这个缩略图的图片素材的类型必选使用thumb,这点也要注意。
这个问题网上找了好几个博客,结果都是一样的答案,所以提供一下我的理解。希望可以帮到大家。有问题可以互相讨论。

微信新增临时素材----图片

博文 来自: m0_38027358
没有更多推荐了,返回首页