.NET?Core實(shí)現(xiàn)企業(yè)微信消息推送
接口定義
應(yīng)用支持推送文本、圖片、視頻、文件、圖文等類型。
請(qǐng)求方式:POST(HTTPS)
請(qǐng)求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
參數(shù)說明: ACCESS_TOKEN 必填
- 各個(gè)消息類型的具體POST格式請(qǐng)閱后續(xù)“消息類型”部分。
- 如果有在管理端對(duì)應(yīng)用設(shè)置“在微工作臺(tái)中始終進(jìn)入主頁(yè)”,應(yīng)用在微信端只能接收到文本消息,并且文本消息的長(zhǎng)度限制為20字節(jié),超過20字節(jié)會(huì)被截?cái)唷M瑫r(shí)其他消息類型也會(huì)轉(zhuǎn)換為文本消息,提示用戶到企業(yè)微信查看。
- 支持id轉(zhuǎn)譯,將userid/部門id轉(zhuǎn)成對(duì)應(yīng)的用戶名/部門名,目前僅文本/文本卡片/圖文/圖文(mpnews)/任務(wù)卡片/小程序通知/模版消息/模板卡片消息這八種消息類型的部分字段支持。僅第三方應(yīng)用需要用到,企業(yè)自建應(yīng)用可以忽略。。
- 支持重復(fù)消息檢查,當(dāng)指定 "enable_duplicate_check": 1開啟: 表示在一定時(shí)間間隔內(nèi),同樣內(nèi)容(請(qǐng)求json)的消息,不會(huì)重復(fù)收到;時(shí)間間隔可通過duplicate_check_interval指定,默認(rèn)1800秒。
- 從2021年2月4日開始,企業(yè)關(guān)聯(lián)添加的「小程序」應(yīng)用,也可以發(fā)送文本、圖片、視頻、文件、圖文等各種類型的消息了。
調(diào)用建議:大部分企業(yè)應(yīng)用在每小時(shí)的0分或30分觸發(fā)推送消息,容易造成資源擠占,從而投遞不夠及時(shí),建議盡量避開這兩個(gè)時(shí)間點(diǎn)進(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í)行,但會(huì)返回?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 | 對(duì)返回碼的文本描述內(nèi)容 |
| invaliduser | 不合法的userid,不區(qū)分大小寫,統(tǒng)一轉(zhuǎn)為小寫 |
| invalidparty | 不合法的partyid |
| invalidtag | 不合法的標(biāo)簽id |
| msgid | 消息id,用于撤回應(yīng)用消息 |
| response_code | 僅消息類型為“按鈕交互型”,“投票選擇型”和“多項(xiàng)選擇型”的模板卡片消息返回,應(yīng)用可使用response_code調(diào)用更新模版卡片消息接口,24小時(shí)內(nèi)有效,且只能使用一次 |
消息類型
文本消息
請(qǐng)求示例:
{
"touser" : "UserID1|UserID2|UserID3",
"toparty" : "PartyID1|PartyID2",
"totag" : "TagID1 | TagID2",
"msgtype" : "text",
"agentid" : 1,
"text" : {
"content" : "你的快遞已到,請(qǐng)攜帶工卡前往郵件中心領(lǐng)取。\n出發(fā)前可查看<a href=\"http://work.weixin.qq.com\">郵件中心視頻實(shí)況</a>,聰明避開排隊(duì)。"
},
"safe":0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}參數(shù)說明:
| 參數(shù) | 是否必須 | 說明 |
|---|---|---|
| touser | 否 | 指定接收消息的成員,成員ID列表(多個(gè)接收者用‘|’分隔,最多支持1000個(gè))。 特殊情況:指定為"@all",則向該企業(yè)應(yīng)用的全部成員發(fā)送 |
| toparty | 否 | 指定接收消息的部門,部門ID列表,多個(gè)接收者用‘|’分隔,最多支持100個(gè)。 當(dāng)touser為"@all"時(shí)忽略本參數(shù) |
| totag | 否 | 指定接收消息的標(biāo)簽,標(biāo)簽ID列表,多個(gè)接收者用‘|’分隔,最多支持100個(gè)。 當(dāng)touser為"@all"時(shí)忽略本參數(shù) |
| msgtype | 是 | 消息類型,此時(shí)固定為:text |
| agentid | 是 | 企業(yè)應(yīng)用的id,整型。企業(yè)內(nèi)部開發(fā),可在應(yīng)用的設(shè)置頁(yè)面查看;第三方服務(wù)商,可通過接口 獲取企業(yè)授權(quán)信息 獲取該參數(shù)值 |
| content | 是 | 消息內(nèi)容,最長(zhǎng)不超過2048個(gè)字節(jié),超過將截?cái)?strong>(支持id轉(zhuǎn)譯) |
| safe | 否 | 表示是否是保密消息,0表示可對(duì)外分享,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ù)消息檢查的時(shí)間間隔,默認(rèn)1800s,最大不超過4小時(shí) |
代碼示例
配置Settings
其中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}"
},Startup設(shè)置
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返回實(shí)體
public class GetTokenResult
{
/// <summary>
/// 錯(cuò)誤編號(hào)
/// </summary>
public int errcode { get; set; }
/// <summary>
/// 錯(cuò)誤信息
/// </summary>
public string errmsg { get; set; }
/// <summary>
/// Token
/// </summary>
public string access_token { get; set; }
/// <summary>
/// 過期時(shí)間
/// </summary>
public int expires_in { get; set; }
}推送方法
GlobalContext提供了獲取Token方法,微信推送方法,獲取內(nèi)容序列號(hào)字符串方法。GetContent中agentid 為應(yīng)用id 按實(shí)際情況調(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>
/// 過期時(shí)間
/// </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)造請(qǐng)求鏈接
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失敗,錯(cuò)誤:{ 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)造請(qǐng)求鏈接
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;
}
}
}調(diào)用
string userid = "userid"; var content1 = GlobalContext.GetContent(userid, "推送測(cè)試"); return GlobalContext.WxPush(content1);
截圖

