企業微信發送應用消息的實現
企業號升級到企業微信後,發送應用消息的接口也變化了不少,除了原來的文本、圖片、文件、語音、視頻、圖文消息等消息外,增加了文本卡片、markdown消息、小程序通知消息等內容,不過它們都可以共用一個接口進行發送,只是它們的對象不太一樣,本篇隨筆主要介紹整個企業微信應用消息處理這部分內容,包括不同消息的實體關系和接口發送的實現等內容。
1、企業微信消息對象的定義
在早期還是微信企業號的時候,我對發送企業號消息的接口也已經實現,參考《C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)》,這次對企業號升級到企業微信接口,對所有接口進行了梳理和測試。
我們先看看企業微信對應用消息接口的介紹(https://work.weixin.qq.com/api/doc#90000/90135/90236)
根據消息的類型,我們增加了一些額外的對象實體類,修改後的關系圖如下所示。
我們來看看新增的文本卡片、markdown消息、小程序通知消息等內容的對象定義代碼。
所有消息的基類信息CorpSendBase基類對象代碼如下
/// <summary> /// 企業號發送消息的基礎消息內容 /// </summary> public class CorpSendBase { /// <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> /// 表示是否是保密消息,0表示否,1表示是,默認0 /// </summary> [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string safe { get; set; } }
其他的文本卡片、markdown消息、小程序通知消息等內容的對象繼承它,增加自己對象的消息即可。
如文本卡片的類及其子類的代碼如下所示。
/// <summary> /// 文本卡片消息 /// </summary> public class CorpSendTextCard : CorpSendBase { public CorpSendTextCard() { this.msgtype = CorpMsgType.textcard; this.textcard = new CorpSendTextCardEntity(); } public CorpSendTextCard(string title, string description, string url, string btntxt = "詳情") { this.msgtype = CorpMsgType.textcard; this.textcard = new CorpSendTextCardEntity(title, description, url, btntxt); } /// <summary> /// 消息內容 /// </summary> public CorpSendTextCardEntity textcard { get; set; } } public class CorpSendTextCardEntity { /// <summary> /// 標題,不超過128個字節,超過會自動截斷 /// </summary> public string title { get; set; } /// <summary> /// 描述,不超過512個字節,超過會自動截斷 /// </summary> public string description { get; set; } /// <summary> /// 點擊後跳轉的鏈接。 /// </summary> public string url { get; set; } /// <summary> /// 按鈕文字。 默認為“詳情”, 不超過4個文字,超過自動截斷。 /// </summary> public string btntxt { get; set; } public CorpSendTextCardEntity() { } public CorpSendTextCardEntity(string title, string description, string url, string btntxt = "詳情") { this.title = title; this.description = description; this.url = url; this.btntxt = btntxt; } }
效果借用官方的效果圖,如下所示
markdown消息對象如下所示
/// <summary> /// markdown消息 /// 目前僅支持markdown語法的子集 /// 微工作臺(原企業號)不支持展示markdown消息 /// </summary> public class CorpSendMarkdown : CorpSendBase { public CorpSendMarkdown() { this.msgtype = CorpMsgType.markdown; this.markdown = new CorpSendMarkdownEntity(); } public CorpSendMarkdown(string content) { this.msgtype = CorpMsgType.markdown; this.markdown = new CorpSendMarkdownEntity(content); } /// <summary> /// 消息內容 /// </summary> public CorpSendMarkdownEntity markdown { get; set; } }
效果如下所示
小程序通知消息
/// <summary> /// 小程序通知消息 /// </summary> public class CorpSendMiniProgram : CorpSendBase { public CorpSendMiniProgram() { this.msgtype = CorpMsgType.miniprogram_notice; this.textcard = new CorpSendMiniProgramEntity(); } /// <summary> /// 消息內容 /// </summary> public CorpSendMiniProgramEntity textcard { get; set; } }
小程序的消息界面效果如下
有了這些消息的定義,我們就可以統一使用接口進行發送了。
2、發送企業微信信息
定義一個消息發送的接口,接口函數的參數,包括accesstoken和消息對象的基類,如下所示。
/// <summary> /// 企業微信消息管理接口定義 /// </summary> public interface ICorpMessageApi { /// <summary> /// 發送消息。 /// 消息型應用支持文本、圖片、語音、視頻、文件、圖文等消息類型。主頁型應用只支持文本消息類型,且文本長度不超過20個字。 /// 需要管理員對應用有使用權限,對收件人touser、toparty、totag有查看權限,否則本次調用失敗。 /// </summary> /// <param name="accessToken"></param> /// <returns></returns> CommonResult SendMessage(string accessToken, CorpSendBase data); }
實現接口的代碼如下所示
/// <summary> /// 發送消息。 /// 消息型應用支持文本、圖片、語音、視頻、文件、圖文等消息類型。主頁型應用只支持文本消息類型,且文本長度不超過20個字。 /// 需要管理員對應用有使用權限,對收件人touser、toparty、totag有查看權限,否則本次調用失敗。 /// </summary> /// <param name="accessToken"></param> /// <returns></returns> public CommonResult SendMessage(string accessToken, CorpSendBase data) { CommonResult result = new CommonResult(); var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", accessToken); var postData = data.ToJson(); //數據不用加密發送 CorpSendResult sendResult = WeJsonHelper<CorpSendResult>.ConvertJson(url, postData); if (sendResult != null) { result.Success = (sendResult.errcode == 0); if (!result.Success) { result.ErrorMessage = string.Format("invaliduser:{0},invalidparty:{1},invalidtag:{2}", sendResult.invaliduser, sendResult.invalidparty, sendResult.invalidtag); } } return result; }
定義好相應的發送對象後,我們就可以進行統一的消息發送操作,包括文本、圖片、文件、語音等等類型的消息,註意有些消息是需要上傳到服務器上,然後在根據mediaId進行發送出去的。
程序測試接口發送的調用代碼如下所示:
文本卡片發送代碼
/// <summary> /// 文本卡片消息發送 /// </summary> private void btnSendTextCard_Click(object sender, EventArgs e) { ICorpMessageApi bll = new CorpMessageApi(); CorpSendTextCard msg = new CorpSendTextCard("中秋節禮品領取", "今年中秋節公司有豪禮相送", "http://www.iqidi.com", "更多詳情"); msg.agentid = agentid; msg.touser = "wuhuacong"; CommonResult result = bll.SendMessage(token, msg); if (result != null) { Console.WriteLine("發送TextCard消息:{0} {1} {2}", fileMediaId, (result.Success ? "成功" : "失敗"), result.ErrorMessage); } }
Markdown的發送代碼如下所示。
/// <summary> /// MarkDown消息發送 /// </summary> private void btnSendMarkDown_Click(object sender, EventArgs e) { ICorpMessageApi bll = new CorpMessageApi(); string content = @"您的會議室已經預定,稍後會同步到`郵箱` >**事項詳情** >事 項:<font color=‘info‘>開會</font> >組織者:@miglioguan >參與者:@miglioguan、@kunliu、@jamdeezhou、@kanexiong、@kisonwang > >會議室:< font color =‘info‘>廣州TIT 1樓 301</font> >日期:< font color =‘warning‘>2018年5月18日</font> >時間:< font color =‘comment‘>上午9:00-11:00</font> > > 請準時參加會議。 > > 如需修改會議信息,請點擊:[修改會議信息] (https://work.weixin.qq.com)"; CorpSendMarkdown msg = new CorpSendMarkdown(content); msg.agentid = agentid; msg.touser = "wuhuacong"; CommonResult result = bll.SendMessage(token, msg); if (result != null) { Console.WriteLine("發送Markdown消息:{0} {1} {2}", fileMediaId, (result.Success ? "成功" : "失敗"), result.ErrorMessage); } }
企業微信發送應用消息的實現