您好,登錄后才能下訂單哦!
這篇文章主要介紹了.NET Core如何實現(xiàn)企業(yè)微信消息推送的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇.NET Core如何實現(xiàn)企業(yè)微信消息推送文章都會有所收獲,下面我們一起來看看吧。
應(yīng)用支持推送文本、圖片、視頻、文件、圖文等類型。
請求方式:POST(HTTPS)
參數(shù)說明: ACCESS_TOKEN 必填
- 各個消息類型的具體POST格式請閱后續(xù)“消息類型”部分。
- 如果有在管理端對應(yīng)用設(shè)置“在微工作臺中始終進(jìn)入主頁”,應(yīng)用在微信端只能接收到文本消息,并且文本消息的長度限制為20字節(jié),超過20字節(jié)會被截斷。同時其他消息類型也會轉(zhuǎn)換為文本消息,提示用戶到企業(yè)微信查看。
- 支持id轉(zhuǎn)譯,將userid/部門id轉(zhuǎn)成對應(yīng)的用戶名/部門名,目前僅文本/文本卡片/圖文/圖文(mpnews)/任務(wù)卡片/小程序通知/模版消息/模板卡片消息這八種消息類型的部分字段支持。僅第三方應(yīng)用需要用到,企業(yè)自建應(yīng)用可以忽略。。
- 支持重復(fù)消息檢查,當(dāng)指定"enable_duplicate_check": 1
開啟: 表示在一定時間間隔內(nèi),同樣內(nèi)容(請求json)的消息,不會重復(fù)收到;時間間隔可通過duplicate_check_interval
指定,默認(rèn)1800秒
。
- 從2021年2月4日開始,企業(yè)關(guān)聯(lián)添加的「小程序」應(yīng)用,也可以發(fā)送文本、圖片、視頻、文件、圖文等各種類型的消息了。
調(diào)用建議:大部分企業(yè)應(yīng)用在每小時的0分或30分觸發(fā)推送消息,容易造成資源擠占,從而投遞不夠及時,建議盡量避開這兩個時間點進(jìn)行調(diào)用。
返回示例:
{ "errcode" : 0, "errmsg" : "ok", "invaliduser" : "userid1|userid2", "invalidparty" : "partyid1|partyid2", "invalidtag": "tagid1|tagid2", "msgid": "xxxx", "response_code": "xyzxyz" }
如果部分接收人無權(quán)限或不存在,發(fā)送仍然執(zhí)行,但會返回?zé)o效的部分(即invaliduser或invalidparty或invalidtag),常見的原因是接收人不在應(yīng)用的可見范圍內(nèi)。
如果全部接收人無權(quán)限或不存在,則本次調(diào)用返回失敗,errcode為81013。
返回包中的userid,不區(qū)分大小寫,統(tǒng)一轉(zhuǎn)為小寫
參數(shù)說明:
參數(shù) | 說明 |
---|---|
errcode | 返回碼 |
errmsg | 對返回碼的文本描述內(nèi)容 |
invaliduser | 不合法的userid,不區(qū)分大小寫,統(tǒng)一轉(zhuǎn)為小寫 |
invalidparty | 不合法的partyid |
invalidtag | 不合法的標(biāo)簽id |
msgid | 消息id,用于撤回應(yīng)用消息 |
response_code | 僅消息類型為“按鈕交互型”,“投票選擇型”和“多項選擇型”的模板卡片消息返回,應(yīng)用可使用response_code調(diào)用更新模版卡片消息接口,24小時內(nèi)有效,且只能使用一次 |
請求示例:
{ "touser" : "UserID1|UserID2|UserID3", "toparty" : "PartyID1|PartyID2", "totag" : "TagID1 | TagID2", "msgtype" : "text", "agentid" : 1, "text" : { "content" : "你的快遞已到,請攜帶工卡前往郵件中心領(lǐng)取。\n出發(fā)前可查看<a href=\"http://work.weixin.qq.com\">郵件中心視頻實況</a>,聰明避開排隊。" }, "safe":0, "enable_id_trans": 0, "enable_duplicate_check": 0, "duplicate_check_interval": 1800 }
參數(shù)說明:
參數(shù) | 是否必須 | 說明 |
---|---|---|
touser | 否 | 指定接收消息的成員,成員ID列表(多個接收者用‘|’分隔,最多支持1000個)。 特殊情況:指定為"@all",則向該企業(yè)應(yīng)用的全部成員發(fā)送 |
toparty | 否 | 指定接收消息的部門,部門ID列表,多個接收者用‘|’分隔,最多支持100個。 當(dāng)touser為"@all"時忽略本參數(shù) |
totag | 否 | 指定接收消息的標(biāo)簽,標(biāo)簽ID列表,多個接收者用‘|’分隔,最多支持100個。 當(dāng)touser為"@all"時忽略本參數(shù) |
msgtype | 是 | 消息類型,此時固定為:text |
agentid | 是 | 企業(yè)應(yīng)用的id,整型。企業(yè)內(nèi)部開發(fā),可在應(yīng)用的設(shè)置頁面查看;第三方服務(wù)商,可通過接口 獲取企業(yè)授權(quán)信息 獲取該參數(shù)值 |
content | 是 | 消息內(nèi)容,最長不超過2048個字節(jié),超過將截斷(支持id轉(zhuǎn)譯) |
safe | 否 | 表示是否是保密消息,0表示可對外分享,1表示不能分享且內(nèi)容顯示水印,默認(rèn)為0 |
enable_id_trans | 否 | 表示是否開啟id轉(zhuǎn)譯,0表示否,1表示是,默認(rèn)0。僅第三方應(yīng)用需要用到,企業(yè)自建應(yīng)用可以忽略。 |
enable_duplicate_check | 否 | 表示是否開啟重復(fù)消息檢查,0表示否,1表示是,默認(rèn)0 |
duplicate_check_interval | 否 | 表示是否重復(fù)消息檢查的時間間隔,默認(rèn)1800s,最大不超過4小時 |
其中corpid為企業(yè)id corpsecret為應(yīng)用的憑證密鑰
"Wx": { "Baseurl": "https://qyapi.weixin.qq.com/cgi-bin/", "TokenUrl": "gettoken?corpid=xx&corpsecret=xx", "PushUrl": "message/send?access_token={0}" },
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>(); }
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方法,微信推送方法,獲取內(nèi)容序列號字符串方法。GetContent中agentid 為應(yīng)用id 按實際情況調(diào)整。
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是否在有效期內(nèi) if (string.IsNullOrEmpty(Token) || TimeOutDate > DateTime.Now) { //構(gòu)造請求鏈接 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) { //構(gòu)造請求鏈接 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> /// 獲取發(fā)送內(nèi)容 /// </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,//應(yīng)用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);
關(guān)于“.NET Core如何實現(xiàn)企業(yè)微信消息推送”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“.NET Core如何實現(xiàn)企業(yè)微信消息推送”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。