上传临时素材——以上传一张图片为例
功能说明
使用 Senparc 提供的 MediaApi 可以管理公众号素材。上传临时素材调用的是 MediaApi.UploadTemporaryMedia,适用于图片、语音、视频、缩略图等,上传成功后会返回一个 media_id,有效期通常为 3 天。
原代码与报错
/// <summary>
/// 上传临时素材-上传一张图片为例
/// </summary>
public UploadTemporaryMediaResult UploadTemporaryMedia()
{
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
string imgUrl = "http://weixin.foxdevelop.com/logo.png";
UploadTemporaryMediaResult mediaResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, imgUrl);
return mediaResult;
}Code language: PHP (php)
运行后可能出现以下错误:
41005 media data missing:微信没有拿到媒体文件数据。40128 invalid media id! must be uploaded by api:用了错误方式或错误 ID 去发消息。45028 has no masssend quota:账号没有群发/新闻消息权限。
关键坑点
- Senparc 的
UploadTemporaryMedia(..., string file)里的 file 是“本地文件绝对路径”,不是图片 URL。
微信临时素材接口本身是multipart/form-data上传文件,不是让微信服务器去下载一个 http 地址。 - 所以传
http://weixin.foxdevelop.com/logo.png会报:41005 media data missing - 测试号 / 未认证订阅号:
- 可以上传临时素材
- 但群发图文、客服图文等高级能力可能没有权限
- 所以后面才会出现
45028 has no masssend quota(没有群发配额)
正确写法:先下载到服务器,再上传本地文件
public UploadTemporaryMediaResult UploadTemporaryMedia()
{
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
// 1. 远程图片先下载到本地
string localPath = Server.MapPath("~/uploads/logo.png");
if (!System.IO.File.Exists(localPath))
{
using (var wc = new System.Net.WebClient())
{
wc.DownloadFile("http://weixin.foxdevelop.com/logo.png", localPath);
}
}
// 2. 上传本地文件
UploadTemporaryMediaResult mediaResult =
MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, localPath);
return mediaResult;
}Code language: PHP (php)
返回对象中重点用:
mediaResult.media_id:发图片/语音/视频消息时用mediaResult.created_at:创建时间
拿到 media_id 后怎么用
var responseMessage = CreateResponseMessage<ResponseMessageImage>();
responseMessage.Image = new Image
{
MediaId = mediaResult.media_id
};
return responseMessage;Code language: JavaScript (javascript)
错误码小结
| 错误码 | 含义 | 原因 |
|---|---|---|
| 41005 | media data missing | 没真正传文件,传了 URL 或文件没读到 |
| 40128 | invalid media id | media_id 不对,或用永久素材接口要求的方式不对 |
| 45028 | has no masssend quota | 测试号/未认证号没有群发图文权限 |
补充
- 临时素材:
MediaApi.UploadTemporaryMedia - 永久图片/语音/缩略图:
MediaApi.UploadForeverMedia - 永久图文:
MediaApi.UploadNews - 临时图文:
MediaApi.UploadTemporaryNews - 图文里用的外链图片:
MediaApi.UploadImg
没认证公众号:能学“上传素材 / 收消息 / 自动回复”,但群发新闻、客服图文、模板消息等高级功能会被限权。
Previous: 使用 Senparc 取得微信公众平台的粉丝
Next: 上传永久素材(图片)