作者:王先荣
    本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类;(2)群发;(3)删除;(4)预览;(5)查询发送状态;(6)接收推送群发结果事件。
    源代码地址:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/tree/master/PublicAccount/MassMessage
    演示地址:http://www.xrwang.net/Example/MassMessage.aspx

1 MassMessage类
    MassMessage静态类封装了群发消息相关的方法,如下表:

作用 方法名
群发 Send
删除 Delete
预览 Preview
查询发送状态 GetStatus

2 群发
    公众号可以按用户分组群发消息,也可以按用户的OpenId列表来群发群发消息。
2.1 按用户分组群发消息
    方法定义如下:

/// <summary>
/// 根据分组群发消息
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="isToAll">是否群发给所有用户</param>
/// <param name="groupId">如果群发给所有用户,忽略该参数;否则群发给该组中的用户</param>
/// <param name="messageType">群发消息类型</param>
/// <param name="mediaIdOrContent">多媒体id或者文本内容</param>
/// <param name="errorMessage">返回发送是否成功</param>
/// <returns>如果发送成功,返回消息ID;否则,返回-1。</returns>
public static long Send(string userName, bool isToAll, string groupId, MassMessageTypeEnum messageType, string mediaIdOrContent, out ErrorMessage errorMessage)

使用示例如下:

    /// <summary>
/// 按分组群发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSendToGroup_Click(object sender, EventArgs e)
{
if (rblGroup.SelectedIndex >= )
{
string userName = lbPublicAccount.SelectedValue;
ErrorMessage errorMessage;
bool isToAll = string.IsNullOrWhiteSpace(rblGroup.SelectedValue);
string groupId = isToAll ? "" : rblGroup.SelectedValue;
string content = txtContent.Text;
long msgId = MassMessage.Send(userName, isToAll, groupId, MassMessageTypeEnum.text, content, out errorMessage);
if (errorMessage.IsSuccess)
{
ltrMessage.Text = "群发消息成功。";
rblMassMessage.Items.Add(new ListItem(string.Format("id:{0},text:{1}", msgId, content), msgId.ToString()));
}
else
ltrMessage.Text = string.Format("群发消息失败。{0}", errorMessage);
}
}

按用户分组群发消息示例

2.2 按OpenId列表群发

方法定义如下:

/// <summary>
/// 根据OpenId列表群发消息
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="tousers">OpenId列表</param>
/// <param name="messageType">群发消息类型</param>
/// <param name="mediaIdOrContent">多媒体id或者文本内容</param>
/// <param name="errorMessage">返回发送是否成功</param>
/// <returns>如果发送成功,返回消息ID;否则,返回-1。</returns>
public static long Send(string userName, IEnumerable<string> tousers, MassMessageTypeEnum messageType, string mediaIdOrContent, out ErrorMessage errorMessage)

使用示例如下:

    /// <summary>
/// 按用户群发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSendToUsers_Click(object sender, EventArgs e)
{
if (cblUser.SelectedIndex >= )
{
string userName = lbPublicAccount.SelectedValue;
ErrorMessage errorMessage;
List<string> openIds = new List<string>();
foreach (ListItem item in cblUser.Items)
{
if (item.Selected)
openIds.Add(item.Value);
}
string content = txtContent.Text;
long msgId = MassMessage.Send(userName, openIds, MassMessageTypeEnum.text, content, out errorMessage);
if (errorMessage.IsSuccess)
{
ltrMessage.Text = "群发消息成功。";
rblMassMessage.Items.Add(new ListItem(string.Format("id:{0},text:{1}", msgId, content), msgId.ToString()));
}
else
ltrMessage.Text = string.Format("群发消息失败。{0}", errorMessage);
}
}

按用户OpenId列表群发消息示例

3 删除群发
    删除已群发消息的方法定义如下:

/// <summary>
/// 删除群发消息。
/// 注:只能删除图文消息和视频消息。
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="messageId">消息id</param>
/// <returns>返回删除是否成功</returns>
public static ErrorMessage Delete(string userName, long messageId)

