介面定義
應用支援推送文字、圖片、視訊、檔案、圖文等型別。
請求方式:POST(HTTPS)
請求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
引數說明: ACCESS_TOKEN 必填
- 各個訊息型別的具體POST格式請閱後續“訊息型別”部分。
- 如果有在管理端對應用設定“在微工作臺中始終進入主頁”,應用在微信端只能接收到文字訊息,並且文字訊息的長度限制為20位元組,超過20位元組會被截斷。同時其他訊息型別也會轉換為文字訊息,提示使用者到企業微信檢視。
- 支援id轉譯,將userid/部門id轉成對應的使用者名稱/部門名,目前僅文字/文字卡片/圖文/圖文(mpnews)/任務卡片/小程式通知/模版訊息/模板卡片訊息這八種訊息型別的部分欄位支援。僅第三方應用需要用到,企業自建應用可以忽略。。
- 支援重複訊息檢查,當指定"enable_duplicate_check": 1
開啟: 表示在一定時間間隔內,同樣內容(請求json)的訊息,不會重複收到;時間間隔可通過duplicate_check_interval
指定,預設1800秒
。
- 從2021年2月4日開始,企業關聯新增的「小程式」應用,也可以傳送文字、圖片、視訊、檔案、圖文等各種型別的訊息了。
呼叫建議:大部分企業應用在每小時的0分或30分觸發推送訊息,容易造成資源擠佔,從而投遞不夠及時,建議儘量避開這兩個時間點進行呼叫。
返回示例:
{
"errcode" : 0,
"errmsg" : "ok",
"invaliduser" : "userid1|userid2",
"invalidparty" : "partyid1|partyid2",
"invalidtag": "tagid1|tagid2",
"msgid": "xxxx",
"response_code": "xyzxyz"
}
如果部分接收人無許可權或不存在,傳送仍然執行,但會返回無效的部分(即invaliduser或invalidparty或invalidtag),常見的原因是接收人不在應用的可見範圍內。
如果全部接收人無許可權或不存在,則本次呼叫返回失敗,errcode為81013。
返回包中的userid,不區分大小寫,統一轉為小寫
引數說明:
引數 | 說明 |
---|---|
errcode | 返回碼 |
errmsg | 對返回碼的文字描述內容 |
invaliduser | 不合法的userid,不區分大小寫,統一轉為小寫 |
invalidparty | 不合法的partyid |
invalidtag | 不合法的標籤id |
msgid | 訊息id,用於撤回應用訊息 |
response_code | 僅訊息型別為“按鈕互動型”,“投票選擇型”和“多項選擇型”的模板卡片訊息返回,應用可使用response_code呼叫更新模版卡片訊息介面,24小時內有效,且只能使用一次 |
訊息型別
文字訊息
請求示例:
{
"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
}
引數說明:
引數 | 是否必須 | 說明 |
---|---|---|
touser | 否 | 指定接收訊息的成員,成員ID列表(多個接收者用‘|’分隔,最多支援1000個)。 特殊情況:指定為"@all",則向該企業應用的全部成員傳送 |
toparty | 否 | 指定接收訊息的部門,部門ID列表,多個接收者用‘|’分隔,最多支援100個。 當touser為"@all"時忽略本引數 |
totag | 否 | 指定接收訊息的標籤,標籤ID列表,多個接收者用‘|’分隔,最多支援100個。 當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為應用的憑證金鑰
"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 為應用id 按實際情況調整。
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);
截圖
企業微信文件連結 https://developer.work.weixin.qq.com/document/path/90236