企業微信發送應用消息的實現

来源:https://www.cnblogs.com/wuhuacong/archive/2019/02/26/10436422.html
-Advertisement-
Play Games

企業號升級到企業微信後,發送應用消息的介面也變化了不少,除了原來的文本、圖片、文件、語音、視頻、圖文消息等消息外,增加了文本卡片、markdown消息、小程式通知消息等內容,不過它們都可以共用一個介面進行發送,只是它們的對象不太一樣,本篇隨筆主要介紹整個企業微信應用消息處理這部分內容,包括不同消息的... ...


企業號升級到企業微信後,發送應用消息的介面也變化了不少,除了原來的文本、圖片、文件、語音、視頻、圖文消息等消息外,增加了文本卡片、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);
            }
        }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用過代碼生成器的開發人員應該知道,通過代碼生成器生成項目的代碼,可以大大的減少重覆編碼的時間,提供項目開發的效率,將自己從繁雜重覆的代碼中解放出來。現在網路上也有很多的開源的代碼生成器或者使用比較廣泛的代碼生成器,如動軟代碼生成器相信不少開發人員使用過。有時候線上的代碼生成器生成的代碼未必百分之百 ...
  • 首先 在 EntityFrameworkCore中安裝 Microsoft.Extensions.Logging.Console 按照官方文檔 使用UseLoggerFactory 方法 (地址:https://docs.microsoft.com/zh-cn/ef/core/miscellaneo ...
  • <img src="../../img/20190224185111.png" alt="" id="zhaopian"/> //定義變數 var img = ""; //圖片點擊 $("#zhaopian").click(function () { //賦值獲取圖片路徑 img = $(this) ...
  • 一、迭代器(Iterator)通過持有迭代狀態可以獲取當前迭代元素並且識別下一個需要迭代的元素,從而可以遍歷集合中每一個元素而不用瞭解集合的具體實現方式; 實現迭代器功能的方法被稱為迭代器方法,迭代器方法的返回值類型可以是以下4種介面類型中任意一種:位於命名空間System.Collections中 ...
  • 多線程 概述 單任務處理:一個任務完成後才能進行下一個任務。 多任務處理:CPU分時操作,每個任務看似同時運行。 進程 應用程式的一個運行實例,包含程式所需資源的記憶體區域,是操作系統進行資源分配的單元,進程隔離了正在執行的不同程式。(打開某一個軟體,分配CPU,隔離其他軟體) 優點:進程間相互獨立, ...
  • Taurus.MVC是一個優秀的組件,如果要應用到已有的Asp.net MVC項目中,需要修改一下。 ...
  • 1、下載並安裝jdk. 下載地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 點擊Accept,根據PC配置下載32位或64位的jdk 2、配置Java環境變數 右鍵” 計算 ...
  • 一.查詢的工作原理 Entity Framework Core 使用語言集成查詢 (LINQ) 來查詢資料庫中的數據。 通過 LINQ 可使用 C#(或你選擇的其他 .NET 語言)基於派生上下文和實體類編寫強類型查詢。 LINQ 查詢的表示形式會傳遞給資料庫提供程式,進而轉換為特定的資料庫查詢語言 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...