您的位置:首頁 > 教程 > ASP.NET > .NET?Core實現企業微信消息推送

.NET?Core實現企業微信消息推送

2022-06-17 18:00:53 來源:易采站長站 作者:

.NET?Core實現企業微信消息推送

接口定義

應用支持推送文本、圖片、視頻、文件、圖文等類型。
請求方式:POST(HTTPS)2Em站長之家-易采站長站-Easck.Com
請求地址: https://qyapi.weixin.QQ.com/cgi-bin/message/send?access_token=ACCESS_TOKEN2Em站長之家-易采站長站-Easck.Com

參數說明: ACCESS_TOKEN 必填2Em站長之家-易采站長站-Easck.Com

- 各個消息類型的具體POST格式請閱后續“消息類型”部分。2Em站長之家-易采站長站-Easck.Com
- 如果有在管理端對應用設置“在微工作臺中始終進入主頁”,應用在微信端只能接收到文本消息,并且文本消息的長度限制為20字節,超過20字節會被截斷。同時其他消息類型也會轉換為文本消息,提示用戶到企業微信查看。2Em站長之家-易采站長站-Easck.Com
- 支持id轉譯,將userid/部門id轉成對應的用戶名/部門名,目前僅文本/文本卡片/圖文/圖文(mpnews)/任務卡片/小程序通知/模版消息/模板卡片消息這八種消息類型的部分字段支持。僅第三方應用需要用到,企業自建應用可以忽略。。2Em站長之家-易采站長站-Easck.Com
- 支持重復消息檢查,當指定 "enable_duplicate_check": 1開啟: 表示在一定時間間隔內,同樣內容(請求json)的消息,不會重復收到;時間間隔可通過duplicate_check_interval指定,默認1800秒。2Em站長之家-易采站長站-Easck.Com
- 從2021年2月4日開始,企業關聯添加的「小程序」應用,也可以發送文本、圖片、視頻、文件、圖文等各種類型的消息了。2Em站長之家-易采站長站-Easck.Com
調用建議:大部分企業應用在每小時的0分或30分觸發推送消息,容易造成資源擠占,從而投遞不夠及時,建議盡量避開這兩個時間點進行調用。

返回示例:2Em站長之家-易采站長站-Easck.Com

{
  "errcode" : 0,
  "errmsg" : "ok",
  "invaliduser" : "userid1|userid2",
  "invalidparty" : "partyid1|partyid2",
  "invalidtag": "tagid1|tagid2",
  "msgid": "xxxx",
  "response_code": "xyzxyz"
}

如果部分接收人無權限或不存在,發送仍然執行,但會返回無效的部分(即invaliduser或invalidparty或invalidtag),常見的原因是接收人不在應用的可見范圍內。2Em站長之家-易采站長站-Easck.Com
如果全部接收人無權限或不存在,則本次調用返回失敗,errcode為81013。2Em站長之家-易采站長站-Easck.Com
返回包中的userid,不區分大小寫,統一轉為小寫2Em站長之家-易采站長站-Easck.Com

參數說明:2Em站長之家-易采站長站-Easck.Com

參數說明
errcode返回碼
errmsg對返回碼的文本描述內容
invaliduser不合法的userid,不區分大小寫,統一轉為小寫
invalidparty不合法的partyid
invalidtag不合法的標簽id
msgid消息id,用于撤回應用消息
response_code僅消息類型為“按鈕交互型”,“投票選擇型”和“多項選擇型”的模板卡片消息返回,應用可使用response_code調用更新模版卡片消息接口,24小時內有效,且只能使用一次

消息類型

文本消息

請求示例:2Em站長之家-易采站長站-Easck.Com

{
   "touser" : "UserID1|UserID2|UserID3",
   "toparty" : "PartyID1|PartyID2",
   "totag" : "TagID1 | TagID2",
   "msgtype" : "text",
   "agentid" : 1,
   "text" : {
       "content" : "你的快遞已到,請攜帶工卡前往郵件中心領取。\n出發前可查看<a href=\"http://work.weixin.qq.com\">郵件中心視頻實況</a>,聰明避開排隊。"
   },
   "safe":0,
   "enable_id_trans": 0,
   "enable_duplicate_check": 0,
   "duplicate_check_interval": 1800
}

參數說明:2Em站長之家-易采站長站-Easck.Com

