微信接口返回invalid media_id hint原因分析

调用微信获取临时素材接口,https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID,出现这样的错误:{"errcode":40007,"errmsg":"invalid media_id hint: [01073723]"}

分析步骤

step1:通过查询微信公众平台技术文档的全局返回码说明,可以看到40007表示不合法的媒体文件id。
step2:查看获取临时素材接口文档,从它的参数说明好像看不出啥结果。

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

step3:既然后端调用的接口找不到原因,那么继续查看前端调用的微信JS-SDK说明文档。发现在图像接口下有一个上传图片接口。

wx.uploadImage({
    localId:'', //需要上传的图片的本地ID,由chooseImage接口获得
    isShowProgressTips:1,   //默认为1,显示进度提示
    success:function (res) {
        var serverId = res.serverId; //返回图片的服务器端ID
    }
});

从上面接口中localId的注释,又引导我看了chooseImage接口。此接口文档下有个备注,很重要,划重点,后面在讲。先来看看这个chooseImage接口。

wx.chooseImage({
    count:1,    //默认9
    sizeType:['original','compressed'], //可以指定是原图还是缩略图,默认两者都有
    sourceType:['album','camera'], //可以指定来源是相册还是相机,默认两者都有
    success:function (res) {
        var localId = res.localIds; //返回选定照片的本地id列表,localId可以作为img标签的src属性显示图片
    }
});

再来看看uploadImage接口的这个备注:

备注:上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的serverIdmedia_id

现在整个流程就比较通了,前端首先调用chooseImage接口获取localIds,接着调用uploadImage接口,利用参数localIds来获取serverId,后端则通过调用微信多媒体接口,利用前端传入的参数serverId来获取上传的图片。
step4:啰嗦了这么多,到底是哪出错了,首先可以确定前端传给我的id一定是微信返回的id,而从刚才的分析可以看出,id有两种。一种是localId,一种是serverId。那么就大概猜到,可能前端将localId当作serverId传给了后端。
step5:通过检查验证,果然这样。如果出现上面的问题,那么首先你应该检查你的id的格式。下面是合法的id形式:qedijYvbpoiuwn0UBeZLzM003kp4sjoeohc9epzNUhuKQLTBS-22EBlpghjio,也就是说serverId应有的形式。而localId根据你的手机系统,分为AndroidiOS两种,分别的形式为:weixin://resourceid/d5b205e1c71994dcd39b6bb2045e201fwxLocalResource://564545039458235

参考文档

  1. 全局返回码说明
  2. 获取临时素材
  3. 微信JS-SDK说明文档

你可能感兴趣的:(公众号开发)