zoukankan      html  css  js  c++  java
  • C# 微信公众平台开发(5)--添加图文素材

      微信公众平台开发 --添加素材

    关于微信公众号素材管理,我们可以通过接口文档,了解基本详情:
    http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html

    eg:发布图文素材
    1.上传封面图片 >>新增其他类型永久素材

    接口调用请求说明
    通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
    http请求方式: POST,需使用https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材,curl命令的使用请自行查阅资料)
    参数是否必须说明
    access_token 调用接口凭证
    type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
    media form-data中媒体文件标识,有filename、filelength、content-type等信息

    上传图片:
    string filename = Server.MapPath(model.ImgUrl);
    string url = string.Format("https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", access_token, "image");
    string resultJson = HttpHelper.UploadFile(url, filename, "image/jpeg");
    filename = Server.MapPath(ImgUrl) ImgUrl=‘~UploadFile20160126656495cd9ce3417282df4c859c36b9e1.jpg’
    上传永久图片为表单上传,跟以前的请求方式不同:
     1       /// <summary>
     2         /// 服务号:上传多媒体文件
     3         /// </summary>
     4         /// <param name="accesstoken">调用接口凭据</param>
     5         /// <param name="filename">文件路径</param>
     6         /// <param name="contenttype">文件Content-Type类型(例如:image/jpeg、audio/mpeg)</param>
     7         /// <returns></returns>
     8         public static string UploadFile(string url, string path, string contenttype)
     9         {
    10             FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
    11             byte[] bArr = new byte[fs.Length];
    12             fs.Read(bArr, 0, bArr.Length);
    13 
    14             // 设置参数
    15             HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    16             CookieContainer cookieContainer = new CookieContainer();
    17             request.CookieContainer = cookieContainer;
    18             request.AllowAutoRedirect = true;
    19             request.Method = "POST";
    20             string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
    21             request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
    22             byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "
    ");
    23             byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
    24 
    25             int pos = path.LastIndexOf("\");
    26             string fileName = path.Substring(pos + 1);
    27 
    28 
    29             //组织表单数据
    30             StringBuilder sbHeader = new StringBuilder();
    31             sbHeader.Append("--" + boundary + "
    ");
    32             sbHeader.Append("Content-Disposition: form-data; name="media"; filename="" + path + ""; filelength="" + fs.Length + """);
    33             sbHeader.Append("
    ");
    34             sbHeader.Append("Content-Type: " + contenttype);
    35             sbHeader.Append("
    
    ");
    36 
    37             //请求头部信息 
    38             //StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"
    Content-Type:application/octet-stream
    
    ", fileName));
    39             byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
    40 
    41 
    42             Stream postStream = request.GetRequestStream();
    43             postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
    44             postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
    45             postStream.Write(bArr, 0, bArr.Length);
    46             postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
    47             postStream.Close();
    48 
    49             fs.Close();
    50             fs.Dispose();
    51 
    52             //发送请求并获取相应回应数据
    53             HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    54             //直到request.GetResponse()程序才开始向目标网页发送Post请求
    55             Stream instream = response.GetResponseStream();
    56             StreamReader sr = new StreamReader(instream, Encoding.UTF8);
    57             //返回结果网页(html)代码
    58             string content = sr.ReadToEnd();
    59             return content;
    60         }
    View Code

    返回说明

    { "media_id":MEDIA_ID, "url":URL }

    返回参数说明

    参数描述
    media_id 新增的永久素材的media_id
    url 新增的图片素材的图片URL(仅新增图片素材时会返回该字段)

    错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):

    {"errcode":40007,"errmsg":"invalid media_id"}

    2.上传图文消息内容
    string strUploadNewsUrl = string.Format("https://api.weixin.qq.com/cgi-bin/material/add_news?access_token={0}", access_token);
    string newsJson = HttpHelper.PostHttpResponse(strUploadNewsUrl, str);
    str 就是我们拼接的素材内容
    官网的例子:
    {
      "articles": [{
           "title": TITLE,
           "thumb_media_id": THUMB_MEDIA_ID,
           "author": AUTHOR,
           "digest": DIGEST,
           "show_cover_pic": SHOW_COVER_PIC(0 / 1),
           "content": CONTENT,
           "content_source_url": CONTENT_SOURCE_URL
        },
        //若新增的是多图文素材,则此处应有几段articles结构,最多8段
     ]
    }
    注意一:上面示例 "title": TITLE 但实际写的时候后面 也需要加上双引号,否则会报错;   builder.Append(""title":"" + list[i].Title + "",");
    注意二:{"errcode":40007,"errmsg":"invalid media_id"},出现这个问题很有可能就是 在上传图片的时候 用的是临时的上传接口,导致出现40007错误;

    注意三: "content": CONTENT;本人在项目中,发现的一个问题,由于本人是在后台拼接的内容 ,出现一个问题就是内容中的图片上传后发现,
    builder.Append(""content":"" + list[i].Content + "",");,
    在微信中显示不出来,只能显示文字;
    通过上传成功后返回的media_id返回的数据,content中关于img标签是剩下<img>了,最后发现是因为双引号引起的问题
    list[i].Content = <p>Test</p><p><img alt="测试.jpg" src="http://mmbiz.qpic.cn/mmbiz/IcV3dMDKQT6xeeWETz43mpMYfHR7jjoxr6g0HDuYH7QDYr7hUQnl44664Tiaib6liaaybAwjhViafHHNHTHU6xX8ww/0"/></p>
    所以builder.Append(""content":"" + list[i].Content + "",") 就会出现问题 改成 builder.Append(""content":"" + list[i].Content.Replace(""", "'") + "",");

    注意以上问题,基本上可以正确结果 
    最后 返回结果
    { "media_id":MEDIA_ID }
    通过Media_id,可以进行删除、查看操作;

    3.修改永久图文素材
    http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=ACCESS_TOKEN
    

    调用示例

    {
      "media_id":MEDIA_ID,
      "index":INDEX,
      "articles": {
           "title": TITLE,
           "thumb_media_id": THUMB_MEDIA_ID,
           "author": AUTHOR,
           "digest": DIGEST,
           "show_cover_pic": SHOW_COVER_PIC(0 / 1),
           "content": CONTENT,
           "content_source_url": CONTENT_SOURCE_URL
        }
    }
    参数说明
    参数是否必须说明
    media_id 要修改的图文消息的id
    index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
    title 标题
    thumb_media_id 图文消息的封面图片素材id(必须是永久mediaID)
    author 作者
    digest 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
    show_cover_pic 是否显示封面,0为false,即不显示,1为true,即显示
    content 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
    content_source_url 图文消息的原文地址,即点击“阅读原文”后的URL

    修改素材的时候 ,每次只能修改某一素材的其中一条,如果我要删除或者添加一天呢?
    是否觉得很蛋疼;
    本人直接根据上传的获取的MEDIA_ID 进行删除,然后重新添加一次!

    ----------------------------------------------------------------------------------------------------

    如果你觉得有帮助 请关注我的微信公众号,没有帮助你也可以添加哟!o(∩_∩)o 哈哈



  • 相关阅读:
    Django REST framework+Vue 打造生鲜电商项目(笔记三)
    「数据结构与算法之链表(Python)」(四)
    微服务的注册中心
    git学习(十一) idea git pull 解决冲突
    git学习(十) idea git reset 操作
    git学习(九) idea git stash操作
    git学习(八) git stash操作
    git 学习笔记
    git学习(五) git diff操作
    git:Your branch and 'origin/master' have diverged
  • 原文地址:https://www.cnblogs.com/amoshu/p/5160908.html
Copyright © 2011-2022 走看看