參數是否必須說明
touser指定接收消息的成員,成員ID列表(多個接收者用‘|’分隔,最多支持1000個)。2Em站長之家-易采站長站-Easck.Com
特殊情況:指定為"@all",則向該企業應用的全部成員發送
toparty指定接收消息的部門,部門ID列表,多個接收者用‘|’分隔,最多支持100個。2Em站長之家-易采站長站-Easck.Com
當touser為"@all"時忽略本參數
totag指定接收消息的標簽,標簽ID列表,多個接收者用‘|’分隔,最多支持100個。2Em站長之家-易采站長站-Easck.Com
當touser為"@all"時忽略本參數
msgtype消息類型,此時固定為:text
agentid企業應用的id,整型。企業內部開發,可在應用的設置頁面查看;第三方服務商,可通過接口 獲取企業授權信息 獲取該參數值
content消息內容,最長不超過2048個字節,超過將截斷(支持id轉譯)
safe表示是否是保密消息,0表示可對外分享,1表示不能分享且內容顯示水印,默認為0
enable_id_trans表示是否開啟id轉譯,0表示否,1表示是,默認0。僅第三方應用需要用到,企業自建應用可以忽略。
enable_duplicate_check表示是否開啟重復消息檢查,0表示否,1表示是,默認0
duplicate_check_interval表示是否重復消息檢查的時間間隔,默認1800s,最大不超過4小時

代碼示例

配置Settings

其中corpid為企業id  corpsecret為應用的憑證密鑰2Em站長之家-易采站長站-Easck.Com

 "Wx": {
    "Baseurl": "https://qyapi.weixin.qq.com/cgi-bin/",
    "TokenUrl": "gettoken?corpid=xx&corpsecret=xx",
    "PushUrl": "message/send?access_token={0}"
  },

Startup設置

        public void ConfigureServices(IServiceCollection services)
        {
              services.AddHttpClient("WxClient", config =>
              {
                 config.BaseAddress = new Uri(Configuration["Wx:baseurl"]);
                 config.DefaultRequestHeaders.Add("Accept", "application/json");
              });

            GlobalContext.Configuration = Configuration;
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            GlobalContext.HttpClientFactory = app.ApplicationServices.GetService<IHttpClientFactory>();
        }

Token返回實體

    public class GetTokenResult
    {

        /// <summary>
        /// 錯誤編號
        /// </summary>
        public int errcode { get; set; }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        public string errmsg { get; set; }

        /// <summary>
        /// Token
        /// </summary>
        public string access_token { get; set; }

        /// <summary>
        /// 過期時間
        /// </summary>
        public int expires_in { get; set; }
    }

推送方法

GlobalContext提供了獲取Token方法,微信推送方法,獲取內容序列號字符串方法。GetContent中agentid>

using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace TaskScheduling.Wx
{
    public class GlobalContext
    {
        public static IConfiguration Configuration { get; set; }

        public static IHttpClientFactory HttpClientFactory { get; set; }


        /// <summary>
        /// 過期時間
        /// </summary>
        public static DateTime TimeOutDate { get; set; }

        /// <summary>
        /// Token
        /// </summary>
        public static string Token { get; set; }


        /// <summary>
        /// 獲取Token
        /// </summary>
        /// <returns>Item1 Token;Item2 是否成功</returns>
        public static Tuple<string, bool> GetToken()
        {
            //判斷Token是否存在 以及Token是否在有效期內
            if (string.IsNullOrEmpty(Token) || TimeOutDate > DateTime.Now)
            {
                //構造請求鏈接
                var requestBuild = Configuration["Wx:TokenUrl"];
                using (var wxClient = HttpClientFactory.CreateClient("WxClient"))
                {
                    var httpResponse = wxClient.GetAsync(requestBuild).Result;
                    var dynamic = JsonConvert.DeserializeObject<GetTokenResult>(
                                          httpResponse.Content.ReadAsStringAsync().Result
                                          );
                    if (dynamic.errcode == 0)
                    {
                        Token = dynamic.access_token;
                        //過期5分鐘前刷新Token
                        var expires_in = Convert.ToDouble(dynamic.expires_in - 5 * 60);
                        TimeOutDate = DateTime.Now.AddSeconds(expires_in);
                        return Tuple.Create(Token, true);
                    }
                    else
                    {
                        return Tuple.Create($"獲取Token失敗,錯誤:{ dynamic.errmsg}", false);
                    }
                }
            }
            else
            {
                return Tuple.Create(Token, true);
            }
        }

        /// <summary>
        /// 推送MES
        /// </summary>
        /// <returns>Item1 Token;Item2 是否成功</returns>
        public static string WxPush(string content)
        {
            //構造請求鏈接
            var requestBuild = Configuration["Wx:PushUrl"];
            var (token, issuccess) = GetToken();
            if (!issuccess)
                throw new Exception(token);
            requestBuild = string.Format(requestBuild, token);
            //建立HttpClient
            using (var wxClient = HttpClientFactory.CreateClient("WxClient"))
            {
                byte[] data = Encoding.UTF8.GetBytes(content);
                var bytearray = new ByteArrayContent(data);
                var httpResponse = wxClient.PostAsync(requestBuild, bytearray).Result;
                var dynamic = JsonConvert.DeserializeObject<dynamic>(
                                     httpResponse.Content.ReadAsStringAsync().Result
                                     );
                if (dynamic.errcode == 0)
                    return "推送成功!";
                else
                    throw new Exception($"推送失敗,原因:{JsonConvert.SerializeObject(dynamic) }");
            }
        }

        /// <summary>
        /// 獲取發送內容
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="Msg"></param>
        /// <returns></returns>
        public static string GetContent(string userId, string msg)
        {
            var objText = new { content = msg };
            string text = JsonConvert.SerializeObject(objText);
            var obj = new
            {
                touser = userId,
                toparty = "",
                totag = "",
                msgtype = "text",
                agentid = 1000051,//應用id
                text = objText,
                safe = 0,
                enable_id_trans = 0,
                enable_duplicate_check = 0,
                duplicate_check_interval = 1800
            };
            string strJson = JsonConvert.SerializeObject(obj);
            return strJson;
        }
    }
}

