.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

到此这篇关于.NET Core实现企业微信消息推送的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Asp.Net Core 企业微信静默授权的实现

    企业微信接口文档 1. 构造授权网页链接 2.回调获取到 Code 通过code+access_token去 请求用户信息 3. 获取access_token 调试准备工作 -->内网穿透+域名 推荐向日葵有免费的,免费的开发测试够用了 域名的配置成可信用 上代码 Demo下载 [ApiController] [Route("api/[controller]")] public class Auth2Controller : ControllerBase { private re

  • .NET Core企业微信回调配置

    1.配置API接收 2.下载加密解密库 地址:https://developer.work.weixin.qq.com/devtool/introduce?id=36388,也可以复制下面的代码 2.1 WXBizMsgCrypt.cs 该方法封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url,收到用户回复消息的解密以及开发者回复消息的加密过程. using System; using System.Collections.Generi

  • .NET Core企业微信网页授权登录的实现

    目录 1.开发前准备 参数获取 2.企业微信OAuth2接入流程 3.构造网页授权链接 4. 调用代码部分 4.1 appsettings配置 4.2 配置IHttpClientFactory调用微信客户端 4.3 类准备 4.4方法准备 4.5调用 5.截图 1.开发前准备 参数获取 corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID” secret secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问

  • 解决.NET Core企业微信openapi回调地址请求不通过的问题

    1.问题截图 2.测试回调模式成功 测试回调模式地址https://open.work.weixin.qq.com/wwopen/devtool/interface/combine,建立连接 =>  测试回调模式 3.解决 测试回调成功,但是发现返回结果带了引号,可能是导致回调不成功原因.下面代码为错误示范. [HttpGet, Route("callback/interAspect")] public IActionResult ReveiceMsg(string msg_si

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

    接口定义 应用支持推送文本.图片.视频.文件.图文等类型.请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN 参数说明: ACCESS_TOKEN 必填 - 各个消息类型的具体POST格式请阅后续“消息类型”部分.- 如果有在管理端对应用设置“在微工作台中始终进入主页”,应用在微信端只能接收到文本消息,并且文本消息的长度限制为20字节,超过20字节会被截断

  • Java实现企业微信消息推送功能的详细步骤

    第一步:申请企业微信注册企业(链接:https://work.weixin.qq.com/nl/sem/registe?s=c&from=1011017189&bd_vid=11628667012427618020) 第二步:登录自己的企业微信找到应用管理———>添加应用 第三步:获取到应用的AgentId.Secret.企业id 第四步,准备代码编写: model层代码: package com.toone.itop.formula.function.inte.model; /**

  • 13行python代码实现对微信进行推送消息的示例代码

    目录 单人推送 一对多推送 Python可以实现给QQ邮箱.企业微信.微信等等软件推送消息,今天咱们实现一下Python直接给微信推送消息. 这里咱们使用了一个第三方工具pushplus 单人推送 实现步骤: 1.用微信注册一个此网站的账号2.将token复制出来,记录到小本本上. 代码展示 import requests def send_wechat(msg): token = 'XXXXXXXXXXXX'#前边复制到那个token title = 'title1' content = ms

  • 微信开发 消息推送实现代码

    最近做微信公共号的开发,有个需求是这样的消息推送,以文本的形式把编辑的消息发送给微信企业号中的某一个应用组,这里做下笔记,以下是整理内容: //定义数据模型 public class Access_token { public Access_token() { // // TODO: 在此处添加构造函数逻辑 // } string _access_token; string _expires_in; /// /// 获取到的凭证 /// public string access_token {

  • Python编程实现微信企业号文本消息推送功能示例

    本文实例讲述了Python微信企业号文本消息推送功能.分享给大家供大家参考,具体如下: 企业号的创建.企业号应用的创建.组.tag.part就不赘述了,一搜一大堆,但是网上拿的那些个脚本好多都不好使,所以自己修了一个 坦率的讲,这个脚本是用来作为zabbix的通知媒介脚本的,本人是个菜鸟,如果哪里不对,大神们不要笑话,python也处于学习阶段,如果有哪些地方不合理,很希望可以不吝赐教,废话不多说,脚本奉上: #!/usr/bin/python # _*_coding:utf-8 _*_ imp

  • 微信小程序 消息推送php服务器验证实例详解

    微信小程序 消息推送php服务器验证实例详解 微信文档(靠下有个"接入指引"):https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/callback_help.html 设置页面("设置">>"开发设置"): https://mp.weixin.qq.com/wxopen/initprofile?action=home&lang=zh_CN 1.设置服务器域名 比如:

  • php实现微信模板消息推送

    本文实例为大家分享了php微信模板消息推送的具体代码,供大家参考,具体内容如下 1.微信公众号模板消息配置 2.PHP代码 /** * 发送模板消息 */ public function send_notice(){ //获取access_token if ($_COOKIE['access_token']){ $access_token2=$_COOKIE['access_token']; }else{ $json_token=$this>curl_post("https://api.w

  • 微信小程序开发实现消息推送

    微信小程序的消息推送简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,可以链接进入到小程序的指定页面. 微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单.支付成功.一次只能发一条,当然可以通过某种方法发送多条,小的就不在这里赘述了.下面就介绍一下如何推送消息. 一.准备工作 首先,在微信公众平台开通消息推送功能,并添加消息模板.可以从模板库选择模板也可以创建一个模板,模板添加之后,模板ID我们接下来要用的. 发送模板消息需要用到accesstoken.formId

  • Android采用消息推送实现类似微信视频接听

    本文实例为大家分享了Android实现类似微信视频接听的具体代码,供大家参考,具体内容如下 1.背景需求:业务需要接入视频审核功能,在PC 端发起视频通话,移动端显示通话界面点击接听后进行1对1视频通话. 2.解决方案:因为项目没有IM功能.只集成了极光消息推送(极光消息推送接入参考官方文档,经过跟需求沟通,采用消息推送调起通话接听界面.再集成腾讯实时音视频SDK(具体集成方式参考官方文档).最终实现类似微信1对1通话功能. 3.技术实现: A:编写一个广播接收器,并且在 AndroidMani

  • node.js微信小程序配置消息推送的实现

    在开发微信小程序时,有一个消息推送,它的解释是这样的. 消息推送具体的内容是下面的这个网址   https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push.html,他介绍的也还可以,就是我这里换成了node代码. 消息推送 启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 在微信小程序的首页开发里面,开发设置中,微信的官网中,

随机推荐