c#微信企业号开发之消息推送

最近刚学习了微信企业号推送消息方面的开发,做个小总结记录一下~废话不多说,上干货!

准备阶段

首先你需要一个企业号,因为推送消息的接口需要使用企业号的一些信息,可以从这个网址直接申请,在这里就不赘述啦~

点我申请企业号

可以先看一下官方文档:https://work.weixin.qq.com/api/doc#90000/90003/90556

实现消息的推送就需要调用微信的接口,下图是从官方api上截的图,已经说的很明白了,由此可以看出要想推送消息,首先我们需要获取access_token
在这里插入图片描述
获取access_token需要两个参数,大家要注意一下每日调用接口是有次数限制的,具体大家可以根据自己情况去官方文档的附录上去查看,每获取一次access_token有效期是两个小时在这里插入图片描述
在企业号管理后台可以看到企业ID,即corpid,企业的唯一标识(用来获取access_token)
在这里插入图片描述
在这里插入图片描述
在应用管理中,点击要推送消息的应用,可以获取到agentid即应用id(用来发送消息)和secret(用来获取access_token)
在这里插入图片描述
好了~我们需要准备的都在这里啦,接下来就是要动手实践啦!

实现应用推送消息

发送消息的类型有很多种,以下以发送文本卡片消息为例,可以根据自己需求进行调整
在这里插入图片描述
可以把企业id、应用id跟应用秘钥放在配置文件里

 <!--企业号id-->
    <add key="CorpId" value="企业id"/>
    <!--企业号消息推送配置信息-->
    <add key="Secret" value="推送消息应用的secret"/>
    <add key="agentId" value="应用id"/>

首先我们需要准备一个发送消息类

 public class PushMessageModel
    {
        /// <summary>
        /// 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个) 特殊情况:指定为@all,则向关注该企业的全部成员发送
        /// </summary>
        public string touser { get; set; }

        /// <summary>
        /// 部门ID列表,多个接收者用‘|’分隔,最多支持100个,当touser为@all忽略本参数
        /// </summary>
        public string toparty { get; set; }

        /// <summary>
        /// 标签ID列表,多个接收者用‘|’分隔,最多支持100个,当touser为@all忽略本参数
        /// </summary>
        public string totag { get; set; }

        /// <summary>
        /// 消息类型
        /// </summary>
        public string msgtype { get; set; }

        /// <summary>
        /// 企业应用ID,整型,可在应用设置页面查看
        /// </summary>
        public string agentid { get; set; }

        /// <summary>
        /// 表示是否开启id转译,0表示否,1表示是,默认0
        /// </summary>
        public string enable_id_trans { get; set; }

        /// <summary>
        /// 表示是否开启重复消息检查,0表示否,1表示是,默认0
        /// </summary>
        public string enable_duplicate_check { get; set; }

        /// <summary>
        /// 表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时
        /// </summary>
        public string duplicate_check_interval { get; set; }

        #region 发送文本卡片消息
        /// <summary>
        /// 标题,不超过128个字节,超过会自动截断
        /// </summary>
        public string title { get; set; }

        /// <summary>
        /// 描述,不超过512个字节,超过会自动截断
        /// </summary>
        public string description { get; set; }

        /// <summary>
        /// 点击后跳转的链接
        /// </summary>
        public string url { get; set; }

        /// <summary>
        /// 按钮文字,默认为“详情”,不超过四个文字,超过自动截断
        /// </summary>
        public string btntxt { get; set; }
          #endregion 发送文本卡片消息

一个返回token参数类

 public class TokenResultModel
    {
        //出错返回码,为0表示成功,非0表示调用失败
        public string errcode { get; set; }
        //返回码提示语
        public string errmsg { get; set; }
        获取到的凭证,最长为512字节
        public string access_token { get; set; }

        //凭证的有效时间(秒)
        public string expires_in { get; set; }
    }

一个返回推送信息类,主要是用来处理返回值

 public class MessageResultModel
    {
        /// <summary>
        /// 出错返回码,为0表示成功,非0表示调用失败
        /// </summary>
        public string errcode { get; set; }
        /// <summary>
        /// 返回码提示语
        /// </summary>
        public string errmsg { get; set; }
        public string invaliduser { get; set; }      
    }

然后就是实现发送消息啦~这里数据我是直接写死,一开始只是想实现推送消息没有联系到业务,为了方便测试直接写在一般处理程序里,可以直接发布调用测试,大家也可以根据业务需求灵活使用

 #region 发送消息
        public string SendMessages(HttpContext context)
        {
            string msg = "";
            string agentid = ConfigurationManager.AppSettings["agentId"];
            PushMessageModel model = new PushMessageModel();
            PushMeaaageBLL bll = new PushMeaaageBLL();
            model.touser = "@all";//成员id列表
            model.agentid = agentid;//应用id
            model.msgtype = "textcard";
            model.duplicate_check_interval = "";//检测重复消息时间间隔
            model.enable_duplicate_check = "";//是否开启重复消息
            model.enable_id_trans = "";//是否开启id转义
            model.title = "1111111";
            model.description = "22222222";
            model.url = "url";
            model.btntxt = "";
            string token = AccessToken(context);
            if (!string.IsNullOrEmpty(token))
            {
                MessageResultModel result = bll.Send(model, token);
                msg = "{'msg':" + result.errmsg + ",'code':" + result.errcode + "}";
            }
            else
            {
                msg = "未获取到token";
            }

            return msg;
        }
        #endregion 发送消息


        #region 获取access_token
        /// <summary>
        /// 获取access_token
        /// </summary>
        public string AccessToken(HttpContext context)
        {
            string access_token = string.Empty;
            string corpid = ConfigurationManager.AppSettings["CorpId"];
            string secret = ConfigurationManager.AppSettings["Secret"];
           
            access_token = GetToken.ReturnToken(corpid, secret, context);
            return access_token;
        }


获取token类

public class GetToken
    {
        #region 根据属性获取json值
        /// <summary>
        /// 根据属性获取值(仅适用于获取token返回的json)
        /// </summary>
        /// <param name="str">json字符串</param>
        /// <param name="key">属性</param>
        /// <returns></returns>
        public static string GetJsonValue(string str, string key)
        {
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            TokenResultModel model = Serializer.Deserialize<TokenResultModel>(str);
            switch (key)
            {
                case "errcode":
                    return model.errcode;
                case "errmsg":
                    return model.errmsg;
                case "access_token":
                    return model.access_token;
                case "expires_in":
                    return model.expires_in.ToString();
                default:
                    return "";
            }

        }
        #endregion

        #region 获取Token
        /// <summary>
        /// 获取Token
        /// </summary>
        /// <param name="corpid">企业id</param>
        /// <param name="secret">应用的凭证密钥</param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string ReturnToken(string corpid, string secret, HttpContext context)
        {
            string url =string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", corpid,secret);
            string strJson = HttpRequestRseult.GetResult(url);
            //context.Session["time"] = DateTime.Now;
            string token = GetJsonValue(strJson, "access_token");
            //context.Session["access_token"] = token;
            //context.Session.Timeout = 121;
            return token;
        }
        #endregion
    }
}

