1. 程式人生 > >企業微信發送應用消息的實現

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

www () 基礎 ddb 參考 comm 展示 不同 dba

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

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