調用

string userid = "userid";
var content1 = GlobalContext.GetContent(userid, "推送測試");
return GlobalContext.WxPush(content1);

截圖

2Em站長之家-易采站長站-Easck.Com

 企業微信文檔鏈接 https://developer.work.weixin.qq.com/document/path/902362Em站長之家-易采站長站-Easck.Com

到此這篇關于.NET Core實現企業微信消息推送的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持易采站長站。2Em站長之家-易采站長站-Easck.Com

如有侵權,請聯系QQ:279390809 電話:15144810328

相關文章

  • [Asp.Net Core] 淺談Blazor Server Side

    [Asp.Net Core] 淺談Blazor Server Side

    在2016年, 本人就開始了一個內部項目, 其特點就是用C#構建DOM樹, 然后把DOM同步到瀏覽器中顯示. 并且在一些小工程中使用. 3年下來, 效果很不錯, 但因為是使用C#來構建控件樹, 在沒有特定
    2020-07-01
  • asp.net生成Excel并導出下載五種實現方法

    asp.net生成Excel并導出下載五種實現方法

    方法一 通過GridView(簡評:方法比較簡單,但是只適合生成格式簡單的Excel,且無法保留VBA代碼),頁面無刷新 aspx.cs部分 代碼如下: using System; using System.Collections; using System.Configuration; usi
    2019-05-16
  • Asp.Net Core用NLog記錄日志操作方法

    Asp.Net Core用NLog記錄日志操作方法

    需求 1.日志自動寫入到數據庫、寫入到文件 2.appsettings.json數據庫連接更改后,不需要去改NLog中的連接地址,啟動網站或項目時自動檢測變動然后去更改,以appsettings.json為準,保持同步
    2019-11-19
  • 使用vs2019加.net core 對WeiApi的創建過程詳解

    使用vs2019加.net core 對WeiApi的創建過程詳解

    vs2019創建webapi 1.創建新的項目 2.選擇.NET CORE的ASP .NET CORE WEB應用程序 3.定義項目名稱和存放地點 4.選擇API創建項目 5.刪除原本的無用的類 6.添加新的方法類 7.設置路由 using Microsoft.AspNe
    2020-07-03
  • 教你Asp.net下使用mysql數據庫的步驟

    教你Asp.net下使用mysql數據庫的步驟

    1. 首先需要安裝mysql, 易采站長站下載地址: //www.jb51.net/softs/2193.html 或者去mysql.com官網都可以,一路next,安裝好后,有個簡單配置,提示有個設置登錄密碼和服務名稱, 默認localhost,用
    2019-05-16
  • [Asp.Net Core]用Blazor Server Side實現圖片驗證碼

    [Asp.Net Core]用Blazor Server Side實現圖片驗證碼

    關于Blazor 由于在國內, Blazor一點都不普及, 在閱讀此文前, 建議讀者先翻看我之前寫的隨筆, 了解Blazor Server Side的特點. 在一段時間內, 我會寫一些解說分析型的 "為什么選擇 Blazor Server
    2020-07-01
  • 詳解ASP.NET Razor 語法

    詳解ASP.NET Razor 語法

    Razor 同時支持 C# (C sharp) 和 VB (Visual Basic)。 主要的 Razor C# 語法規則 Razor 代碼塊包含在 @{ ... } 中 內聯表達式(變量和函數)以 @ 開頭 代碼語句用分號結束 變量使用 var 關鍵字聲明 字符
    2020-07-07
  • .Net Core中使用ExceptionFilter過濾器的方法

    .Net Core中使用ExceptionFilter過濾器的方法

    .Net Core中有各種Filter,分別是AuthorizationFilter、ResourceFilter、ExceptionFilter、ActionFilter、ResultFilter??梢园阉麄兛醋魇?Net Core自帶的AOP的擴展封裝。 今天來看其中的一種:ExceptionFilter(用于
    2020-03-03
色七七影院_香港三级台湾三级在线播放_男人放进女人阳道猛进猛出