企业号回调模式php,.net开发微信企业号之回调模式触发功能

2023-11-13

1 首先服务器跟域名指向的80端口必须不能缺少。

2 然后在企业号后台配置里选择回调模式,选择回调模式时候需要配置域名。这时候就跟我们的代码相关了,这一次的配置,对于服务器来说,属于get的请求,我们要在服务器上面写上get请求的方法,以及返回值,如果通过,则配置成功,否则无法往下面开发。

贴上代码:#region 回调模式下发送任务

public static void ProcessRequest()

{

Logger.Info(HttpContext.Current.Request.HttpMethod.ToUpper());

if (HttpContext.Current.Request.HttpMethod.ToUpper() == "GET")

{

GetInitsetInfo();

}

else if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")

{

EvenClick();

}

}

public static PipelineCountForWebchat GetTaskCountForWebchat(int PositionID, String EID)

{

var context = HttpContext.Current;

string url = string.Format("{0}Api/Pipeline/GetTaskCountForWebchat?PositionID={1}&EID={2}", ConfigurationManager.AppSettings["WebAPI"], PositionID, EID);

PipelineCountForWebchat wxMsg = ApiProxy.Call(url, "GET", null, null);

context.Session.Timeout = 24 * 60;

return wxMsg;

}

public static void EvenClick()

{

Logger.Info("Post数据");

string echoString = HttpContext.Current.Request.QueryString["echoStr"];

string sReqMsgSig = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature

string sReqTimeStamp = HttpContext.Current.Request.QueryString["timestamp"];

string sReqNonce = HttpContext.Current.Request.QueryString["nonce"];

Logger.Info("signature=" + sReqMsgSig);

Logger.Info("echoString=" + echoString);

Logger.Info("timestamp=" + sReqTimeStamp);

Logger.Info("nonce=" + sReqNonce);

//读取发过来的信息到inputXml变量中

Stream sin = HttpContext.Current.Request.InputStream;

if (sin.Length == 0)

{

HttpContext.Current.Response.ContentType = "text/xml";

HttpContext.Current.Response.Write("error");

return;

}

byte[] readBytes;

readBytes = new byte[sin.Length];

sin.Read(readBytes, 0, readBytes.Length);

string inputXml = Encoding.UTF8.GetString(readBytes);

Logger.Info("input xml:{0}" + inputXml);

Logger.Info("1");

//使用XMLDocument加载信息结构

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(inputXml);

Logger.Info("2");

string sMsg = ""; //解析之后的明文

Logger.Info("3");

WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);

Logger.Info("4");

int ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, inputXml, ref sMsg);

Logger.Info(ret.ToString());

if (ret != 0)

{

Logger.Info("ERR: Decrypt fail, ret: " + ret);

return;

}

Logger.Info("解析后数据: " + sMsg);

XmlDocument _nxmlDoc = new XmlDocument();

_nxmlDoc.LoadXml(sMsg);

//把传过来的XML数据各个字段区分出来,并且填到fields这个字典变量中去

Dictionary fields = new Dictionary();

Logger.Info("Xml里的数据有多少个 " + _nxmlDoc.SelectSingleNode("/xml").ChildNodes.Count);

foreach (XmlNode x in _nxmlDoc.SelectSingleNode("/xml").ChildNodes)

{

Logger.Info(x.Name + "*****" + x.InnerText);

fields.Add(x.Name, x.InnerText);

}

// 发送方帐号(open_id)

String fromUserName = fields["FromUserName"];

// 公众帐号

String toUserName = fields["ToUserName"];

// 消息类型

String msgType = fields["MsgType"];

//事件类型

String Event = fields["Event"];

//消息Key

String EventKey = fields["EventKey"];

Logger.Info("用户开始登陆" + fromUserName);

McdPMTContext.GetLoginUserByEmportId(fromUserName);

String Content = "";

Logger.Info("登陆成功继续执行");

//string host = HttpContext.Current.Request.Url.Host;

//string path = HttpContext.Current.Request.Path;

//string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);

string redirect_uri = "http://pmtstg02.mcd.com.cn";

switch (EventKey)

