上传临时素材——以上传一张图片为例

上传临时素材——以上传一张图片为例

功能说明

使用 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:账号没有群发/新闻消息权限。

关键坑点

  1. Senparc 的 UploadTemporaryMedia(..., string file) 里的 file 是“本地文件绝对路径”,不是图片 URL。
    微信临时素材接口本身是 multipart/form-data 上传文件,不是让微信服务器去下载一个 http 地址。
  2. 所以传 http://weixin.foxdevelop.com/logo.png 会报: 41005 media data missing
  3. 测试号 / 未认证订阅号:
    • 可以上传临时素材
    • 但群发图文、客服图文等高级能力可能没有权限
    • 所以后面才会出现 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)

错误码小结

错误码含义原因
41005media data missing没真正传文件,传了 URL 或文件没读到
40128invalid media idmedia_id 不对,或用永久素材接口要求的方式不对
45028has no masssend quota测试号/未认证号没有群发图文权限

补充

  • 临时素材:MediaApi.UploadTemporaryMedia
  • 永久图片/语音/缩略图:MediaApi.UploadForeverMedia
  • 永久图文:MediaApi.UploadNews
  • 临时图文:MediaApi.UploadTemporaryNews
  • 图文里用的外链图片:MediaApi.UploadImg

没认证公众号:能学“上传素材 / 收消息 / 自动回复”,但群发新闻、客服图文、模板消息等高级功能会被限权。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注