应用目的:使用企业微信推送系统风险日志,用于实时系统监控
企业微信注册: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;
}