{

case "Task":

if (McdPMTContext.CurrentUser != null)

{

PipelineCountForWebchat Wxmsg = McdPMTContext.GetTaskCountForWebchat(McdPMTContext.CurrentUser.PositionID, McdPMTContext.CurrentUser.EID);

Content = @"

";

//发送消息

SendTextReplyMessage(fromUserName, toUserName, Content);

}

else

{

Content = "您的账号不在我们的服务内,请联系管理员进行设置";

SendTextReplyMessage(fromUserName, toUserName, Content);

}

// String Content = @"

//

//

//

//

//

//

//

//

//

//

// ";

// SendTextReplyMessage(fromUserName, toUserName, Content);

break;

default:

Logger.Info("开始跳转到OnAir页面" + EventKey);

break;

}

}

///

/// 获取基本配置信息

///

public static void GetInitsetInfo()

{

string echoString = HttpContext.Current.Request.QueryString["echoStr"];

string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature

string timestamp = HttpContext.Current.Request.QueryString["timestamp"];

string nonce = HttpContext.Current.Request.QueryString["nonce"];

string sPostData = HttpContext.Current.Request.QueryString["sPostData"];

string sMsg = HttpContext.Current.Request.QueryString["sMsg"];

Logger.Info("signature=" + signature);

Logger.Info("echoString=" + echoString);

Logger.Info("timestamp=" + timestamp);

Logger.Info("nonce=" + nonce);

Logger.Info("sPostData=" + sPostData);

Logger.Info("sMsg=" + sMsg);

Logger.Info("以下是配置信息");

Logger.Info("token=" + token);

Logger.Info("encodingAESKey=" + encodingAESKey);

Logger.Info("corpId=" + corpId);

string decryptEchoString = "";

if (CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))

{

if (!string.IsNullOrEmpty(decryptEchoString))

{

HttpContext.Current.Response.Write(decryptEchoString);

HttpContext.Current.Response.End();

}

}

}

public static bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)

{

WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);

int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);

if (result != 0)

{

Logger.Error("ERR: VerifyURL fail, ret: " + result);

return false;

}

return true;

//ret==0表示验证成功,retEchostr参数表示明文,用户需要将retEchostr作为get请求的返回参数,返回给企业号。

// HttpUtils.SetResponse(retEchostr);

}

//当前语言

public static String Language

{

get

{

return CultureInfo.CurrentCulture.Name;

}

}

#region 新的方法

//发送被动响应文本消息:

///

/// 发送被动响应文本消息,需要先加密在发送

///

/// 发送方

/// 接收方

/// 文本内容

public static void SendTextReplyMessage(string fromUserName, string toUserName, string content)

{

DateTime newTime = Convert.ToDateTime(DateTime.Now.ToLocalTime().ToString());

long strTime = newTime.Ticks;

TextReplyMessage msg = new TextReplyMessage()

{

CreateTime = strTime,

FromUserName = fromUserName,

ToUserName = toUserName,

Content = content

};

/* LogInfo.Info("发送信息2sMsg=" + content);//也可以使用微信的接口发送消息

TextMsg data = new TextMsg(content);

data.agentid = "7";

data.safe = "0";

// data.toparty = "@all";

// data.totag = "@all";

data.touser = toUserName;

BLLMsg.SendMessage(data);*/

WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);

string msg_signature = HttpContext.Current.Request.QueryString["msg_signature"];

string timestamp = HttpContext.Current.Request.QueryString["timestamp"];

string nonce = HttpContext.Current.Request.QueryString["nonce"];

string encryptResponse = "";//加密后的文字

string sMsg = msg.ToXmlString();//加密前的文字

int isok = wxcpt.EncryptMsg(sMsg, timestamp, nonce, ref encryptResponse);//

Logger.Info("发送信息sMsg=" + sMsg);

if (isok == 0 && !string.IsNullOrEmpty(encryptResponse))

{

HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

HttpContext.Current.Response.Write(encryptResponse);//被动相应消息不需要调用微信接口

}

else

{

Logger.Info("发送信息失败isok=" + isok);

}

}

//被动响应消息实体

///

/// 被动响应消息类

///

public abstract class ReplyMessage

