C#实现企业微信推送预警消息

应用目的:使用企业微信推送系统风险日志,用于实时系统监控

企业微信注册:https://work.weixin.qq.com/

企业内部开发:https://work.weixin.qq.com/api/doc/90000/90003/90556

一、创建应用

应用管理->自建->创建应用

AgentId: 应用ID

Secret: 应用密钥

二、成员维护

通讯录下进行部门、成员信息维护

注:部门ID位置

 

三、获取成员信息

企业微信提供以用户ID获取成员信息以及部门ID获取成员信息的API,无法直接获取所有成员列表,但可以通过一级部门递归获取的方式获取全部成员!下面介绍以部门ID获取成员的方式

1、获取Token

企业内部开发-通讯录管理:https://work.weixin.qq.com/api/doc/90000/90135/90193

注:进入企业微信管理后台,在“管理工具” — “通讯录同步助手”开启“API接口同步”

  #region 获取AccessToken
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url">请求地址: [https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET]</param>
        /// <param name="corpid">企业ID</param>
        /// <param name="corpsecret">通用录密钥</param>
        /// <returns></returns>
        public string GetToken(string url, string corpid, string corpsecret)
        {
            try
            {
                WebRequest request = WebRequest.Create(string.Format(url,corpid,corpsecret));

                request.Method = "POST";

                WebResponse response = request.GetResponse();
                string detail = string.Empty;
                using (Stream stream = response.GetResponseStream())
                {
                    Encoding encode = Encoding.UTF8;
                    StreamReader reader = new StreamReader(stream, encode);
                    detail = reader.ReadToEnd();
                }
                var TokenVar = JsonConvert.DeserializeObject<WXToken>(detail);
                return (String)TokenVar.access_token;
            }
            catch
            {
                throw;
            }
        }

        #endregion
/// <summary>
    /// {
    /// "errcode": 0, --出错返回码,为0表示成功,非0表示调用失败
    /// "errmsg": "ok",--返回码提示语
    /// "access_token": "accesstoken000001",--获取到的凭证,最长为512字节
    /// "expires_in": 7200--凭证的有效时间(秒)
    /// }
    /// </summary>
    public class WXToken

    {
        public int errcode { set; get; }
        public string errmsg { set; get; }
        public string access_token { set; get; }
        public int expires_in { set; get; }

    }

 

2、获取成员

