微信开发上传临时素材一直失败_微信公众号开发 临时素材 - CSDN
  • 公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。 接口开放权限:素材管理接口对所有认证的订阅号...

    公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。

    接口开放权限:素材管理接口对所有认证的订阅号和服务号开放。

    接口调用说明

    1、http请求方式

    POST/FORM,需使用https

    2、参数说明

    参数		是否必须	说明
    access_token	是	 	调用接口凭证
    type	 	是	 	媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
    media	 	是	 	form-data中媒体文件标识,有filename、filelength、content-type等信息
    

    3、返回数据说明

    参数		描述
    type	 	媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图)
    media_id	媒体文件上传后,获取时的唯一标识
    created_at	媒体文件上传时间戳

    正确情况下的返回JSON数据包结果如:{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}

    错误情况下的返回JSON数据包示例如:{"errcode":40004,"errmsg":"invalid media type"}(此错误指无效媒体类型错误)

    1、上传图片“smallelife.jpg”到服务器根目录

    2、将以下代码写入到index.PHP文件中,并将此文件上传到服务器根目录(记得修改AppID和AppSecret)

    [php] view plain copy
    1. <?php    
    2.    
    3. define("AppID","你的AppID");    
    4. define("AppSecret""你的AppSecret");    
    5.     
    6. /* 新增一个临时素材 */    
    7. //url 里面的需要2个参数一个 access_token 一个是 type(值可为image、voice、video和缩略图thumb)    
    8. $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".get_token()."&type=image";    
    9. if (class_exists('\CURLFile')) {    
    10.     $josn = array('media' => new \CURLFile(realpath("smallelife.jpg")));    
    11. else {    
    12.     $josn = array('media' => '@' . realpath("smallelife.jpg"));    
    13. }    
    14.     
    15. $ret = curl_post($url,$josn);    
    16. $row = json_decode($ret);//对JSON格式的字符串进行编码    
    17. echo '此素材的唯一标识符media_id为:'.$row->media_id;//得到上传素材后,此素材的唯一标识符media_id    
    18.     
    19. //获取access_token    
    20. function get_token(){    
    21.     $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".AppID."&secret=".AppSecret;    
    22.     $data = json_decode(file_get_contents($url),true);    
    23.     if($data['access_token']){    
    24.         return $data['access_token'];    
    25.     }else{    
    26.         echo "Error";    
    27.         exit();    
    28.     }    
    29. }    
    30.     
    31. //curl实现post请求    
    32. function curl_post($url$data = null)    
    33. {    
    34.     //创建一个新cURL资源    
    35.     $curl = curl_init();    
    36.     //设置URL和相应的选项     
    37.     curl_setopt($curl, CURLOPT_URL, $url);    
    38.     if (!empty($data)){    
    39.         curl_setopt($curl, CURLOPT_POST, 1);    
    40.         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);    
    41.     }    
    42.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    
    43.     //执行curl,抓取URL并把它传递给浏览器    
    44.     $output = curl_exec($curl);    
    45.     //关闭cURL资源,并且释放系统资源    
    46.     curl_close($curl);    
    47.     return $output;    
    48. }    
    49.     
    50. ?>    

    运行示例结果

    在浏览器中直接访问index.PHP,便会输出上传文件的media_id


    展开全文
  • HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection(); meidaConn.setDoOutput(true); meidaConn.setRequestMethod("GET"); 问题: java.lang....
  • 微信上传临时素材的坑

    万次阅读 2018-01-09 16:18:47
    其中有这么一个场景,把七鱼发到我们服务器上的图片,当作临时素材上传微信服务器上,此时微信服务器给我们返回素材对应的media_id,使用这个media_id我们可以讲图片推送给用户。微信官方api如下:点击打开链接 ...

    客服系统用的是网易七鱼的系统,小程序内的客服需要和网易七鱼进行对接。网易七鱼现在只支持自动和微信公众号对接,小程序对它来说相当于一个第三方系统。

    其中有这么一个场景,把七鱼发到我们服务器上的图片,当作临时素材上传到微信服务器上,此时微信服务器给我们返回素材对应的media_id,使用这个media_id我们可以讲图片推送给用户。微信官方api如下:点击打开链接



    可以说这个文档写的是很垃圾,例子很不明确。按照文档的说明,拼接的请求体如下:



    结果报的错误为:41005 media data missing. 在网上搜了教程有的说需要加上file_info, 于是我就这样:



    然而并没有什么用,依旧报41005的错误

    我post请求的地方是这么写的:



    这个错误的根本原因就是微信根据post的media找不到上传的图片资源在哪。于是想肯定是这一行出问题了。去查看PHP官方文档(我用的PHP7)发现了:



    还有:


    所以PHP7和PHP5.5以后的版本都不能用微信官方例子中@的方式来引用资源。后来修改成了这样:



    然后还是报错,说CURLFile,找不到这个类,几经折腾最后这样终于不报错了:这里一定要把相对路径转为绝对路径。



    然后上传临时素材依旧是41005的错误码,感觉要炸了。后来发现,post中的请求体不能用json格式的,必须是array。最后这样终于可以了,body要像上面那么写,post请求CURLOPT_POSTFIELDS的内容必须是array,不需要json_encode()了。


    其实,php有一个开源的与微信交互的SDK,easyWechat,这个SDK里面有个好用的接口叫



    这个接口的参数是图片的相对路径,只需要这一个参数,很方便。不过使用过程中发现了一个问题,其timeout的时间设置的为5s,超过了这个时间没收到微信服务器的返回就会报错,我在测试过程中有些图片5s无法上传完成,就会导致系统异常,所以果断弃用这个接口。改为自己写的,curl中把超时设置的大一点,就好了。


    提示:


    1.微信上传临时素材的接口只支持本地文件的上传,不支持远程url上传方式,所以在收到七鱼发过来的图片地址的时候,需要用file_get_contents()和file_put_contents()存到本地,获取图片的本地地址,等上传成功后使用unlink()删除掉就好了。

    2. 由于有时候图片上传的时间较长,无法在规定时间内给微信(5秒)、七鱼(10秒)服务器返回,可能触发它们的消息重发机制,这个时候需要会用MsgId进行消息排重,将MsgId存到redis中,每次消息处理的时候先检查,处理完毕后从redis中删除。


    感慨:遇到问题去翻对应的官方文档(比如PHP官方文档)效率其实是最高的。


    展开全文
  • 开发小程序后端的时候,遇到需求,需要接受小程序客服信息用户回复的特定指端,返回对应的图片,然而图片是存在oss或者是某些特殊链接转成base64的形式,在使用微信提供的临时素材上传接口的时候,经常返回媒体...

    引言

    在开发小程序后端的时候,遇到需求,需要接受小程序客服信息用户回复的特定指端,返回对应的图片,然而图片是存在oss或者是某些特殊链接转成base64的形式,在使用微信提供的临时素材上传接口的时候,经常返回媒体文件解析错误 经过一轮的方法查找,发现基本都是php解决的办法,经过一轮总结网上各路大神的解决方式,终于能得到想要的结果

    分析

    临时素材接口文档地址 临时素材接口 · 小程序

    从文档分析,上传临时图片有几个点需要注意:

    1. 上传图片官方介绍请求的里面media字段是form-data中媒体文件标识,有filename、filelength、content-type等信息
    2. 请求不能使用axios,axios服务端貌似不支持表单类型提交,在不新增第三方库的情况下,使用request的form方法,上传
    3. 对于oss、线上类型的图片,可以通过axios直接获取图片的stream丢到media里面即可
    4. 对于特殊的base64图片,先把base64转换成buffer,再利用request.form,把buffer丢进去media
    5. 对于本地的图片,可以使用fs创建一个可读流进行传递

    经过对提交streambuffer的分析,对于网络请求回来的图片,一般都带有filename等表示,而base64图片是不具备的,所以传输的时候需要补上contentType以及filename,不然微信会识别失败,具体可查看下文提交部分的代码

    具体代码

    一、获取根据不同类型获取对应格式

    OSS、线上类型图片-直接获取stream

    通过阅读axios文档,可以发现axios提供直接获取文件stream的功能

    // 直接获取网络图片的Stream
    
    const { data: imgStram } = await axios.get(imgUrl, {
      responseType: 'stream',
    });
    
    复制代码

    base64类型的图片-转成buffer

    对于base64格式,需要去掉base的标识,不然图片会无法正确显示

    传输的时候需要补上contentType以及filename,不然微信会识别失败

    // 把base64格式的图片转成Buffer
    
    cosnt imgBuffer = Buffer(
      base64Code.replace(/^data:image\/\w+;base64,/, ''), // 去掉base的标识
      'base64',
    );
    
    复制代码

    对于本地文件-直接创建可读stream

    const imgStram = fs.createReadStream(src))
    复制代码

    二、简单封装request请求

    写法基本参考自网上,自己在外面再包一层promise,方便使用async/await

    不加上hack微信服务器会识别失败

    filename可以写死一个,经过测试,每次微信都会返回不同的media_id,所以不用担心名称重复导致的问题

    function _promiseRequest({ imgStram = null, imgBuffer = null, accessToken }) {
      const url = `https://api.weixin.qq.com/cgi-bin/media/upload?access_token=${accessToken}&type=image`;
      return new Promise((resolve, reject) => {
        const req = request.post(
          {
            url,
            headers: {
              accept: '*/*',
            },
          },
          (err, res) => {
            if (err) {
              reject(err);
            }
     
            try {
              const resData = JSON.parse(res.body); // 里面带有返回的media_id
     
              resolve(resData);
            } catch (e) {
              console.log(e)
            }
          },
        );
     
        const form = req.form();
     
        if (imgBuffer) {
          form.append('media', imgBuffer, {
            contentType: 'image/jpeg', // 微信识别需要
            filename: 'code.jpg', // 微信识别需要
          }); 
        } else if (imgStram) {
          form.append('media', imgStram);
        }
     
        form.append('hack', ''); // 微信服务器的bug,需要hack一下才能识别到对象
      });
    }
    
    复制代码

    最后

    安利一个老大推荐去了解stream的仓库 GitHub - substack/stream-handbook: how to write node programs with streams

    转载于:https://juejin.im/post/5b1fb5926fb9a01e31283139

    展开全文
  • 做企业微信的web程序,根据数据生成Excel文档后直接发给指定用户, 但是三天后就发不出去消息了,可能是临时素材三天过期的原因, 但是每次发送的文档都是不一样的,正常理解的话生成的临时素材ID也应该是不同的,...
  • 微信获取临时素材接口

    千次阅读 2018-01-23 23:58:18
    使用到的一种情况: 通过微信接口上传图片并获取...所以我们要用到微信JSSDK中的“拍照或选择手机相册照片”、“上传图片接口”以及“获取临时素材接口”。  1.使用“拍照或选择手机相册照片”、“上传图片

    使用到的一种情况:

    通过微信接口上传图片并获取到自己的服务器。


          首先就是我们需要用户在公众号上传图片后,该图片要保存在我们自己的数据库里。(比如更换公众号中用户自己的头像)
          所以我们要用到微信JSSDK中的“拍照或选择手机相册照片”、“上传图片接口”以及“获取临时素材接口”。

          1.使用“拍照或选择手机相册照片”、“上传图片接口”,返回serverId(即media_id)。
          2.前端拿到serverId(即media_id)后,将此作为参数去请求后台“获取临时素材接口”

    ps:代码没贴,就是个简单的JS代码。

    获取临时素材(微信开发文档)

    公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)。请注意,视频文件不支持https下载,调用该接口需http协议。本接口即为原“下载多媒体文件”接口。

    接口调用请求说明

    http请求方式: GET,https调用
    https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
    请求示例(示例为通过curl命令获取多媒体文件)
    curl -I -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"

    参数说明

    参数 是否必须 说明
    access_token 调用接口凭证
    media_id 媒体文件ID

    返回说明

    正确情况下的返回HTTP头如下:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: image/jpeg
    Content-disposition: attachment; filename="MEDIA_ID.jpg"
    Date: Sun, 06 Jan 2013 10:20:18 GMT
    Cache-Control: no-cache, must-revalidate
    Content-Length: 339721
    curl -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
    

    如果返回的是视频消息素材,则内容如下:

    {
     "video_url":DOWN_URL
    }
    

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

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

    高清语音素材获取接口

    这个和普通的有些许变动,不做过多描述。

    附录

    上面有个提到的curl概念:

    curl命令是一个功能强大的网络工具,它能够通过http、ftp等方式下载文件,也能够上传文件,同时支持HTTPS等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息。类似的工具还有wget。curl命令使用了libcurl库来实现,libcurl库常用在C程序中用来处理HTTP请求,curlpp是libcurl的一个C++封装,这几个东西可以用在抓取网页、网络监控等方面的开发,而curl命令可以帮助来解决开发过程中遇到的问题。


    展开全文
  • 1.获取临时素材接口 请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID 2.获取临时素材接口的返回结果 企业微信官方开发文档中...
  • 在Spring MVC(4.3.8)下使用HttpClient(4.5.3)调用企业微信的上传临时素材文件的接口失败,错误消息为:empty media data 接口定义参见企业微信开发文档:https://work.weixin.qq.com/api/doc#10112 分析 纯属...
  • 最近几天都在准备研究微信api,发现网上很少有发表一些比较正规api开发demo,所以现介绍两个比较小的api功能-上传和下载临时素材。因为做得比较冲忙所以没添加注释,日后补回。还有一句祝大家新年快乐 /** *Author ...
  • 上传、获取临时素材文件,媒体文件类型有图片(image)、语音(voice)、视频(video),普通文件(file) ,这里以上传、下载图片为例上传临时素材文件 根据开发文档,可以看出,需要三个参数access_token、type、...
  • public function imagetwoAction(){ $path="yaf/application/admin/controllers/uploads_picture_2017-05-03_5909d692c2c84.png";//绝对路径,不可以是外链 //获取token $type="image";
  • 临时素材(素材类型只有这几种,且上传方法一致,只以上传图片方法为例)https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&amp;type=TYPE //临时素材接口路径 static final String ...
  • 1. 由自己的前端上传到图片服务器,其中图片服务器为阿里的OSS、微信素材管理等等。 这种的上传的方式好处是节省自己服务器的带宽、磁盘空间等,缺点在于任何人都可以上传,就会出现跨域问题 2. 由自己的前端...
  • JAVA解决办法:请检查sb.append("Content-Disposition:form-data;name=\"media\";filename=\"" + file.getName() + "\";filelength=\"... + file.length() + "...
  • 微信上传永久素材接口开发(二)

    千次阅读 2016-05-30 15:34:01
    于是咱们照猫画虎,将这段代码改一下,变成可以上传图片素材的程序: public static String postFile(String url, String filePath) { File file = new File(filePath); if (!file.exists()) return null; ...
  • 因为写书的需要,就顺便把这个章节一起写在博客了,只为帮助有需要的朋友,上传永久素材接口里面分了2个小接口① 上传永久图文素材上传其他类型永久素材官方开发文档传送门:...
  • 本文主要介绍微信公众平台的素材、消息管理接口的开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发。测试号的申请可参考下文: 使用微信测试账号对网页进行授权 ...
  • thinkphp微信上传永久素材报41005错误说明传参值有误,正确的传参方式如下: 例如: $filepath= "themes/simplebootx/Public/assets/images/banner-inner-fail.jpg"; if(class_exists('\CURLFile')){ $data['...
  • 1、微信接口access_token获取失败  直接在阿里云服务器上curl可以可以获取到token,在命令行直接php ./test.php也可以。  问题出在php的curl扩展没有安装 2、关于上传永久素材时,提示40015.  问题在于php 5.6...
  • 1、微信企业号图片上传与下载是微信企业号上传临时素材文件中一个小部门,微信企业号上传临时素材文件包括上传图片、语音、视频等媒体资源文件以及普通文件(如doc,ppt),接口返回媒体资源标识ID:media_id。...
1 2 3 4 5 ... 14
收藏数 273
精华内容 109
关键字:

微信开发上传临时素材一直失败