.NET Core 企业微信消息推送

dotNET全栈开发

共 16543字,需浏览 34分钟

 ·

2022-06-24 14:43



接口定义

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

请求方式: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,不区分大小写,统一转为小写

参数说明:


消息类型


文本消息


请求示例:

{
   "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
}

参数说明:

码示例

配置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 { getset; }

    /// <summary>
    /// 错误信息
    /// </summary>
    public string errmsg { getset; }

    /// <summary>
    /// Token
    /// </summary>
    public string access_token { getset; }

    /// <summary>
    /// 过期时间
    /// </summary>
    public int expires_in { getset; }
}

推送方法

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 { getset; }

        public static IHttpClientFactory HttpClientFactory { getset; }


        /// <summary>
        /// 过期时间
        /// </summary>
        public static DateTime TimeOutDate { getset; }

        /// <summary>
        /// Token
        /// </summary>
        public static string Token { getset; }


        /// <summary>
        /// 获取Token
        /// </summary>
        /// <returns>Item1 Token;Item2 是否成功</returns>
        public static Tuple<stringboolGetToken()
        {
            //判断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

转自:微风吹过~ 

链接:cnblogs.com/zspwf/p/16241421.html

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报