企业内部开发-获取部门成员:https://work.weixin.qq.com/api/doc/90000/90135/90200

 #region 获取部门成员信息
        /// <summary>
        /// {"errcode":0,"errmsg":"ok","userlist":[{"userid":"user001","name":"用户一号","department":[3]}]}
        /// </summary>
        /// <param name="db"></param>
        /// <param name="corpid">企业ID</param>
        /// <param name="corpsecret">通讯录密钥</param>
        /// <param name="department">部门ID</param>
        /// <param name="fetch_child">1,递归获取  0,仅获取本部门</param>
        /// <returns></returns>
        public DataSet GetUserInfo(IGSPDatabase db, string corpid, string corpsecret, string department, string fetch_child, out string err)
        {
            DataSet dsResult = null;
            string sql = string.Empty;
            string token = string.Empty;
            try
            {
                //获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。
                token = GetToken("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", corpid, corpsecret, out err);

                //获取部门成员
                WebRequest request = WebRequest.Create(string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token={0}&department_id={1}&fetch_child={2}", token, department, fetch_child));

                request.Method = "GET";

                WebResponse response = request.GetResponse();
                string detail = string.Empty;
                using (Stream stream = response.GetResponseStream())
                {
                    Encoding encode = Encoding.UTF8;
                    StreamReader reader = new StreamReader(stream, encode);
                    detail = reader.ReadToEnd();
                }
                var User = JsonConvert.DeserializeObject<WxDeptUser>(detail);


                if (User.errcode != 0)
                {
                    err = User.errmsg;
                    return null;
                }
                if (User.userlist == null || User.userlist.Count == 0)
                {
                    err = "未获取到部门成员信息!";
                    return null;
                }
                dsResult = db.ExecuteDataSet("SELECT * FROM USERINFO WHERE 1=2");
                foreach (WxDeptUserList cy in User.userlist)
                {
                    DataRow dr = dsResult.Tables[0].NewRow();

                    dr["ID"] = Guid.NewGuid().ToString();
                    dr["USERID"] = cy.userid;
                    dr["NAME"] = cy.name;
                    dr["DEPARTMENT"] = string.Join(",", cy.department.Select(i => i.ToString()).ToArray()); 
                    dr["TIME"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    dsResult.Tables[0].Rows.Add(dr.ItemArray);
                }
                return dsResult;
            }
            catch
            {
                throw;
            }
        }
        #endregion

 

public class WxDeptUser
    {
        public int errcode { get; set; }

        public string errmsg { get; set; }

        public List<WxDeptUserList> userlist { get; set; }

    }

public  class WxDeptUserList
    {
        public string userid { get; set; }
        public string name { get; set; }
        public Int32[] department { get; set; }

        public string open_userid { get; set; }
    }

 

四、推送应用消息

企业内部开发-推送消息:https://work.weixin.qq.com/api/doc/90000/90135/90193

介绍textcard(文本卡片消息)推送例子

1、获取Token

      API:https://work.weixin.qq.com/api/doc/90000/90135/91039

      使用三、获取成员信息中的获取Token方法,corpsecret参数传递应用密钥即可。

      应用密钥:https://work.weixin.qq.com/api/doc/90000/90135/90665#secret

2、推送消息

     组织数据:

 #region 组织数据
        internal WxMessage OrgData()
        {
            WxMessage Msg = new WxMessage();
            WxTextCard textCard = new WxTextCard();
            err = string.Empty;
            try
            {
                Msg.touser = "@all";//成员ID列表
                Msg.toparty = "";//部门ID列表
                Msg.totag = "";//标签ID列表
                Msg.msgtype = "textcard";//消息类型,此时固定为:textcard
                Msg.agentid = 1;//企业应用的id,整型。

                textCard.title = "";//标题
                textCard.description = "";//描述
                textCard.url = "";//点击后跳转的链接
                textCard.btntxt = "";//按钮文字。 默认为“详情”
                Msg.textcard = textCard;

                Msg.enable_id_trans = 0;//表示是否开启id转译,0表示否,1表示是,默认0
                Msg.enable_duplicate_check = 0;//表示是否开启重复消息检查,0表示否,1表示是,默认0
                Msg.duplicate_check_interval = 1800;//表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时

                return Msg;
            }
            catch
            {
                throw;
            }
        }

        #endregion
 internal class WxMessage
    {

        /// <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>
        /// 消息类型,此时固定为:textcard
        /// </summary>
        public string msgtype { get; set; }
        /// <summary>
        /// 企业应用的id,整型
        /// </summary>
        public int agentid { get; set; }
        /// <summary>
        /// 消息类型,此时固定为:textcard
        /// </summary>
        public WxTextCard textcard { get; set; }
        /// <summary>
        /// 表示是否开启id转译,0表示否,1表示是,默认0
        /// </summary>
        public int enable_id_trans { get; set; }
        /// <summary>
        /// 表示是否开启重复消息检查,0表示否,1表示是,默认0
        /// </summary>
        public int enable_duplicate_check { get; set; }
        /// <summary>
        /// 表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时
        /// </summary>
        public int duplicate_check_interval { get; set; }

    }
 internal class WxTextCard
    {
        /// <summary>
        /// 标题,不超过128个字节,超过会自动截断(支持id转译)
        /// </summary>
        public string title { get; set; }
        /// <summary>
        /// 描述,不超过512个字节,超过会自动截断(支持id转译)
        /// </summary>
        public string description { get; set; }
        /// <summary>
        /// 点击后跳转的链接。 最长2048字节,请确保包含了协议头(http/https)
        /// </summary>
        public string url { get; set; }
        /// <summary>
        /// 	按钮文字。 默认为“详情”, 不超过4个文字,超过自动截断。
        /// </summary>
        public string btntxt { get; set; }
    }

推送消息:推送频率限制,经测试应用可见成员1人,每分钟仅可接收31条消息,其他被吞掉;访问频率限制详见:https://work.weixin.qq.com/api/doc/90000/90139/90312

 public string Send(string token,WxMessage msg)

        {

            byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject<WxMessage>(msg));

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token);

            request.Method = "POST";

            request.ContentLength = bytes.Length;

            request.ContentType = "json";

            Stream reqstream = request.GetRequestStream();

            reqstream.Write(bytes, 0, bytes.Length);

            //声明一个HttpWebRequest请求

            request.Timeout = 90000;

            //设置连接超时时间

            request.Headers.Set("Pragma", "no-cache");

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream streamReceive = response.GetResponseStream();

            Encoding encoding = Encoding.UTF8;

            StreamReader streamReader = new StreamReader(streamReceive, encoding);

            string strResult = streamReader.ReadToEnd();

            streamReceive.Dispose();

            streamReader.Dispose();

            return strResult;

        }

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dogdeser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值