在准备工作中,我们已经完成准备工作,接下来就是进行开发啦,应该怎么来开发呢??容我想想。。。我觉得我们可以直接让用户的消息发送到微信的消息,转到我们自己的服务器上面!!感觉好厉害的样子

1.首先写 验证程序啦,这第一步的工作呢,就是验证数据是不是来源于微信端的,如果不是来自微信服务器端的,那就安逸了。。。,废话不多说,直接上代码

1.1这个是微信端页面的配置

1.2 验证微信数据来源

//获取token
string Token = string.Format("{0}", ConfigurationManager.AppSettings["ToKen"]);//这个,简单来说,就是我们自己的钥匙,用来验证的钥匙,需要和微信端填写的一模一样,我这里直接在Web.config里面进行配置就行,见上图
[HttpGet]
public ActionResult Index(string signature, string timestamp, string nonce, string echostr)//相关字段信息我们可以直接上微信文档了解,这里就不一一列举了
{
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序 
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//这个就是SHA1加密
tmpStr = tmpStr.ToLower();
if (signature == tmpStr) // 如果从微信传入的数据和我们的数据不一样,那就表示传入的数据不一定是从微信传入的数据,就不能返回echostr参数
{
return Content(echostr);
}
else
{
ReturnInfo<SessionInfo> returnSessionInfo = GetSessionUserInfo();
if (returnSessionInfo.Code != 1)
{
//返回失败信息到页面
return RedirectToAction("Index", "Error"); ;
}

return View();
}
}

备注:在公司开发可能会遇到跨域问题,推荐使用工具ngnork,可实现内外网穿透

2.消息的获取

  2.1消息去重,使用msgid排重

static List<BaseMsg> _queue = new List<BaseMsg>();

//消息去重
if (_queue == null)
{
_queue = new List<BaseMsg>();
}
else if (_queue.Count >= 50)
{
_queue = _queue.Where(q => { return q.CreateTime.AddSeconds(20) > DateTime.Now; }).ToList();//保留20秒内未响应的消息
}

2.2消息的获取

Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
byte[] requestByte = new byte[requestStream.Length];
requestStream.Read(requestByte, 0, (int)requestStream.Length);
string requestStr = Encoding.UTF8.GetString(requestByte);
//封装请求类
XmlDocument requestDocXml = new XmlDocument();
requestDocXml.LoadXml(requestStr);
XmlElement rootElement = requestDocXml.DocumentElement;
XElement xdoc = XElement.Parse(requestStr);
var msgtype = xdoc.Element("MsgType").Value.ToUpper();
var FromUserName = xdoc.Element("FromUserName").Value;
var MsgId = xdoc.Element("MsgId").Value;
var CreateTime = xdoc.Element("CreateTime").Value;
if (msgtype != "event" && msgtype != "link" && msgtype != "location")
{
if (_queue.FirstOrDefault(m => { return m.MsgFlag == MsgId; }) == null)
{
_queue.Add(new BaseMsg
{
CreateTime = DateTime.Now,
FromUser = FromUserName,
MsgFlag = MsgId
});
}
else
{
return "";
}
}
else
{
return "";
}

接下来就是通过解析rootElement 来获取对应字段的消息了
如:string strFormUserName = rootElement.SelectSingleNode("FromUserName").InnerText;

然后把数据保存至数据库,整个消息接受和保存的数据流程就走完了

asp.net 微信开发(一)的更多相关文章

  1. asp.net 微信开发(二)

    本节我们主要讲解微信的调试: 前言:平时我们开发项目都是在本地就能进行项目的开发调试,但是在微信上就有难度了,因为微信的数据需要从微信服务器上面拿,所以就需要直接在网站上调试了,接下来就相关的一些个人 ...

  2. asp.net微信开发第四篇----已关注用户管理

    公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过 ...

  3. asp.net微信开发第三篇----自定义会话管理

    和微信用户的沟通少不了,总觉得看起来微信官网后台管理中的会话回复消息有点呆板,所以我这里就自定义了一个会话管理功能,最终效果图如下: 因为我试使用富文本文件CKEDITOR来进行编写,你看到稳中可能会 ...

  4. asp.net微信开发第八篇----永久素材管理

    除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材. 最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用 ...

  5. asp.net微信开发第七篇----高级群发(图文)

    上一篇介绍了如何群发文本消息,本篇将介绍如何群发图文信息,上传图文信息所需的素材,界面如下: 我们先看从素材库中获取图文素材的代码,界面: 素材列表,我是使用的repeater控件, 前台代码如下: ...

  6. asp.net微信开发第六篇----高级群发(文本)

    说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...

  7. asp.net微信开发第五篇----用户分组管理

    上一篇已讲解到新建用户分组,移动用户到分组的功能,这一章主要讲解修改分组名称和删除分组 开发者可以使用接口,对公众平台的分组进行查询.创建.修改.删除等操作,也可以使用接口在需要时移动用户到某个分组. ...

  8. asp.net微信开发第二篇----消息应答

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上. 请注意: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接 ...

  9. asp.net微信开发第一篇----开发者接入

    在项目的根目录或者特定的文件夹内,创建一个ashx文件(一般处理程序文件),如图 public void ProcessRequest(HttpContext context) { context.R ...

随机推荐

  1. linux安装Samba服务

    [1].yum -y install samba安装samba [2].找到samba配置文件:vim /etc/samba/smb.conf [3].[gloabl]下面security有三种模式: ...

  2. git 安装部署教程

    转转改改修修,能用:   查看用户名和邮箱 $ git config user.name $ git config user.email   修改用户名和邮箱 $ git config user.na ...

  3. 关于linux crontab定时操作oracle不执行的问题解决方案

    问题描述:启动定时任务对oracle表进行操作,但是手动执行脚本无问题,定时任务执行无结果不反馈消息 解决方案:以centos7为例吗,首先确定脚本可手动执行,然后检查/var/log/cron下的日 ...

  4. cordova原生页面切换效果插件的使用:com.telerik.plugins.nativepagetransitions

    1. 添加插件:cordova plugin add com.telerik.plugins.nativepagetransitions2. 使用方法: 在index.html中添加: <met ...

  5. nginx ngx_http_image_filter_module 简单试用

    nginx包含了一个ngx_http_image_filter_module 模块,我们可以方便的进行图片的缩略图,平时一些简单的功能 已经够用了 环境准备 为了简单使用docker-compose ...

  6. attr跟prop的区别:

    prop()函数的结果: 1.如果有相应的属性,返回指定属性值. 2.如果没有相应的属性,返回值是空字符串. attr()函数的结果: 1.如果有相应的属性,返回指定属性值. 2.如果没有相应的属性, ...

  7. Oracle 相关知识

    1.Navicat 连接Oracle 报错: 解决办法: 1).先下载oracle客户端,win64_11gR2_client.zip,下载地址:http://www.oracle.com/techn ...

  8. Spring Boot - AOP(面向切面)-切入点表达式

    切入点指示符用来指示切入点表达式目的,在 Spring AOP 中目前只有执行方法这一个连接点,Spring AOP 支持的 AspectJ 切入点指示符,切入点表达式可以使用 &&. ...

  9. 【java】抽象类和接口区别

    1.语法层面上的区别 1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法: 2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public sta ...

  10. 查看局域网内所有IP的方法

    1,windows下查看局域网内所有IP的方法: 在MS-DOS命令行输入arp -a 2,Linux下,查看局域网内所有IP的方法: 在命令行输入nmap -sP 172.10.3.0/24