实现发送消息类

public class PushMeaaageBLL
    {
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="model"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public  MessageResultModel Send(PushMessageModel model,string token)
        {
            string url =string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", token);
            string postData = SendMessageParameter(model);
            string result = HttpRequestRseult.GetResult(url,postData);
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            MessageResultModel resultModel = Serializer.Deserialize<MessageResultModel>(result);
            return resultModel;
        }

        /// <summary>
        /// 格式化发送消息参数
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public  string SendMessageParameter(PushMessageModel model)
        {
            string touser =model.touser;
            string toparty = model.toparty;
            string totag = model.totag;
            string msgtype = model.msgtype;
            string agentid = model.agentid;
            string enable_id_trans = model.enable_id_trans;
            string enable_duplicate_check = model.enable_duplicate_check;
            string duplicate_check_interval = model.duplicate_check_interval;
            string title = model.title;
            string description = model.description;
            string url =model.url;
            string btntxt = model.btntxt;
            string message = "{\"title\":\"" + title + "\",\"description\":\"" + description + "\",\"url\":\"" + url + "\",\"btntxt\":\"" + btntxt + "\"}";
            string postData = "{\"touser\":\"" + touser + "\",\"toparty\":\"" + toparty + "\",\"totag\":\"" + totag + "\",\"msgtype\":\"" + msgtype + "\",\"agentid\":\"" + agentid + "\",\"textcard\":" + message + ",\"enable_id_trans\":\"" + enable_id_trans + "\",\"enable_duplicate_check\":\"" + enable_duplicate_check + "\"}";

            return postData;
        }
    }

好啦~我们的消息此时就已经推送成功了!
大家如果还有什么疑问欢迎评论区讨论,或者还有什么好的建议也可以写下来,大家一起交流一起进步~还请多多指教

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值