.net微信公众号开发——群发消息

作者:王先荣
    本文将介绍微信公众号开发中用于群发消息的类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 >= 0)
        {
            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 >= 0)
        {
            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 >= 0)
        {
            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 >= 0)
        {
            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 >= 0)
        {
            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;
            }
        }

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

时间: 2024-10-17 18:29:14

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

微信公众号平台群发消息限制怎么解决?

1.微信公众号模板消息群发 不限制群发次数,不占用微信公众号群发次数,但是对群发的内容有一定限制,不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息,不然会被微信停止使用!!! 2.48小时信息推送解决订阅号一天只能群发一次,服务号一个月只能群发四次:48小时内不限制次数信息推送给粉丝,只要48小时内粉丝与微信公众号互动(操作)统统都可以接受到推送信息 #微号帮功能 不限制次数模板消息群发.48小时信息推送print('微信公众号平台群发消息限制')sleep.time(1) 原文地址:

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

本文介绍微信公众号中的模板消息,包括以下内容:(1)TemplateMessage类简介:(2)设置所属行业:(3)获得模板id:(4)发送模板消息:(5)接收推送模板消息发送结果事件.    本文演示地址:http://xrwang.net/Example/TemplateMessage.aspx    本文源代码地址:    http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/tree/master/PublicAccount

微信公众号开发之消息的接收与被动回复消息

原文:http://blog.csdn.net/qczxl/article/details/51580946 微信官方文档 接收普通消息(http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html) 接收事件推送(http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html) 发送被动回复消息(http://mp.weixin.qq.com/

微信公众号开发之消息自动回复

1.PHP示例代码下载 下载地址1:http://pan.baidu.com/s/1nvlhbnV. 下载地址2:https://mp.weixin.qq.com/wiki/home/index.html(开始开发->接入指南->PHP示例代码下载) 2.wx_sample.php初始代码 1 <?php 2 /** 3 * wechat php test 4 */ 5 6 //define your token 7 define("TOKEN", "wei

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

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

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

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

微信公众号开发系列-发送客服消息

下面是做微信公众号开发用到最多的两个客服消息发送类型,文本信息和图文信息. 1.发送文本消息 { "touser":"OPENID", "msgtype":"text", "text": { "content":"Hello World" } } 參数 是否必须 说明 access_token 是 调用接口凭证 touser 是 普通用户openid msgtype

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler

.NET微信公众号开发-6.0模板消息

一.前言 为了保证用户不受到骚扰,在开发者出现需要主动提醒.通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒.通知消息.这个意思也就是,我们作为微信商户,不能主动的给用户推送消息,如果这个功能完全开放,那么用户有可能会受到大量的垃圾信息,为了做一个很好的控制,微信那边给我们开放了一个模板消息,通过模板消息我们可以友好的给用户发送一些相关的消息提醒. 二.开发前的准备 1.0模板消息官方文档地址 2.0查看我们的模板消息是否申请成功