• 微信开发素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材上传,删除,获取素材的media_id等等。欢迎反馈...
  • 关键字:curl、微信开发上传永久素材前言微信开发,需要使用的素材(如图片、视频)必须先上传到微信服务器,通过微信服务器返回的meida_id在腾讯系域名内使用。当然可以直接使用代码来实现上传请求,获取微信...

    关键字: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就可以在微信中唯一标记我们上传的永久素材。
    展开全文
  • 看了一下微信开发文档,发现微信对于上传永久素材这个接口,给出的文档太过简略,而且提供的样例也不是代码的方式,只给了一个curl的命令,用法倒是简单,但是用JAVA代码去掉用curl命令还是有诸多的不方便的。...

    最近帮朋友开发一个微信内容管理平台,想要利用这个平台上传图片或者视频资源到微信平台。看了一下微信的开发文档,发现微信对于上传永久素材这个接口,给出的文档太过简略,而且提供的样例也不是代码的方式,只给了一个curl的命令,用法倒是简单,但是用JAVA代码去掉用curl命令还是有诸多的不方便的。如是,考虑能不能用JAVA代码来模拟这个curl命令。

    百度了一下,发现似乎有不少人遇到这个问题,好多人都在问该如何利用JAVA代码上传永久素材。

    好在,确实找到了一个代码,能够上传视频格式的永久素材,原文地址如下:http://www.lanrenjz.com/news/show-1776.html

            代码如下:

         

    public static String postFile(String url, String filePath,
    String title,String introduction) {
    File file = new File(filePath);
    if(!file.exists())
    return null;
    String result = null;
    try {
    URL url1 = new URL(url); 
    HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(30000);  
                conn.setDoOutput(true);  
                conn.setDoInput(true);  
                conn.setUseCaches(false);  
                conn.setRequestMethod("POST"); 
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Cache-Control", "no-cache");
                String boundary = "-----------------------------"+System.currentTimeMillis();
                conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
                
    OutputStream output = conn.getOutputStream();
    output.write(("--" + boundary + "\r\n").getBytes());
    output.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", file.getName()).getBytes());  
    output.write("Content-Type: video/mp4 \r\n\r\n".getBytes());
            byte[] data = new byte[1024];
            int len =0;
            FileInputStream input = new FileInputStream(file);
    while((len=input.read(data))>-1){
    output.write(data, 0, len);
    }
    output.write(("--" + boundary + "\r\n").getBytes());
    output.write("Content-Disposition: form-data; name=\"description\";\r\n\r\n".getBytes());
    output.write(String.format("{\"title\":\"%s\", \"introduction\":\"%s\"}",title,introduction).getBytes());
    output.write(("\r\n--" + boundary + "--\r\n\r\n").getBytes());
    output.flush();
    output.close();
    input.close();
    InputStream resp = conn.getInputStream();
    StringBuffer sb = new StringBuffer();
    while((len= resp.read(data))>-1)
    sb.append(new String(data,0,len,"utf-8"));
    resp.close();
    result = sb.toString();
    System.out.println(result);
    } catch (ClientProtocolException e) {
    logger.error("postFile,不支持http协议",e);
    } catch (IOException e) {
    logger.error("postFile数据传输失败",e);
    }
    logger.info("{}: result={}",url,result);
    return result;
    }
    
    public static void main(String[] args) {
    String url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="
    + "U_0AIUrkfmVk0LXlaGu0lx5CXx-_4&type=video";
    postFile(url, "/Users/jlusoft/Desktop/test.mp4","test","dfd");
    }

    拿来一试,果然可行。

    下一篇:http://blog.csdn.net/oarsman/article/details/51538328

    展开全文
  • C#微信公众平台开发中的上传永久视频代码
  • //转载 记录一下这些都是测试过后可以使用的代码!本博文是记录一下。怎么上传临时的素材后获取id然后进行... php 微信开发之新增上传/获取下载临时素材 代码 define("AppID","");//你的id define("AppSecret", "");

    //转载
    记录一下这些都是测试过后可以使用的代码!本博文是记录一下。怎么上传临时的素材后获取id然后进行下载的。在微信里面临时的素材只能保留3天。3天过后便后自动的删除掉了。微信的也不提供获取临时素材的列表。那么看看下面代码
    php 微信开发之新增上传/获取下载临时素材 代码

    <?php 
    define("AppID","");//你的id 
    define("AppSecret", "");//你的secret
    
    /*  上传临时文件 */
    $a = "0";
    if($a == "1"){
    $type = "image";
    $filepath = dirname(__FILE__)."\w.jpg"; 
    $filedata = array("file1"  => "@".$filepath);
    $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".token()."&type=".$type;
    $result = https_request($url, $filedata);
    $p = json_decode($result);
    echo "media_id:".$p->media_id;
    }
    
    
    /*  获取临时的文件  */
    $b = "1";
    if($b == "1"){
    $id = "Zary6julqwRBBuSgzFbiMCSjYmG2930UvzjrbnHN4nyT3YGZVD8H-ecfoReGT1Qr";
    $url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=".token()."&media_id=".$id;
    $arr = downloadWeixinFile($url);
    saveWeixinFile("1.jpg",$arr['body']);
    
    }
    
    
    function downloadWeixinFile($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);    
        curl_setopt($ch, CURLOPT_NOBODY, 0);    //只取body头
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $package = curl_exec($ch);
        $httpinfo = curl_getinfo($ch);
        curl_close($ch);
        $imageAll = array_merge(array('header' => $httpinfo), array('body' => $package)); 
        return $imageAll;
    }
    
    
    function saveWeixinFile($filename, $filecontent)
    {
        $local_file = fopen($filename, 'w');
        if (false !== $local_file){
            if (false !== fwrite($local_file, $filecontent)) {
                fclose($local_file);
            }
        }
    }
    
    
    
    function token(){
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".AppID."&secret=".AppSecret;
        $data = json_decode(file_get_contents($url),true);
    if($data['access_token']){
    return $data['access_token'];
        }else{
            echo "Error";
       exit();
        }
    }
    ?>

    使用的注意事情。文件必须需要绝对的路径不能相对路径然后在路径前面加个@ (列子: @F:\w.jpg) 这样才是正确的 然后type 类型自己定义一下。上传视频的为 video 图片为 image 音乐为 voice
    图片(image): 1M,支持JPG格式
    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
    视频(video):10MB,支持MP4格式
    缩略图(thumb):64KB,支持JPG格式
    各位记住了

    (此文是做php 和 小程序上传下载所用,有用!所以转载收藏!感谢伟大的贡献者!希望也可以帮到更多人)

    展开全文
  • 微信开发第七篇发送素材(图文)信息 2015年08月31日 16:00:29 主沉浮 阅读数:6979 https://blog.csdn.net/u010773333/article/details/48135043 最近产品经理要做每天推送图文信息的功能,哎,还要超链接传递...

    微信开发第七篇发送素材(图文)信息

    2015年08月31日 16:00:29 主沉浮 阅读数:6979

    https://blog.csdn.net/u010773333/article/details/48135043

    最近产品经理要做每天推送图文信息的功能,哎,还要超链接传递不同的参数,苦逼呀。。网上查了一些资料,下面讲解一下群发素材

    要群发素材,首先要先获得素材,素材都是以图片和文字的形式推送给用户的,所以要首先获得图片和文字

    微信的上传媒体接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

    可以用来上传图片,上传成功返回:{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789},其中media_id就是图片在微信服务器的标识。

    上传方法:

           /// <summary> 
            /// 上传媒体返回媒体ID 
            /// </summary> 
            public static string UploadMedia(string access_token, string type, string path)
            {
                // 设置参数 
                string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", access_token, type);
                return HttpRequestUtil.HttpUploadFile(url, path);
            }

    第二步:拼接图文消息素材Json字符串,其中msg就是上述的微信服务器传回来的媒体ID

           /// <summary> 
            /// 拼接图文消息素材Json字符串 
            /// </summary> 
            public static string GetArticlesJsonStr(string access_token,string msg)
            {
                StringBuilder sbArticlesJson = new StringBuilder();

                 sbArticlesJson.Append("{\"articles\":[");
                    //string media_id = Tools.GetJsonValue(msg, "media_id");
                   // string media_id = (msg,"media_id");
                    sbArticlesJson.Append("{");
                    // sbArticlesJson.Append();
                    sbArticlesJson.Append("\"thumb_media_id\":\"" + msg + "\",");
                    sbArticlesJson.Append("\"author\":\"" + "王华涛" + "\",");
                    sbArticlesJson.Append("\"title\":\"" + "作业已经完成" + "\",");
                    sbArticlesJson.Append("\"content_source_url\":\"" + "http://。。。。" + "\",");
                    sbArticlesJson.Append("\"content\":\"" + "作业信息" + "\",");
                    sbArticlesJson.Append("\"digest\":\"" +"您孩子的作业已经完成" + "\",");
                    sbArticlesJson.Append("\"show_cover_pic\":\"1\"}");
                    sbArticlesJson.Append("]}");

                return sbArticlesJson.ToString();
            } 

    第三步:上传图文消息素材,其中postData就是拼接图文消息素材Json字符串,调用微信接口上传之后获得media_id 

            /// <summary> 
            /// 上传图文消息素材返回media_id 
            /// </summary> 
            public static string UploadNews(string access_token, string postData)
            {
                return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", access_token), postData);
            }

    第四步:图文消息json,添加发送用户openid

          /// <summary> 
            /// 图文消息json 
            /// </summary> 
            public static string CreateNewsJson(string media_id, List<string> openids)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("{\"touser\":[\"");

                foreach(string  openid in openids)     

                {

                     sb.Append(openid);
                    sb.Append("\",\"");

                }
                sb.Append("\"],");
                sb.Append("\"msgtype\":\"mpnews\",");
                sb.Append("\"mpnews\":{\"media_id\":\"" + media_id + "\"}");
                sb.Append("}");
                return sb.ToString();
            }
    第五步:调用微信发送素材接口,根据OpenID列表群发素材信息

            /// <summary> 
            /// 根据OpenID列表群发 
            /// </summary> 
            public static string Send(string access_token, string postData)
            {
                return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}", access_token), postData);
            } 
     

    展开全文
  • 最近公司要做微信方面的开发,今天说下,如何使用微信素材管理的接口,这里主要讲下素材上传接口,下载之类的比较简单(就是解析json而已),今天会把所有的素材上传写道一个方法里供大家参考,关于上传的接口...


        最近公司要做微信方面的开发,今天说下,如何使用微信的素材管理的接口,这里主要讲下素材的上传接口,下载之类的比较简单(就是解析json而已),今天会把所有的素材上传写道一个方法里供大家参考,关于上传的接口文档我就不粘贴了,直接上代码!

    /**
    	 * 这里说下,在上传视频素材的时候,微信说不超过20M,我试了下,超过10M调通的可能性都比较小,建议大家上传视频素材的大小小于10M比交好
    	 * @param accessToken
    	 * @param file  上传的文件
    	 * @param title  上传类型为video的参数
    	 * @param introduction 上传类型为video的参数
    	 */
    	public void uploadPermanentMedia2(String accessToken,
    			File file,String title,String introduction) {
    		try {
    			
    			//这块是用来处理如果上传的类型是video的类型的
    			JSONObject j=new JSONObject();
    			j.put("title", title);
    			j.put("introduction", introduction);
    			
    			// 拼装请求地址
    			String uploadMediaUrl = "http://api.weixin.qq.com/cgi-bin/material/add_material?access_token=##ACCESS_TOKEN##";
    			uploadMediaUrl = uploadMediaUrl.replace("##ACCESS_TOKEN##",
    					accessToken);
    
    			URL url = new URL(uploadMediaUrl);
    			String result = null;
    			long filelength = file.length();
    			String fileName=file.getName();
    			String suffix=fileName.substring(fileName.lastIndexOf("."),fileName.length());
    			String type="video/mp4"; //我这里写死
    			/**
    			 *  你们需要在这里根据文件后缀suffix将type的值设置成对应的mime类型的值
    			 */
    			HttpURLConnection con = (HttpURLConnection) url.openConnection();
    			con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式
    			con.setDoInput(true);
    			con.setDoOutput(true);
    			con.setUseCaches(false); // post方式不能使用缓存
    			// 设置请求头信息
    			con.setRequestProperty("Connection", "Keep-Alive");
    			con.setRequestProperty("Charset", "UTF-8");
    			
    			// 设置边界,这里的boundary是http协议里面的分割符,不懂的可惜百度(http 协议 boundary),这里boundary 可以是任意的值(111,2222)都行
    			String BOUNDARY = "----------" + System.currentTimeMillis();
    			con.setRequestProperty("Content-Type",
    					"multipart/form-data; boundary=" + BOUNDARY);
    			// 请求正文信息
    			// 第一部分:
    			
    			StringBuilder sb = new StringBuilder();
    			
    			
    			
    			//这块是post提交type的值也就是文件对应的mime类型值
    			sb.append("--"); // 必须多两道线 这里说明下,这两个横杠是http协议要求的,用来分隔提交的参数用的,不懂的可以看看http 协议头
    			sb.append(BOUNDARY);
    			sb.append("\r\n");
    			sb.append("Content-Disposition: form-data;name=\"type\" \r\n\r\n"); //这里是参数名,参数名和值之间要用两次
    			sb.append(type+"\r\n"); //参数的值
    			
    			//这块是上传video是必须的参数,你们可以在这里根据文件类型做if/else 判断
    			sb.append("--"); // 必须多两道线
    			sb.append(BOUNDARY);
    			sb.append("\r\n");
    			sb.append("Content-Disposition: form-data;name=\"description\" \r\n\r\n");
    			sb.append(j.toString()+"\r\n");
    			
    			/**
    			 * 这里重点说明下,上面两个参数完全可以卸载url地址后面 就想我们平时url地址传参一样,
    			 * http://api.weixin.qq.com/cgi-bin/material/add_material?access_token=##ACCESS_TOKEN##&type=""&description={} 这样,如果写成这样,上面的
    			 * 那两个参数的代码就不用写了,不过media参数能否这样提交我没有试,感兴趣的可以试试
    			 */
    			
    			sb.append("--"); // 必须多两道线
    			sb.append(BOUNDARY);
    			sb.append("\r\n");
    			//这里是media参数相关的信息,这里是否能分开下我没有试,感兴趣的可以试试
    			sb.append("Content-Disposition: form-data;name=\"media\";filename=\""
    					+ fileName + "\";filelength=\"" + filelength + "\" \r\n");
    			sb.append("Content-Type:application/octet-stream\r\n\r\n");
    			System.out.println(sb.toString());
    			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();
    			// 结尾部分,这里结尾表示整体的参数的结尾,结尾要用"--"作为结束,这些都是http协议的规定
    			byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
    			out.write(foot);
    			out.flush();
    			out.close();
    			StringBuffer buffer = new StringBuffer();
    			BufferedReader reader = null;
    			// 定义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();
    			}
    			// 使用JSON-lib解析返回结果
    			JSONObject jsonObject = JSONObject.fromObject(result);
    			if (jsonObject.has("media_id")) {
    				System.out.println("media_id:"+jsonObject.getString("media_id"));
    			} else {
    				System.out.println(jsonObject.toString());
    			}
    			System.out.println("json:"+jsonObject.toString());
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    
    		}
    	}

      上面就是通用的上传素材的方法,大体就这样,我亲测过,时间(2015-08-05),除了图片素材返回为media_id和url 其他素材都返回media


    展开全文
  • 微信素材分为临时素材和永久素材两种 新增临时素材 公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来...
  • 我们的永久素材上传微信服务器后, 只要你不删除, 永久有效, 可以使用。 所以我们上传永久素材后, 获取它的media_id, 直接存入到我们的web服务器数据库, 这就是我们这...
  • 领导要求公众号自动回复需要支持图片(之前的版本只支持文本和图文),而支持图片就需要先把图片上传微信素材库,于是我就开始读文档,查资料,发现还真不好找。尤其是步骤2中上传的参数问题——我试着把前端的...
  • 微信公众号开发(六)素材管理 微信公众号在使用的接口的时候是通过media_id来进行的,所以在使用的接口的时候我们往往需要先上传素材,支持上传素材的格式和限制如下 图片(image): 2M,支持PNG\JPEG\JPG\GIF...
  • 手把手教你springboot企业微信开发(二)1、企业微信开发第一步2、weixin-java-cp-demo-master1)、引入thymeleaf改造项目2)增加Configuration3)回到企业号4)穿透内外网5)完善 从这一篇开始,开始从实际项目探索...
  • 2.将图片上传微信临时素材中,是有有效期的生成serviceid 3.前端将serviceid传给后台,后台通过serviceid去微信下载临时素材保存到服务器 4.保存成功告诉前台保存成功 此处展示后台通过前台给的serviceid下载...
  • 上一篇《微信开发学习总结(一)——微信开发环境搭建》我们已经完成了微信开发的准备工作,准备工作完成之后,就要开始步入正题了。 一、微信公众平台的基本原理  在开始做之前,先简单介绍了微信公众平台的基本...
  • 小易Smalle博文:微信公众平台开发素材管理】上传临时素材http://blog.csdn.net/oldinaction/article/details/47903989 示例代码
  • 微信公众平台开发——新增永久素材请求接口接口使用 接口详情:微信公众平台新增永久素材 新增永久图文素材请求接口,POST数据就能实现,这里主要记录下C#如何通过通过Form表单上传文件(图片,音频,视频等) 请求...
  • 微信开发之上传素材

    2019-08-20 00:13:44
    本文目录 : 上传图文素材的图片 上传其他素材 ...小结 参考文档 前言: 我在实现微信公众平台上传素材的时候遇到了许多问题,但最终还是成功...1、微信开发之获取用户详细列表 2、微信开发之向用户群发文本消息 1...
  • { "articles": [{ "title": TITLE, "thumb_media_id": THUMB_MEDIA_ID, "author": AUTHOR, "digest": DIGEST, "show_cover_pic": SHOW_COVER_PIC(0 / 1), "content": C
  • * 上传永久素材 * @param file * @param type * @param title type为video时需要,其他类型设null * @param introduction type为video时需要,其他类型设null * @return {"media_id":MEDIA_ID,"url":URL} ...
1 2 3 4 5 ... 20
收藏数 2,590
精华内容 1,036