使用 Senparc 群发图片消息

使用 Senparc 群发图片消息

功能说明

群发图片消息与群发文本消息思路类似,区别是:图片消息需要先上传素材,拿到 media_id,再把 media_id 作为群发内容下发。

原代码

/// <summary>
/// 群发消息
/// </summary>
public string SendGroupMessage(int type, int groupId = -1)
{
    var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
    SendResult result = null;
    bool isToAll = (groupId == -1);
    string imgFilePath = Server.MapPath("~/logo.png");

    switch ((ResponseMsgType)type)
    {
        case ResponseMsgType.Image:
            UploadTemporaryMediaResult mediaImage = MediaApi.UploadTemporaryMedia(
                accessToken,
                UploadMediaFileType.image,
                imgFilePath
            );
            result = GroupMessageApi.SendGroupMessageByGroupId(
                accessToken,
                groupId.ToString(),
                mediaImage.media_id,
                GroupMessageType.image,
                isToAll
            );
            break;
    }

    return result.errcode + "-" + result.errmsg;
}Code language: PHP (php)

报错说明

微信Post请求发生错误!错误代码:45065,说明:clientmsgid exist

意思是:本次群发使用的 clientmsgid 已存在

微信群发接口支持传 clientmsgid(客户端消息 ID),用于幂等控制:

  • 同一个 clientmsgid 在 24 小时内重复提交,微信会认为这是重复请求
  • Senparc 在内部或微信侧如果自动带了相同 clientmsgid,再次群发就会报 45065

常见触发原因

  1. 多次点击“群发”,但 SDK / 业务代码里用了固定 clientmsgid
  2. 上传了临时素材,但群发时微信侧认为这条去重标识已经发过
  3. 测试环境反复调试群发接口
  4. 用测试号/未认证号,本身群发权限不稳,报错信息容易混淆

解决办法

办法一:不要重复用同一个 clientmsgid

如果代码里手动设置了 clientmsgid,每次群发都要换新的,例如:

string clientMsgId = Guid.NewGuid().ToString("N");Code language: JavaScript (javascript)

办法二:直接用 Senparc 不带 clientmsgid 的重载

大多数情况下不传 clientmsgid 即可,SDK 会自动处理:

case ResponseMsgType.Image:
{
    UploadTemporaryMediaResult mediaImage = MediaApi.UploadTemporaryMedia(
        accessToken,
        UploadMediaFileType.image,
        imgFilePath
    );

    result = GroupMessageApi.SendGroupMessageByGroupId(
        accessToken,
        groupId.ToString(),
        mediaImage.media_id,
        GroupMessageType.image,
        isToAll
    );
    break;
}Code language: JavaScript (javascript)

办法三:临时素材别反复上传

可以把上传后的 media_id 存起来,调试时复用,避免每次都重新上传:

// 伪代码
string mediaId = CacheHelper.Get("logo_media_id");
if (string.IsNullOrEmpty(mediaId))
{
    mediaId = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, imgFilePath).media_id;
    CacheHelper.Set("logo_media_id", mediaId, TimeSpan.FromHours(2));
}Code language: JavaScript (javascript)

办法四:测试号别硬测群发

测试账号经常没有完整群发权限,群发图文/图片容易报:

  • 45028 没有群发配额
  • 45065 clientmsgid 冲突
  • 48001 接口未授权

正式开发建议:

  • 收消息 / 自动回复:用测试号
  • 群发 / 菜单高级能力 / 素材管理:用认证服务号

群发图片消息正确姿势小结

  1. 本地图片路径必须存在
  2. 先上传临时素材拿 media_id
  3. 再调用 GroupMessageApi.SendGroupMessageByGroupId
  4. 不要重复使用相同 clientmsgid
  5. 未认证号/测试号群发图片经常受限,不是代码一定错

错误码速查

错误码含义
45065clientmsgid exist,去重标识重复
45028没有群发配额
48001接口未授权(账号类型不支持)
41005media data missing,文件没传对
40007media_id 不合法

发表回复

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