使用 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
常见触发原因
- 多次点击“群发”,但 SDK / 业务代码里用了固定
clientmsgid - 上传了临时素材,但群发时微信侧认为这条去重标识已经发过
- 测试环境反复调试群发接口
- 用测试号/未认证号,本身群发权限不稳,报错信息容易混淆
解决办法
办法一:不要重复用同一个 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没有群发配额45065clientmsgid 冲突48001接口未授权
正式开发建议:
- 收消息 / 自动回复:用测试号
- 群发 / 菜单高级能力 / 素材管理:用认证服务号
群发图片消息正确姿势小结
- 本地图片路径必须存在
- 先上传临时素材拿
media_id - 再调用
GroupMessageApi.SendGroupMessageByGroupId - 不要重复使用相同
clientmsgid - 未认证号/测试号群发图片经常受限,不是代码一定错
错误码速查
| 错误码 | 含义 |
|---|---|
| 45065 | clientmsgid exist,去重标识重复 |
| 45028 | 没有群发配额 |
| 48001 | 接口未授权(账号类型不支持) |
| 41005 | media data missing,文件没传对 |
| 40007 | media_id 不合法 |
Previous: 使用 Senparc 群发文本消息