咱們知道,企業號主要是面向企業需求而生的,所以內部消息的交流顯得很是重要,並且發送、回覆消息數量應該很可觀,對於大企業尤爲如此,所以能夠結合企業號實現內部消息的交流。企業號具備關注安全、消息無限制等特色,很適合企業內部的環境。本文主要介紹如何利用企業號實現文本、圖片、文件、語音、視頻、圖文消息等消息的發送操做。html
對於企業號,有如下一些特色:api
1)關注更安全安全
–只有企業通信錄的成員才能關注企業號,分級管理員、保密消息等各類特性確保企業內部信息的安全。服務器
企業能夠設置自行驗證關注者身份,進行二次安全驗證,保證企業信息使用和傳遞安全。微信
若員工離職,企業管理員可在通信錄中刪除該成員,該成員即自動取消關注企業號,同時微信中的企業號歷史記錄也會被清除。ide
2)應用可配置post
–企業可自行在企業號中可配置多個服務號,能夠鏈接不一樣的企業應用系統,只有受權的企業成員才能使用相應的服務號。測試
3)消息無限制加密
–發送消息無限制,並提供完善的的管理接口及微信原生能力,以適應企業複雜、個性化的應用場景。url
企業能夠主動發消息給員工,消息量不受限制。
4)使用更便捷
–企業號在微信中有統一的消息入口,用戶能夠更方便地管理企業號消息。微信通信錄也能夠直接訪問企業號中的應用。
目前企業號的內容能夠用下面的分層圖來展現,分別包含素材管理、被動響應消息、通信錄管理、自定義菜單等內容,詳細能夠看下面圖示。
企業號和公衆號同樣,能夠分爲消息處理和事件處理,下面是他們兩種類型的處理操做,也就發送的消息有文本消息、圖片消息、文件消息、視頻消息、語音消息、地理文字消息、圖文和多媒體消息等。
事件處理主要就是關注、取消關注事件,以及菜單click類型和view類型兩種操做,還有就是地理位置上報事件等。
兩種類型的處理圖以下所示。
在企業的管理後臺,和公衆號同樣,能夠看到對應信息交流記錄,包括文字、圖片、地理位置等等,以下所示。
因爲消息分爲幾種類型,包括文本(Text)、圖片(Image)、文件(File)、語音(Voice)、視頻(Video)、圖文消息等(News)、MpNews等。
所以咱們須要分別對它們進行必定的定義和封裝處理,以下是它們的信息對象設計圖。
企業號發送消息的官方定義以下:
企業能夠主動發消息給員工,消息量不受限制。
調用接口時,使用Https協議、JSON數據包格式,數據包不需作加密處理。
目前支持文本、圖片、語音、視頻、文件、圖文等消息類型。除了news類型,其它類型的消息可在發送時加上保密選項,保密消息會被打上水印,而且只有接收者才能閱讀。
咱們以發送的文本消息爲例進行說明,它的定義以下所示。
{ "touser": "UserID1|UserID2|UserID3", "toparty": " PartyID1 | PartyID2 ", "totag": " TagID1 | TagID2 ", "msgtype": "text", "agentid": "1", "text": { "content": "Holiday Request For Pony(http://xxxxx)" }, "safe":"0" }
參數 | 必須 | 說明 |
---|---|---|
touser | 否 | UserID列表(消息接收者,多個接收者用‘|’分隔)。特殊狀況:指定爲@all,則向關注該企業應用的所有成員發送 |
toparty | 否 | PartyID列表,多個接受者用‘|’分隔。當touser爲@all時忽略本參數 |
totag | 否 | TagID列表,多個接受者用‘|’分隔。當touser爲@all時忽略本參數 |
msgtype | 是 | 消息類型,此時固定爲:text |
agentid | 是 | 企業應用的id,整型。可在應用的設置頁面查看 |
content | 是 | 消息內容 |
safe | 否 | 表示是不是保密消息,0表示否,1表示是,默認0 |
其中每種消息都會包含如下消息所示,也就是它們共同的屬性:
touser": "UserID1|UserID2|UserID3", "toparty": " PartyID1 | PartyID2 ", "totag": " TagID1 | TagID2 ", "msgtype": "text", "agentid": "1",
所以咱們能夠定義一個基類用來方便承載這些共同的信息。
/// <summary> /// 企業號發送消息的基礎消息內容 /// </summary> public class CorpSendBase { /// <summary> /// UserID列表(消息接收者,多個接收者用‘|’分隔)。特殊狀況:指定爲@all,則向關注該企業應用的所有成員發送 /// </summary> public string touser { get; set; } /// <summary> /// PartyID列表,多個接受者用‘|’分隔。當touser爲@all時忽略本參數 /// </summary> public string toparty { get; set; } /// <summary> /// TagID列表,多個接受者用‘|’分隔。當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; } }
而後其餘消息逐一繼承這個基類便可,以下所示。
最終會構成下面這個繼承關係圖。
定義好相關的發送對象後,咱們就能夠定義它的統一發送接口了,以下所示。
/// <summary> /// 企業號消息管理接口定義 /// </summary> public interface ICorpMessageApi { /// <summary> /// 發送消息。 /// 須要管理員對應用有使用權限,對收件人touser、toparty、totag有查看權限,不然本次調用失敗。 /// </summary> /// <param name="accessToken"></param> /// <returns></returns> CommonResult SendMessage(string accessToken, CorpSendBase data); }
最終,文本等類型的消息會根據接口定義進行實現,實現代碼以下所示。注意,發送過程不須要調用加密類進行加密。
/// <summary> /// 企業號消息管理實現類 /// </summary> public class CorpMessageApi : ICorpMessageApi { /// <summary> /// 發送消息。 /// 須要管理員對應用有使用權限,對收件人touser、toparty、totag有查看權限,不然本次調用失敗。 /// </summary> /// <param name="accessToken"></param> /// <returns></returns> public CommonResult SendMessage(string accessToken, CorpSendBase data) { CommonResult result = new CommonResult(); string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"; var url = string.Format(urlFormat, accessToken); var postData = data.ToJson(); //數據不用加密發送 CorpSendResult sendResult = CorpJsonHelper<CorpSendResult>.ConvertJson(url, postData); if (sendResult != null) { result.Success = (sendResult.errcode == CorpReturnCode.請求成功); result.ErrorMessage = string.Format("invaliduser:{0},invalidparty:{1},invalidtag:{2}", sendResult.invaliduser, sendResult.invalidparty, sendResult.invalidtag); } return result; } }
定義好相應的發送對象後,咱們就能夠進行統一的消息發送操做,包括文本、圖片、文件、語音等等類型的消息,注意有些消息是須要上傳到服務器上,而後在根據mediaId進行發送出去的。
發送文本和圖片的操做代碼以下所示。
private void btnSendText_Click(object sender, EventArgs e) { //發送文本內容 ICorpMessageApi bll = new CorpMessageApi(); CorpSendText text = new CorpSendText("API 中文測試(http://www.iqidi.com)"); text.touser = "wuhuacong"; text.toparty = "4";//部門ID text.totag = "0"; text.safe = "0"; text.agentid = "0"; CommonResult result = bll.SendMessage(token, text); if (result != null) { Console.WriteLine("發送消息:{0} {1} {2}", text.text.content, (result.Success ? "成功" : "失敗"), result.ErrorMessage); } } private void btnSendImage_Click(object sender, EventArgs e) { btnUpload_Click(sender, e); if (!string.IsNullOrEmpty(image_mediaId)) { //發送圖片內容 ICorpMessageApi bll = new CorpMessageApi(); CorpSendImage image = new CorpSendImage(image_mediaId); CommonResult result = bll.SendMessage(token, image); if (result != null) { Console.WriteLine("發送圖片消息:{0} {1} {2}", image_mediaId, (result.Success ? "成功" : "失敗"), result.ErrorMessage); } } }
最後在微信企業號上截圖效果以下所示,包括了文本測試、文件測試、圖文測試、語音測試均正常。
若是對這個《C#開發微信門戶及應用》系列感興趣,能夠關注個人其餘文章,系列隨筆以下所示:
C#開發微信門戶及應用(23)-微信小店商品管理接口的封裝和測試
C#開發微信門戶及應用(21)-微信企業號的消息和事件的接收處理及解密
C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)
C#開發微信門戶及應用(18)-微信企業號的通信錄管理開發之成員管理
C#開發微信門戶及應用(17)-微信企業號的通信錄管理開發之部門管理
C#開發微信門戶及應用(15)-微信菜單增長掃一掃、發圖片、發地理位置功能
C#開發微信門戶及應用(14)-在微信菜單中採用重定向獲取用戶數據
C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹
C#開發微信門戶及應用(10)--在管理系統中同步微信用戶分組信息