{

public string ToUserName { get; set; }

public string FromUserName { get; set; }

public long CreateTime { get; set; }

///

/// 将对象转化为Xml消息

///

///

public abstract string ToXmlString();

}

///

/// 被动响应文本消息

///

public class TextReplyMessage : ReplyMessage

{

///

/// 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

///

public string Content { get; set; }

///

/// 将对象转化为Xml消息

///

///

public override string ToXmlString()

{

string s = @"

{2}

4

{4}

";

s = string.Format(s,

ToUserName ?? string.Empty,

FromUserName ?? string.Empty,

CreateTime.ToString(),

"news",

Content ?? string.Empty

);

return s;

}

}

#endregion

#endregion

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

企业号回调模式php,.net开发微信企业号之回调模式触发功能 的相关文章

  • AXI smartconnect

    AXI smartconnect 简介 AXI smartconnect 是为了一个或多个主机通过AXI总线和一个或多个从机进行数据读写而用的 此前常用的应该是AXI interconnect这个IP 实质上smartconnect是int
  • [无线]433M天线、2.4G天线、5G天线长度设计

    无线 无线传输距离预估计算 我们回顾一下 天线最佳长度为波长的1 4 波长 波速 频率 波速 光速 3 100000000 一段金属导线中的交变电流能够向空间发射交替变化的感应电场和感应磁场 这就是无线电信号的发射 相反 空间中交变的电磁场
  • 关于==和equals的深入了解

    关于 和equals的深入了解 比较的是地址 这里指的是对象的比较 如果是基本数据类型 则比较的是值 未被重写的equals比较也是地址 因为调用的是Object的equals方法 Object类中equals源码如下 public boo
  • angularjs2 ajax请求,AngularJS - 将ajax请求传递给另一个控制器

    我的页面中有两个表 当点击第一个表上的一行时 我想调用ajax请求来更新第二个表 我正在尝试使用两个控制器执行此操作 每个控制器都使用ng repeat填充带有值的行 我已经烧掉了我能买得起的每一个神经元 而且我仍然难过 这是我的代码 ap
  • 机器学习——逻辑回归

    一下理解均为本人的个人理解 如有错误 欢迎指出 文章目录 什么是逻辑回归 如何处理因变量取值离散的情况 如何求解w b 梯度下降法的推导 逻辑回归的用途 如何衡量逻辑回归模型的好坏 逻辑回归的使用条件 pytorch实现逻辑回归 什么是逻辑
  • React笔记(七) React路由

    React笔记 七 1 React路由理解 React实现的是SPA应用 即单页Web页面 整个应用中只有一个完整的页面 点击页面中的链接也不会刷新页面 只会对页面进行局部的刷新 因此在更换页面时需要使用路由实现 路由就是一个键值对映射关系
  • pip升级 以及python3升级python3.9

    Ubuntu16 04 升级pip问题 you are using pip version 8 1 1 however version 20 0 2 is available you should consider upgrading vi
  • python中的删除:remove()、pop()、del

    这三种方法都是list的删除方法 其中remove是针对可变列表的元素进行搜索删除 而pop和del是针对可变列表的下标进行搜索删除 具体区别如下 remove item 方法是直接对可变序中的元素进行检索删除 返回的是删除后的列表 不返回
  • 【AD20】关于AD设计过程中一些小细节

    线上实习学习AD的过程中 学习到的一些懒狗快捷技巧以及一些因版本问题的不同操作 就浅浅归纳了一下 目录 原理图相关 1 批量命名元件 2 阵列式粘贴 3 给元器件添加属性 PCB相关 1 自绘元件封装 2 自定义板子的形状 3 按板子形状铺
  • 树莓派摄像头监控&Android手机查看&浏览器查看

    树莓派摄像头监控 Android手机查看 浏览器查看 链接USB相关参考 源码 usb摄像机直接接入树莓派USB接口 1 安装motion pi raspberrypi code camera sudo apt get install mo
  • jpa limit查询_在JPA的@Query注解中使用limit条件(详解)

    在 Query注解注释的JPQL语句中写limit语句是会报错的 unexpected token limit near line 解决方法是讲 Query注解中的limit语句去掉 然后传一个Pageable pageable new P
  • 6个网页背景特效源码 canvas+three.js科技贴图 webgl源码

    隧道穿梭特效 粒子矩阵特效 几何随机变换特效
  • websocket传输速率_STM32 websocket,TCP和UDP的传输速率

    网络上经常有人提到websocket TCP和UDP 的差别 说的大都是协议之间的差别 没有提及它们的传输能力 为了设计高吞吐量的物联网微服务器 最近对websocket TCP UDP的传输能力做了测试 使用STM32F746 处理器 操
  • unity打开除主菜单其他地方黑屏或白屏与unityHub安装unity简介

    unity打开除主菜单其他地方黑屏或白屏 新安装完成unity后 解决与原因 缘由 新安装完成unity后 打开unity进入项目后 只显示出主菜单栏 其他为白屏或黑屏 如下图 解决与原因 具体原因没仔细去查百度了一下 可以是时区的设置问题
  • MatLab中滤波器(filterDesigner)的设计和使用(附代码)

    本文章只作为本人学习笔记使用 matlab具有非常使用的滤波器设计工具 关于如何找到这个小工具有两种方法 1 我们可以在命令行输入filterDesigner 不同版本命令可能会有所不同 2 在APP页面中找到filterDesigner
  • 控制研究的混杂因素(Confounder)

    高高兴兴地写完一篇 SCI 投稿 苦苦等待好久 却只等来审稿人的一句话 你有控制研究的混杂因素 Confounder 吗 额 什么是混杂因素 又该如何控制 其实 混杂因素的控制在研究设计阶段就应该注意 今天 笔者就从 什么是混杂因素 为什么
  • C++学习:动态内存

    动态内存 静态内存用来保存局部static对象 类static数据成员 定义在任何函数之外的变量 static对象在使用之前分配 在程序结束后销毁 栈内存用来保存定义在函数内的非static对象 对于栈对象 仅在其定义的程序块运行时才存在
  • LR寄存器

    异常的发生会导致程序正常运行的被打断 并将控制流转移到相应的异常处理 异常响应 有些异常 fiq irq 事件处理后 系统还希望能回到当初异常发生时被打断的源程序断点处继续完成源程序的执行 异常返回 这就需要一种解决方案 用于记录源程序的断
  • android 调用短信,Android 调用发送短信的方法

    Android 调用发送短信的方法 功能 调用发送短信功能 1 权限 2 具体实现 Uri smstoUri Uri parse smsto Intent intent new Intent Intent ACTION VIEW smsto