使用示例如下:

    /// <summary>
/// 删除群发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnDelete_Click(object sender, EventArgs e)
{
if (rblMassMessage.SelectedIndex >= )
{
string userName = lbPublicAccount.SelectedValue;
long msgId = long.Parse(rblMassMessage.SelectedValue);
ErrorMessage errorMessage = MassMessage.Delete(userName, msgId);
if (errorMessage.IsSuccess)
{
ltrMessage.Text = "删除消息成功。";
rblMassMessage.Items.Remove(rblMassMessage.SelectedItem);
}
else
ltrMessage.Text = string.Format("删除消息失败。{0}", errorMessage);
}
}

删除群发的示例

4 预览群发
    预览群发消息的方法定义如下:

/// <summary>
/// 预览群发消息
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="touser">OpenId</param>
/// <param name="messageType">群发消息类型</param>
/// <param name="mediaIdOrContent">多媒体id或者文本内容</param>
/// <param name="errorMessage">返回发送是否成功</param>
/// <returns>如果发送成功,返回消息ID;否则,返回-1。</returns>
public static long Preview(string userName, string touser, MassMessageTypeEnum messageType, string mediaIdOrContent, out ErrorMessage errorMessage)

使用示例如下:

    /// <summary>
/// 预览群发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnPreview_Click(object sender, EventArgs e)
{
if (cblUser.SelectedIndex >= )
{
string userName = lbPublicAccount.SelectedValue;
ErrorMessage errorMessage;
string openId = cblUser.SelectedValue;
string content = txtContent.Text;
long msgId = MassMessage.Preview(userName, openId, MassMessageTypeEnum.text, content, out errorMessage);
if (errorMessage.IsSuccess)
{
ltrMessage.Text = "预览消息成功。";
rblMassMessage.Items.Add(new ListItem(string.Format("id:{0},text:{1}", msgId, content), msgId.ToString()));
}
else
ltrMessage.Text = string.Format("预览消息失败。{0}", errorMessage);
}
}

预览群发的示例

5 查询群发消息发送状态
    查询群发消息发送状态的方法定义如下:

/// <summary>
/// 查询群发消息的发送状态
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="messageId">消息id</param>
/// <param name="errorMessage">返回查询是否成功</param>
/// <returns>返回消息是否发送成功</returns>
public static bool GetStatus(string userName, long messageId, out ErrorMessage errorMessage)

使用示例如下:

    /// <summary>
/// 查询群发消息状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnGetStatus_Click(object sender, EventArgs e)
{
if (rblMassMessage.SelectedIndex >= )
{
string userName = lbPublicAccount.SelectedValue;
ErrorMessage errorMessage;
long msgId = long.Parse(rblMassMessage.SelectedValue);
bool success = MassMessage.GetStatus(userName, msgId, out errorMessage);
if (errorMessage.IsSuccess)
ltrMessage.Text = string.Format("消息群发{0}。", success ? "成功" : "失败");
else
ltrMessage.Text = string.Format("获取消息群发状态失败。{0}", errorMessage);
}
}

查询群发发送状态的示例

6 接收推送群发结果事件
    群发消息之后,微信服务器会推送群发的结果到公众号的指定URL上,公众号服务器会接收到一条RequestMassSendJobFinishMessage类型的请求消息。
    RequestMassSendJobFinishMessage类有以下只读属性:

        /// <summary>
/// 获取消息id
/// </summary>
public long MsgID { get; private set; }
/// <summary>
/// 获取群发消息的结果
/// </summary>
public string Status { get; private set; }
/// <summary>
/// 获取用户总数
/// </summary>
public int TotalCount { get; private set; }
/// <summary>
/// 获取过滤后待发送的用户数
/// </summary>
public int FilterCount { get; private set; }
/// <summary>
/// 获取发送成功的用户数
/// </summary>
public int SentCount { get; private set; }
/// <summary>
/// 获取发送失败的用户数
/// </summary>
public int ErrorCount { get; private set; } /// <summary>
/// 获取消息是否群发成功
/// </summary>
public bool SendSuccess
{
get
{
return Status == sendSuccess;
}
}
/// <summary>
/// 获取发送失败的原因
/// </summary>
public string ErrorReason
{
get
{
string reason = string.Empty;
if (Status == sendSuccess)
reason = "发送成功";
else if (Status == sendFailed)
reason = "发送失败";
else if (errorDict.ContainsKey(Status))
reason = errorDict[Status];
return reason;
}
}

