C#企业微信 接收事件服务器(添加外部联系人事件)#openapi回调地址请求不通过# 完整源代码

2023-11-15

#设置接收事件服务器
#openapi回调地址请求不通过?
#企业微信api
#添加外部联系人事件
返回结果: 文本有双引号, 回调URL添加时就会出现下面
在这里插入图片描述

using System.Web.UI.WebControls;
using System.IO;
using System.Text;

using System.Data;
using System.Xml.Serialization;
using System.Xml;
using System.Net.Http;

namespace WebApi2
{
    public class TestController : ApiController
    {
        //公司
        string sCorpID = "*********************";
        string sToken = "***************************";
        string sEncodingAESKey = "*************************";

        public HttpResponseMessage Get() 
        {
                HttpContext context = System.Web.HttpContext.Current;
                context.Response.ContentType = "text/plain; charset=utf-8"; //
                context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                //context.Response.Headers.Add("Content-type", "text/html; charset=utf-8");///html
                context.Response.StatusCode = 200;
                using (var reader = new System.IO.StreamReader(context.Request.InputStream))
                {
                    String xmlData = reader.ReadToEnd();
                    //string Url = System.Web.HttpUtility.UrlDecode(context.Request.Url.ToString());
                    string Url = context.Request.Url.ToString();
                    if (Url != "") Url = Url.Split('?')[1];

                    string param = string.Empty;
                    if (!string.IsNullOrEmpty(Url))
                    {
                        string msg_signature = "";
                        string timestamp = "";
                        string nonce = "";
                        string echostr = xmlData; //密文


                        List<string> para = new List<string>(Url.Split('&'));
                        foreach (var item in para)
                        {
                            if (item.Contains("="))
                            {
                                string[] dic = item.Split('=');
                                if (dic[0] == "msg_signature")
                                {
                                    msg_signature = dic[1];
                                }
                                if (dic[0] == "timestamp")
                                {
                                    timestamp = dic[1];
                                }
                                if (dic[0] == "nonce")
                                {
                                    nonce = dic[1];
                                }
                                if (dic[0] == "echostr")
                                {
                                    echostr = dic[1];
                                }
                            }
                        }

                        if (para.Count == 0)
                        {
                            //return;
                        }

                        Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);

                        string sVerifyMsgSig = msg_signature;

                        string sVerifyTimeStamp = timestamp;

                        string sVerifyNonce = nonce;

                        string sVerifyEchoStr = echostr + "==";// 
                        int ret = 0;
                        string sEchoStr = "";
                        //wxcpt.VerifyURL 可以在企业微信api官网上下载到已经封装好的 
                        // https://developer.work.weixin.qq.com/devtool/introduce?id=10128
                        ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr);
                        if (ret != 0)
                        {
                            System.Console.WriteLine("ERR: VerifyURL fail, ret: " + ret);

                            HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent("校验失败!", Encoding.GetEncoding("UTF-8"), "text/plain") };
                            return responseMessage;
                        }
                        else
                        {
                            //写入数据库
                            if (执行事务操作(sEchoStr))
                            {

                            }
                            else
                            {

                            }
                            //去掉回传字符串的 双引号
                            HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(sEchoStr, Encoding.GetEncoding("UTF-8"), "text/plain") };
                            return responseMessage;
                        }

                        //
                        /*
                        POST
                        正确响应本次请求
                        · 企业微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
                        · 当接收成功后,http头部返回200表示接收ok,其他错误码企业微信后台会一律当做失败并发起重试

                         回复
                         * 
                         * 步骤4中,不同的业务回调要求返回不同内容。比如回复空串,或者特定字符串(如success),
                         * 以及上一步构造的加密被动回复消息。具体要求在各个回调业务文档会有说明。

                        GET
                        在1秒内响应GET请求,响应内容为上一步得到的明文消息内容(不能加引号,不能带bom头,不能带换行符)
                            
                        */
                    }
                }
                HttpResponseMessage Result = new HttpResponseMessage { Content = new StringContent("要返回的明文", Encoding.GetEncoding("UTF-8"), "text/plain") };

                return Result;
        }

企业微信官方
(2018年10月11日更新,点击下载)
注意事项:
Cryptography.cs文件封装了AES加解密过程,用户无须关心具体实现。WXBizMsgCrypt.cs文件提供了用户接入企业微信的三个接口,Sample.cs文件提供了如何使用这三个接口的示例。
WXBizMsgCrypt.cs封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证接收消息的url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.cs文件。
下载地址
https://developer.work.weixin.qq.com/devtool/introduce?id=10128
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#企业微信 接收事件服务器(添加外部联系人事件)#openapi回调地址请求不通过# 完整源代码 的相关文章

  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 如何在c中断言两个类型相等?

    在 C 中如何断言两种类型相等 在 C 中 我会使用 std is same 但搜索 StackOverflow 和其他地方似乎只能给出 C 和 C 的结果 在C中没有办法做到这一点吗 请注意 这不是询问变量是否具有某种类型 而是询问两个类
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