调用微信获取临时素材接口,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天,可用微信多媒体接口下载图片到自己的服务器,此处获得的
serverId
即media_id
。
现在整个流程就比较通了,前端首先调用chooseImage
接口获取localIds
,接着调用uploadImage
接口,利用参数localIds
来获取serverId
,后端则通过调用微信多媒体接口,利用前端传入的参数serverId
来获取上传的图片。
step4:啰嗦了这么多,到底是哪出错了,首先可以确定前端传给我的id一定是微信返回的id,而从刚才的分析可以看出,id有两种。一种是localId
,一种是serverId
。那么就大概猜到,可能前端将localId
当作serverId
传给了后端。
step5:通过检查验证,果然这样。如果出现上面的问题,那么首先你应该检查你的id的格式。下面是合法的id形式:qedijYvbpoiuwn0UBeZLzM003kp4sjoeohc9epzNUhuKQLTBS-22EBlpghjio
,也就是说serverId
应有的形式。而localId
根据你的手机系统,分为Android
和iOS
两种,分别的形式为:weixin://resourceid/d5b205e1c71994dcd39b6bb2045e201f
和wxLocalResource://564545039458235
。
参考文档