企業(yè)微信文檔鏈接 https://developer.work.weixin.qq.com/document/path/90236
到此這篇關(guān)于.NET Core實(shí)現(xiàn)企業(yè)微信消息推送的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.NET Core系列之MemoryCache 初識(shí)
Cache是一個(gè)絕大多數(shù)項(xiàng)目會(huì)用到的一個(gè)技術(shù),這篇文章主要介紹了.NET Core系列之MemoryCache 初識(shí),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
設(shè)置ASP.NET頁(yè)面的運(yùn)行超時(shí)時(shí)間詳細(xì)到單個(gè)頁(yè)面及站點(diǎn)
這篇文章主要介紹了如何設(shè)置ASP.NET頁(yè)面的運(yùn)行超時(shí)時(shí)間,包括全局超時(shí)時(shí)間、單個(gè)站點(diǎn)超時(shí)時(shí)間、單個(gè)頁(yè)面請(qǐng)求超時(shí)時(shí)間,需要的朋友可以參考下2014-06-06
asp.net Execl的添加,更新操作實(shí)現(xiàn)代碼
asp.net Execl的添加、修改等實(shí)現(xiàn)代碼。2009-02-02
.NET 開源項(xiàng)目Polly的簡(jiǎn)單介紹
今天介紹一個(gè) .NET 開源庫(kù):Polly,它是支持 .NET Core 的,目前在 GitHub 的 Star 數(shù)量已經(jīng)超過 7 千,它是一個(gè)強(qiáng)大且實(shí)用的 .NET 庫(kù)。2021-06-06
asp.net使用原生控件實(shí)現(xiàn)自定義列導(dǎo)出功能的方法
這篇文章主要給大家介紹了關(guān)于asp.net使用原生控件實(shí)現(xiàn)自定義列導(dǎo)出功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
.net 通過URL推送POST數(shù)據(jù)具體實(shí)現(xiàn)
這篇文章主要介紹了.net 通過URL推送POST數(shù)據(jù)具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12
.NET C#創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了.NET C# 創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