感谢您看完本文,希望对您有所帮助。

.net微信公众号开发——群发消息的更多相关文章

  1. .net微信公众号开发——模板消息

    作者:王先荣    本文介绍微信公众号中的模板消息,包括以下内容:(1)TemplateMessage类简介:(2)设置所属行业:(3)获得模板id:(4)发送模板消息:(5)接收推送模板消息发送结果 ...

  2. .net微信公众号开发——消息与事件

    作者:王先荣    本文介绍如何处理微信公众号开发中的消息与事件,包括:(1)消息(事件)概况:(2)验证消息的真实性:(3)解析消息:(4)被动回复消息:(5)发送其他消息.    开源项目地址:h ...

  3. 微信公众号开发之根据OpenID列表群发(十四)

    上一篇我们讲述了<微信公众号开发之根据标签进行群发(十二)>,这次我们讲解一下[根据OpenID列表群发] 根据OpenID列表群发[订阅号不可用,服务号认证后可用] 接口调用请求说明 h ...

  4. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  5. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  6. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  7. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  8. PHP 微信公众号开发 - 消息推送

    项目微信公众号开发,需要做用户消息推送,记录下来以便日后使用 1,接上一篇文章,可以查看如何获取用户openid PHP 微信公众号开发 - 获取用户信息 2,添加模板消息 3,查看模板详情 根据模板 ...

  9. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

随机推荐

  1. 【转】Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行

    当打开这个设置以后,程序的Activity会自动销毁,每次返回的时候就会不断重oncreate,此时伴随的问题多多. 参考文档:http://www.bubuko.com/infodetail-960 ...

  2. OkHttp使用介绍

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4001708.html 为什么需要一个HTTP库 Androi ...

  3. 《The Book of CSS3》学习笔记

    一.浏览器前缀 E{ -moz-name : value; /* Firefox */ -ms-name : value; /* IE */ -o-name : value; /* Opera */ ...

  4. 从数组中选出和等于固定值的n个数(JavaScript实现)

    现实生活中的问题,可能会抽象为这样一种数据模型: 从一个数组中挑选出几个数,让这几个数相加的和为指定的值. 大多数读者应该有过网购的经历,网购一般会有个凑单功能,假如读者买了70元的商品,但是必须满1 ...

  5. Wijmo 2016 V2 强势发布!

    Angular 2 支持 Wijmo 对 Angular 2 提供了全面的支持.我们一直在紧跟Angular 2 开发团队的步伐,对其发布的最新候选版本提供支持. 了解更多关于Angular 2 的支 ...

  6. C# VS JAVA 差异 (未完待续)

    1. 静态构造函数 C#中有静态构造函数, Java中没有静态构造函数.其实Java中有一个类似静态构造函数的东东,称作静态初始化,或者静态代码块,可以通过这样的代码实现相同的功能: 但是Java中静 ...

  7. 【原】在windows下使用VirtualEnv

    VirtualEnv可以方便的解决不同项目中对类库的依赖问题.这通常是通过以下方式实现的:首先将常用的类库安装在系统环境中:然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环 ...

  8. paip.获取地理位置根据Ip

    paip.获取地理位置根据Ip html转换txt 正则表达式截取mid 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  9. paip.文件读写api php java python总结.txt

    paip.文件读写api php java python总结.txt 一.多种方式读文件内容.    1.按字节读取文件内容   以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. ...

  10. Linux初学 - 安装及网络配置

    安装版本 CentOS-6.4 虚拟机  vmware workstation 12 配置 网络配置 检查网络设置是否成功 如果网络配置文件检查没有问题,配置完成后网络仍然ping不同 1.检查虚拟机 ...