• .NET Core 企业微信消息推送


    接口定义

    应用支持推送文本、图片、视频、文件、图文等类型。

    请求方式: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

  • 相关阅读:
    【2024最新】4000字搞懂sora!一张脑图贯穿!
    JavaSE&Java8 时间日期API + 使用心得
    .NET周报 【6月第2期 2023-06-11】
    LeetCode 1334. 阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法
    Python3 异步编程简介
    go语言 go mod生成
    QT画图功能
    springboot打包笔记
    安全认证框架Shiro入门学习(shiro概述和shiro入门小案例);后续整合SpringBoot,应用程序安全;
    微信小程序开发之路⑥
  • 原文地址:https://www.cnblogs.com/zspwf/p/16241421.html