最近刚学习了微信企业号推送消息方面的开发,做个小总结记录一下~废话不多说,上干货!
准备阶段
首先你需要一个企业号,因为推送消息的接口需要使用企业号的一些信息,可以从这个网址直接申请,在这里就不赘述啦~
点我申请企业号
可以先看一下官方文档: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;
}
}
好啦~我们的消息此时就已经推送成功了!
大家如果还有什么疑问欢迎评论区讨论,或者还有什么好的建议也可以写下来,大家一起交流一起进步~还请多多指教