• 那么微信上传永久图片素材又是怎么操作的呢?  根据微信文档说明:  重点在于整合media参数,我的代码如下:  然后发布,测试。微信返回:{"errcode":41005,"errmsg":"mediadata missing....} ...

            想要新增图文素材,就必须先有图片素材。那么微信上传永久图片素材又是怎么操作的呢?

            根据微信文档说明:


            重点在于整合media参数,我的代码如下:


            然后发布,测试。微信返回:{"errcode":41005,"errmsg":"mediadata missing....}        41005=缺少多媒体文件数据

            仔细查看代码,可以得知,media参数我只是把文件的名称传递过去,并没有吧本地文件传递过去,那么,知道了却不知道这个文件数据到底是怎么传递出去的呢?

     

            继续百度ing.....


            发现很多网友也是遇到了这个问题,最后又反复查看大神sdk中post请求的写法,重新定义了api接口和实体类,发送创建图片接口,如下:

     

            1、实体类:

        public class ResponseNewsModel : WxJsonResult

        {

            public string media_id { get; set;}//新增永久素材返回的值

            public string url { get; set;}//新增永久图片返回url

        }

     

            ///<summary>

            ///新增其他类型永久素材图片+视频+语音

            ///</summary>

            ///<paramname="accessToken">授权方的access_token</param>

            ///<paramname="accessToken">媒体文件的类型imagevideovoice</param>

            ///<returns>{"media_id":MEDIA_ID",url": "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYsCNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0" } 新增的图文消息素材的media_id,新增的图片素材的图片URL(仅新增图片素材时会返回该字段)</returns>

            public static ResponseNewsModel addWeixinOpenImg(stringaccessToken, string type, Dictionary<string,string>postData)

            {

                string urlFormat = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type="+type;

     

                return CommonJsonSend.SendFile<ResponseNewsModel>(accessToken,urlFormat, postData, WxConfig.TIME_OUT);

            }

     

            为了保证代码简洁,这里的很多方法写法都是参考原有的。

           2、 sendFile方法:

            ///<summary>

            ///这个接口是专门上传媒体文件请求向需要AccessTokenAPI发送消息的公共方法

            ///</summary>

            ///<paramname="accessToken">这里的AccessToken是通用接口的AccessToken,非OAuth的。如果不需要,可以为null,此时urlFormat不要提供{0}参数</param>

            ///<paramname="urlFormat"></param>

            ///<paramname="data">如果是Get方式,可以为null</param>

            ///<paramname="timeOut">代理请求超时时间(毫秒)</param>

            ///<returns></returns>

            public static T SendFile<T>(string accessToken, stringurlFormat, Dictionary<string,stringfileData, inttimeOut = WxConfig.TIME_OUT)

            {

                var url = string.IsNullOrEmpty(accessToken) ? urlFormat: string.Format(urlFormat, accessToken);           

                return Post.PostFileGetJson<T>(url, null,fileData, null, timeOut: timeOut);

            }

     

           3、最后post发送数据方法【其他接口如转换实体类请参照原大神博客!】:

            ///<summary>

            ///发起Post请求

            ///</summary>

            ///<typeparamname="T">返回数据类型(Json对应的实体)</typeparam>

            ///<paramname="url">请求Url</param>

            ///<paramname="cookieContainer">CookieContainer,如果不需要则设为null</param>

            ///<paramname="timeOut">代理请求超时时间(毫秒)</param>

            ///<returns></returns>

            public static T PostFileGetJson<T>(string url, CookieContainer cookieContainer = null,Dictionary<string, string> fileDictionary = null, Encoding encoding = null, int timeOut = WxConfig.TIME_OUT)

            {

                string returnText = HttpUtility.RequestUtility.HttpPost(url,cookieContainer, null, fileDictionary, null,encoding, timeOut: timeOut);

                var result = GetResult<T>(returnText);

                return result;

            }

     

           4、post方法:

            ///<summary>

            ///使用Post方法获取字符串结果

            ///</summary>

            ///<paramname="url"></param>

            ///<paramname="cookieContainer"></param>

            ///<paramname="postStream"></param>

            ///<paramname="fileDictionary">需要上传的文件,Key:对应要上传的NameValue:本地文件名</param>

            ///<paramname="timeOut"></param>

            ///<returns></returns>

            public static string HttpPost(string url, CookieContainer cookieContainer = null, Stream postStream = null, Dictionary<string,string> fileDictionary = null, stringrefererUrl = null, Encoding encoding = null, int timeOut = WxConfig.TIME_OUT)

            {

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

               request.Method = "POST";

               request.Timeout = timeOut;

     

               #region处理Form表单文件上传

                var formUploadFile = fileDictionary != null&& fileDictionary.Count > 0;//是否用Form上传文件

                if(formUploadFile)

                {

                   //通过表单上传文件

                   postStream = new MemoryStream();

     

                    stringboundary = "----" + DateTime.Now.Ticks.ToString("x");

                   //byte[] boundarybytes =Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

                   string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n";

     

                   foreach (var file in fileDictionary)

                   {

                       try

                       {

                           var fileName = file.Value;

     

                            //准备文件流

                            using(var fileStream = FileHelper.GetFileStream(fileName))

                            {

                                var formdata = string.Format(formdataTemplate, file.Key, /*fileName*/Path.GetFileName(fileName));

                                var formdataBytes = Encoding.ASCII.GetBytes(postStream.Length== 0 ? formdata.Substring(2, formdata.Length - 2) : formdata);//第一行不需要换行

                                postStream.Write(formdataBytes,0, formdataBytes.Length);

     

                                //写入文件

                                byte[] buffer = newbyte[1024];

                                int bytesRead = 0;

                                while((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)

                                {

                                   postStream.Write(buffer, 0, bytesRead);

                                }

                            }

                       }

                        catch(Exception ex)

                       {

                            throw ex;

                       }

                   }

                   //结尾

                   var footer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

                   postStream.Write(footer, 0, footer.Length);

     

                   request.ContentType = string.Format("multipart/form-data; boundary={0}",boundary);

                }

                else

                {

                   request.ContentType = "application/x-www-form-urlencoded";

                }

               #endregion

     

               request.ContentLength = postStream != null? postStream.Length : 0;

               request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

                request.KeepAlive = true;

     

                if(!string.IsNullOrEmpty(refererUrl))

                {

                   request.Referer = refererUrl;

                }

               request.UserAgent = "Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57Safari/537.36";

               

               #region输入二进制流

                if(postStream != null)

                {

                   postStream.Position = 0;

     

                   //直接写入流

                   Stream requestStream = request.GetRequestStream();

     

                   byte[] buffer = newbyte[1024];

                   int bytesRead = 0;

                   while ((bytesRead =postStream.Read(buffer, 0, buffer.Length)) != 0)

                   {

                       requestStream.Write(buffer, 0, bytesRead);

                   }

                   postStream.Close();//关闭文件访问

                }

               #endregion

     

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                using(Stream responseStream = response.GetResponseStream())

                {

                   using (StreamReadermyStreamReader = newStreamReader(responseStream,encoding ?? Encoding.GetEncoding("utf-8")))

                   {

                       string retString =myStreamReader.ReadToEnd();

                       return retString;

                   }

                }

            }


     5、最后测试调用:

    public string addImg(){

                string filepath = Server.MapPath("~/images/maxlaw.png");

                stringtype = "image";

                Dictionary<string, string>fileData = newDictionary<string,string>();

               fileData.Add("media",filepath);//事先写好参数

                ResponseNewsModel imgData = DoWeixinOpenApi.addWeixinOpenImg(Golbal_authorizer_accessToken,type, fileData);

                if (imgData.errmsg != "ok")

                {

                   FileHelper.LogToTxt("发生什么错误了!" +imgData.errmsg);

                }

                FileHelper.LogToTxt("上传永久图片素材测试啊:::"+ imgData.media_id + "<br>地址是:::" + imgData.url);

                return"ok";

     }


            打开日志查看,返回结果:


    上传永久素材测试啊:::YKeHO6zG3cS_4f61bI0jKe_HFy0......4YnWnwFs<br>地址是:::https://mmbiz.qlogo.cn/mmbiz/oXGwXicXmia5XySWuNbR......cA3FSvzicc9Fw8EictQ2kbTvWlkLIqVlfLiaTJ8v1EVPQicS25Dw/0?wx_fmt=png2016-05-1318:16:20

    展开全文
  • 微信开发之上传素材

    2017-06-08 21:30:31
    上传图文素材图片上传其他素材关键的http表单请求代码小结参考文档 前言: 我在实现微信公众平台上传素材的时候遇到了许多问题,但最终还是成功实现这一功能,特此在这里做一下总结和记录。 文中遇到...

    本文目录 :

    1. 上传图文素材的图片
    2. 上传其他素材
    3. 关键的http表单请求代码
    4. 小结
    5. 参考文档



    前言
    我在实现微信公众平台上传素材的时候遇到了许多问题,但最终还是成功实现这一功能,特此在这里做一下总结和记录。


    文中遇到诸如 getAccessToken() 等关键函数却没有找到实现时,可参考前面的这两篇文章:

    1、微信开发之获取用户详细列表
    2、微信开发之向用户群发文本消息



    1、 上传图文素材的图片

    首先选一个简单的接口来做说明例子,这个上传素材的接口在所有上传素材的接口中是参数最简单的,而且还单独享用一个URL, 作为入门例子再合适不过了。

    注意,本文主要侧重点是代码层面的实现,而不是微信官方一大堆规则的讲解,如果你有需要此方面的介绍,下面已给出官方链接不谢。

    官方文档:

    新增永久素材

    官方给的这个接口,除了需要惯例的 access_token ,还需要一个文件的参数,一般而言,只需要一个文件路径,其他文件参数通过这个路径获取解析则可,做成一个黑匣子,简单易用。
    我知道,有人就是专门找下边的 Requests::request() 的实现的,可在这就没看到实现,别急,下面就有。

    public function uploadNewsImage($path)
    {
        $access_token = $this->getAccessToken();
        if (!$access_token) {
            return false;
        }
    
        $path = realpath($path);
        $post = ['media '=> '@'.$path];
        $url ="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={$access_token}";
        $return = $this->requestAndCheck($url, 'POST', $post);
        if ($return === false) {
            return false;
        }
    
        return $return;
    }
    
    /**
     * 专门用来检查微信接口返回值的。
     * 是的,这个接口比上一两篇文章的接口更加好用。东西一般做多,就知道要抽象了,如果还没有那水平的话。
     */
    public function requestAndCheck($url, $method = 'GET', $fields = [])
    {
        $return = Requests::request($url, $method, $fields);
        if ($return === false) {
            $this->setError("request出错! " . Requests::$error);
            return false;
        }
    
        $wxdata = json_decode($return, true);
        if (isset($wxdata['errcode']) && $wxdata['errcode'] != 0) {
            $this->setError("微信错误代码:{$wxdata['errcode']};<br>错误信息:{$wxdata['errmsg']}<br>请求链接:$url");
            return false;
        }
    
        if (strtoupper($method) === 'GET' && empty($wxdata)) {
            $this->setError("微信http请求返回为空!<br>请求链接:$url");
            return false;
        }
    
        return $wxdata;
    }



    2、 上传其他素材

    懂得上面的流程,其他的上传素材的接口,无非就是加多个 GET 和 POST 参数,主流程没变。
    其他相关接口列举如下:

    1、新增永久图文素材:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
    2、新增其他类型永久素材:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE
    3、新增临时素材:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE


    功能的约束和细节还望参考官方文档:

    1、新增永久素材
    2、新增临时素材



    3、 关键的http表单请求代码

    先上代码:(这里边已经简化很多附加功能,比如可以改变header之类的功能,该代码主要参考一些开源的项目)

    public static function request($url, $method = 'GET', $fields = [])
    {
        self::$ch = curl_init();
        curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt(self::$ch, CURLOPT_CONNECTTIMEOUT, 10);
    
        $method = strtoupper($method);
        if ($method == 'GET' && !empty($fields)) {
            $url = $url . (strpos($url,"?")===false ? "?" : "&") . http_build_query($fields);
        }
        curl_setopt(self::$ch, CURLOPT_URL, $url);
    
        if ($method != 'GET') {
            curl_setopt(self::$ch, CURLOPT_POST, true);
    
            if (!empty($fields)) {
                if (is_array($fields)) {
                    /* 支持文件上传 */
                    if (class_exists('\CURLFile')) {
                        curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, true);
                        foreach ($fields as $key => $value) {
                            if (is_string($value) && strpos($value, '@') === 0) {
                                $fields[$key] = new CURLFile(realpath(ltrim($value, '@')),
                                                'image/jpg', basename(ltrim($value, '@')));
                            }
                        }
                    } elseif (defined('CURLOPT_SAFE_UPLOAD')) {
                        curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, false);
                    }
                }
                curl_setopt(self::$ch, CURLOPT_POSTFIELDS, $fields);
            }
        }
    
        /* 关闭https验证 */
        if ("https" == substr($url, 0, 5)) {
            curl_setopt(self::$ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt(self::$ch, CURLOPT_SSL_VERIFYHOST, false);
        }
    
        self::$content = curl_exec(self::$ch);
        curl_close(self::$ch);
    
        return self::$content;
    }


    重点分析:

    /* 支持文件上传 */
    if (class_exists('\CURLFile')) {
        curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, true);
        foreach ($fields as $key => $value) {
            if (is_string($value) && strpos($value, '@') === 0) {
                $fields[$key] = new CURLFile(realpath(ltrim($value, '@')));
            }
        }
    } elseif (defined('CURLOPT_SAFE_UPLOAD')) {
        curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, false);
    }

    这里面有个php版本的坑,5.4版本只支持用 @ 来进行上传文件,5.5是个过渡版本,支持 @ 和 CURLFile 两种方式上传文件,而到了5.6,就只支持 CURLFile 了。所以需要用兼容模式来适应不同版本。

    关于为什么不用php版本号来判断呢?你用版本号谁知道你是要来判断啥呢?难道加个注释?
    而常量 CURLOPT_SAFE_UPLOAD 是用来开启是否支持 @ 的,当然,5.6版本设置了也没有。

    还有,要上传file的时候,一定要用数组给 curl_setopt(self::$ch, CURLOPT_POSTFIELDS, $fields); 传值,而不能用 http_build_query() ,一个的http请求头中的 content-type 是 multipart/form-date ,另一个是 application/x-www-form-urlencoded 。file用二进制编码进行传输,而普通的post数据是文本传输。

    上面的相关知识还请详看 参考文档



    小结
    如果你已有上传文件的接口,其实这个功能不算啥,按照官方文档进行 post url 即可。如果没有,或者没有实现文件上传功能,就要对 curl 研究一下了,还要踩一下php版本的坑。。。不过对 curl 掌握就更加全面而牢固了,这难道不是我们的目的?



    主要参考文档

    1、微信公众号开发文档
    2、Multipart/form-data POST文件上传详解
    3、PHP的CURLOPT_POSTFIELDS参数使用数组和字符串的区别
    4、The CURLFile class
    5、考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传


    -end-

    展开全文
  • string serverpath = Server.MapPath("~/adv/") + "fangbianmian.jpg";   FileStream fs = new FileStream(serverpath, FileMode.Open, FileAccess.Read);   
     string serverpath = Server.MapPath("~/adv/") + "fangbianmian.jpg"; 
                                     FileStream fs = new FileStream(serverpath, FileMode.Open, FileAccess.Read); 
                                     byte[] bArr = new byte[fs.Length];
                                     fs.Read(bArr, 0, bArr.Length);
                                     fs.Close();

                                     string resultUpload = HttpUploadFile(serverpath, bArr);//上传永久图片素材



      public static string HttpUploadFile(string path, byte[] bf)
            { 
                var accessToken = WeiXin.IsExistAccess_Token();
                string url = string.Format("https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", accessToken, "image");
                return HttpUploadPhoto(url, path, bf);
            }


      public static string HttpUploadPhoto(string url, string path, byte[] bf)
            {
                //var accessToken = new WeiXin.IsExistAccess_Token();
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
                byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                int pos = path.LastIndexOf("\\");
                string fileName = path.Substring(pos + 1);
                //请求头部信息 
                StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"media\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
                Stream postStream = request.GetRequestStream();
                postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                postStream.Write(bf, 0, bf.Length);
                postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
                postStream.Close();
                //发送请求并获取相应回应数据
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream instream = response.GetResponseStream();
                StreamReader sr = new StreamReader(instream, Encoding.UTF8);
                string content = sr.ReadToEnd();
                return content;
            }

    展开全文
  • 微信小程序图片素材

    2020-07-12 23:31:33
    微信小程序图片素材,爆款界面图片收集,
  • 微信素材分为临时素材和永久素材两种 新增临时素材 公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来...

    简介

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

    • 新增临时素材
      公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过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源码,了解详细开发步骤。
    这里写图片描述

    效果

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

    展开全文
  • 微信开发素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用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就可以在微信中唯一标记我们上传的永久素材。
    展开全文
  • 由于PHP版本的问题 在公众号开发过程中上传图片老是失败,下面给大家提供一个PHP5.6以上的上传图片的例子 /** * 上传永久图片的接口------------------------------------------------------------------------...
  • * 上传永久素材 * @param file * @param type * @param title type为video时需要,其他类型设null * @param introduction type为video时需要,其他类型设null * @return {"media_id":MEDIA_ID,"url":URL} ...
  • 最近帮朋友开发一个微信内容管理平台,想要利用这个平台上传图片或者视频资源到微信平台。看了一下微信开发文档,发现微信对于上传永久素材这个接口,给出的文档太过简略,而且提供的样例也不是代码的方式,只给了...
  • 1.新增临时素材:公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和...
  • 领导要求公众号自动回复需要支持图片(之前的版本只支持文本和图文),而支持图片就需要先把图片上传微信素材库,于是我就开始读文档,查资料,发现还真不好找。尤其是步骤2中上传的参数问题——我试着把前端的...
  • 我写这个主要是因为微信开发文档的说明实在太坑了,为了更多.NET 开发人员能顺利上传微信图片素材,分享一下: 先看看最后的调用成功的方法:  ///  /// 发送永久图片素材  ///  /// 文件绝对...
  • 小易Smalle博文:微信公众平台开发素材管理】上传临时素材http://blog.csdn.net/oldinaction/article/details/47903989 示例代码
  • 调用微信接口上传图片微信永久素材库 Java代码: //获取token,调微信接口--上传图片到永久素材库 String accessToken = ""; String url = ...
  • 2、本项目适合学习微信开发 (微信接入,上传及下载临时素材文件,微信jssdk图片上传及下载) url(http://localhost:8082/com.demo.weixin/uploadImg.html)载图片,微信jssdk配置,上传及下载文件,springmvc ...
  • C#微信公众平台开发中的上传永久视频代码
  • 查阅企业微信API文档后,得知想要发送图片消息,需先将要发送的图片素材通过企业微信上传临时素材接口,将其上传至企业微信服务器上才可通过media_id发送该图片;在此期间受到的坑很多,也在网上查找了很多资料,...
  • 提供access_token,文件,文件类型即可完成素材上传
  • 我们的永久素材上传微信服务器后, 只要你不删除, 永久有效, 可以使用。 所以我们上传永久素材后, 获取它的media_id, 直接存入到我们的web服务器数据库, 这就是我们这...
1 2 3 4 5 ... 20
收藏数 2,594
精华内容 1,037