随机推荐

  • 在C#中使用Halcon开发视觉检测程序

    本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下 通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤 让开发者能把精力完全集中到算法的开发上面 首先 你需要安装Halcon HALCON 18
  • 图像分类,目标检测,语义分割的FC的区别

    还有半个月就要过年啦 提前给大伙拜个年哈哈 快放假了又进入了划水的阶段啥都不太想干 但是就算是划水也不能中断思考啊 谁让咱是搞技术的呢 过去的几个月里把语义分割 目标检测和图像分类都稍微了解了一下 因为是入门阶段所以聊得东西都比较简单 这篇
  • java 冥计算,次方

    1 乘以某个数的冥 BigDecimal one new BigDecimal Math pow 2 5 2的5次方 BigDecimal two new BigDecimal 10 乘数 BigDecimal multiply one m
  • unity主场景设置、场景切换、全屏设置、背景音乐设置(场景一加载就开始播放)

    主场景设置 最简单的方法 一般情况下我们的场景会有挺多的 这时候我们进入游戏就会有问题了 unity应该先加载哪一个呢 unity给了我们几种方案 其中一种是在文件 生成设置里面更改游戏场景的优先级 其中0是最高优先级 当然 必须得先把场景
  • 2023最新springboot计算机毕业设计选题大全(附源码+论文答辩),别再发愁毕设了。

    2023最新springboot计算机毕业设计选题大全 附源码 论文答辩 别再发愁毕设了 要对当前自己的学校对于计算机毕业设计的要求以及严格程度有所了解 这个主要是借助上一届已经毕业的学长学姐了解一下 但是有一点要注意的是 对于每一届毕业生
  • 希尔排序—C语言实现

    目录 前言 希尔排序 发展历史 基本思想 时间复杂度 我们以一组数字来说操作说明 gap的选取 动图演示 代码 总结 前言 在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据 当然操作数据首先想到的就是数据的排序 排过顺序的
  • PHP正则表达式匹配教程

    一 什么是正则表达式 正则表达式是一种用于搜索 匹配 替换某种文本的字符串模式 常用于处理文本数据 校验输入数据等 在PHP中 可以使用preg系列函数 preg match preg replace等 处理正则表达式 二 正则表达式语法
  • 解决org.apache.hadoop.ipc.RenoteException(java.io.IOException)

    前言 用VMware搭了一个spark 集群环境 练习spark shell 因为懒一直没关虚拟机 一直卡到玩不了了 没关闭spark hadoop集群 直接干掉了 虚拟机 然后 网卡炸了 各种修修补补 master节点死活ping不通 子
  • 连接mysql的url是什么意思_URL是什么意思?

    这个维基百科上有翻译 URL Uniform Resource Locator 统一资源定位符 URI Uniform Resource Identifier 统一资源标志符 URL 是一种比较统一的带参数指向某个地址的格式 格式为 协议类
  • 私有云笔记推荐(obsidian+nas同步)

    文章目录 Joplin Leanote 蚂蚁笔记 obsidian webdav 内网穿透 Trilium vnote 总结 nas同步 Obsidian Joplin https joplinapp org https www jians
  • C++11 原子变量

    目录 什么时原子变量 atomic 类成员 原子变量的使用 C C Linux服务器开发 后台架构师 零声教育 学习视频教程 腾讯课堂 什么时原子变量 原子操作 原子指的是一系列不被 CPU上下文交换的机器指令 这些指令组合在一起就形成了原
  • Sonar安全

    1 Using Struts 1 ActionForm is security sensitive 使用Struts1的ActionForm是安全敏感的 All ActionForm s properties should be valid
  • doccano 解决 pydantic.errors.PydanticImportError: `pydantic:ConstrainedStr` has been removed in V2.

    文章目录 报错信息 环境 描述 解决措施 其他 doccano一直转圈圈 报错信息 File C Users anaconda3 envs UIE lib site packages pydantic migration py line 2
  • 通过axios实现的一个搜索查询展示案例

    代码如下 App js import React Component from react import Search List from components export default class App extends Compon
  • Flink实战之实时风控规则引擎

    问题导读 1 怎样构建一个风控业务架构 2 风控规则模型有哪些 3 怎样实现Flink CEP 动态更新 一 项目背景 目前钱大妈基于云原生大数据组件 DataWorks MaxCompute Flink Hologres 构建了离线和实时
  • java程序员专业技能_java程序员简历专业技能怎么写

    专业技能 案例一 1 了解Javascript编程 jQuery框架以及AJAX等前台技术 并且能够熟练使用 jQuery easy UI等jQuery插件 2 掌握Spring框架 包括IOC和DI AOP编程 声明式事务处理及SSH的整
  • 【Python3】smtp邮件内容格式(三)

    邮件正文内容 文本方式 第三个参数 第一个为文本内容 第二个 plain 设置文本格式 第三个 utf 8 设置编码方式 message MIMEText Python 邮件发送测试 plain utf 8 邮件正文 html方式 第三个参
  • 设计模式SOLID

    一 单一职责原则 一个类或者一个模块只完成一个功能 class UserInfo userId username email telephone 二 开闭原则 对扩展开放 对修改关闭 class Alert void check error
  • Java并发编程-第二章

    以下内容来自 Java并发编程 书籍第二章 补充 1 volatile的有序性 volatile通过内存屏障实现禁止指令重排序保证有序性 硬件层面的内存屏障分为Load Barrier 和 Store Barrier即读屏障和写屏障 2 同
  • 企业号回调模式php,.net开发微信企业号之回调模式触发功能

    1 首先服务器跟域名指向的80端口必须不能缺少 2 然后在企业号后台配置里选择回调模式 选择回调模式时候需要配置域名 这时候就跟我们的代码相关了 这一次的配置 对于服务器来说 属于get的请求 我们要在服务器上面写上get请求的方法 以及返