前言: 这里就可以凸显使用APIController的一个优势了,因为可以通过MVC的路由设置相同的路由,但改变请求的方式(HttpPost),可以单独写被动回复接口。

毕竟,微信服务器转入到咱们自己的代码服务器地址是唯一的。  废话不多说,开始正文:

先粘贴帮助博客:http://www.cnblogs.com/shuang121/p/4009365.html

1-基本介绍:

入门指引:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5&token=&lang=zh_CN  中如下描述:

官方对应接口描述:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543&token=&lang=zh_CN

2-通过上面的介绍,我们可以发现我们只需回复一个XML类型的消息即可。 但是XML类型中包含了:发送者,接受者,消息时间,消息类型,消息内容。

消息时间,消息类型,消息内容:  这三项我们可以轻松搞定,  但是发送者和接受者怎么办呢?

呵呵,其实这两个信息,用户已经给我们发过来了,我们只需要把用户发送过来的消息中的:发送人和接收人拿到就可以搞定了。

那么,就再来看下怎么接受消息吧。

3-如何接受消息:

4-OK,所有资料准备完毕,下面就将代码粘贴如下:

几个关键点:

  a-获取请求XML字符串:Request.Content.ReadAsStringAsync().Result;

  b-获取每个请求参数具体值(有很多种方法):这里使用正则表达式获取。

  c-将时间类型转换为整形:

    System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));

    return (int)(time - startTime).TotalSeconds;

[RoutePrefix("GzhTest")]
public class MyLearnController : ApiController
{
private static readonly Regex ToUserNameReg = new Regex(@"(?<=<ToUserName><!\[CDATA\[).*?(?=\]\]></ToUserName>)", RegexOptions.Compiled);
private static readonly Regex FromUserNameReg = new Regex(@"(?<=<FromUserName><!\[CDATA\[).*?(?=\]\]></FromUserName>)", RegexOptions.Compiled);
private static readonly Regex CreateTimeReg = new Regex(@"(?<=<CreateTime>)\d*?(?=</CreateTime>)", RegexOptions.Compiled);
private static readonly Regex MsgTypeReg = new Regex(@"(?<=<MsgType><!\[CDATA\[).*?(?=\]\]></MsgType>)", RegexOptions.Compiled);
private static readonly Regex ContentReg = new Regex(@"(?<=<Content><!\[CDATA\[).*?(?=\]\]></Content>)", RegexOptions.Compiled);
private static readonly Regex MsgIdReg = new Regex(@"(?<=<MsgId>)\d*?(?=</MsgId>)", RegexOptions.Compiled);
private static readonly Regex EventReg = new Regex(@"(?<=<Event><!\[CDATA\[).*?(?=\]\]></Event>)", RegexOptions.Compiled);
private static readonly Regex EventKeyReg = new Regex(@"(?<=<EventKey><!\[CDATA\[).*?(?=\]\]></EventKey>)", RegexOptions.Compiled);
/// <summary>
/// 获取消息体中正则所能匹配到的内容
/// </summary>
/// <param name="message">消息内容</param>
/// <param name="regex">正则</param>
/// <returns>返回正则匹配的所有内容</returns>
private string GetItemValue(string message, Regex regex)
{
if (regex.IsMatch(message))
return regex.Match(message).Value;
return "";
}
/// <summary>
/// 接受微信消息,如果需要反馈,则调用回复接口进行答复
/// </summary>
/// <param name="ToUserName">开发者微信号</param>
/// <param name="FromUserName">发送方帐号(一个OpenID)</param>
/// <param name="CreateTime">消息创建时间 (整型)</param>
/// <param name="MsgType">text</param>
/// <param name="Content">文本消息内容</param>
/// <param name="MsgId">消息id,64位整型</param>
/// <returns>successful or not</returns>
[HttpPost]
[Route("Check")]
public HttpResponseMessage ReceiveMessage()
{
var message = Request.Content.ReadAsStringAsync().Result; var toUserName = GetItemValue(message, ToUserNameReg);
var fromUserName = GetItemValue(message, FromUserNameReg);
var createTime = GetItemValue(message, CreateTimeReg);
var msgType = GetItemValue(message, MsgTypeReg);
var content = GetItemValue(message, ContentReg);
var msgId = GetItemValue(message, MsgIdReg);
var eventStr = GetItemValue(message, EventReg);
var eventKey = GetItemValue(message, EventKeyReg); var logStr = string.Format("Message:{8}\n\nToUserName:{0}\nFromUserName:{1}\nCreateTime:{2}\nMsgType:{3}\nContent:{4}\nMsgId:{5}\nEvent:{6}\nEventKey:{7}",
toUserName, fromUserName, createTime, msgType, content, msgId, eventStr, eventKey, message);
//logger.Debug(logStr);
Log.WriteLog("接受数据");
Log.WriteLog(fromUserName);
Log.WriteLog(toUserName);
switch (msgType)
{
case "text":
{
var returnMessage = content;  // 这块是获取反馈信息的方法,你的和我的应该不一样,所以这块你得修改一下。
var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);
//logger.Debug("MsgId:" + msgId + Environment.NewLine + sendMessage);
Log.WriteLog("发送数据");
Log.WriteLog(sendMessage); return GetReturn(sendMessage);        // 这个函数在上面已经贴出来了,在这块就不在贴了
}
case "event":
{
if (eventStr == "subscribe")      // 关注事件
{
var returnMessage = "欢迎关注**账号 [微笑]";
var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);
return GetReturn(sendMessage);
}
return GetReturn("error");
}
default:
return GetReturn("error");
}
}
/// <summary>
/// 发送被动响应消息
/// </summary>
/// <param name="ToUserName">接收方帐号(收到的OpenID)</param>
/// <param name="Content">回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)</param>
/// <param name="FromUserName">开发者微信号</param>
/// <param name="CreateTime">消息创建时间 (整型)</param>
/// <param name="MsgType">text</param>
/// <returns></returns>
public string GetSendMessage(string ToUserName, string Content, string FromUserName, string MsgType = "text")
{
var createTime = ConvertDateTimeInt(DateTime.Now); return
string.Format(@"<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime><MsgType><![CDATA[{3}]]></MsgType><Content><![CDATA[{4}]]></Content></xml>", ToUserName, FromUserName, createTime, MsgType, Content);
}
/// <summary>
/// datetime转换为unixtime
/// 将时间类型转换为整形
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
}
public static HttpResponseMessage GetReturn(string message)
{
return new HttpResponseMessage
{
Content = new StringContent(message, Encoding.UTF8, "text/html")
};
}
}

微信公众号入门学习2_使用C#,ASP.NET APIController如何被动回复用户消息的更多相关文章

  1. 微信公众号入门学习1_使用C#,ASP.NET APIController如何公众号接入服务器并启动开发者模式

    前言:  本文是以微信公众号中的订阅号(个人)来进行简单介绍,本人也是刚刚开始学习,有不足之处,欢迎批评指正. 先粘贴2个帮助链接: 入门指引:http://mp.weixin.qq.com/wiki ...

  2. python微信公众号开发学习记录

    网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...

  3. 用java开发微信公众号:接收和被动回复普通消息(三)

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...

  4. 微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行

    使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ...

  5. 【原创】【2015最新】微信公众平台开发手把手入门之一:缘起微信公众号(PHP,MYSQL, BAE)

    最近因为业务的需要,老板布置做了两个月简单的的微信公众平台开发,从网上搜了一些资料,实话说资料不多. 在参考学习的过程中也遇到了不少难缠的小问题,虽然不难逾越,但是确实浪费了时间. 我发现网上仅有不多 ...

  6. ABP入门系列(15)——创建微信公众号模块

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 现在的互联网已不在仅仅局限于网页应用,IOS.Android.平板.智能家居等平台正如 ...

  7. Reinforcement Learning,微信公众号:DRL学习

    欢迎大家关注微信公众号:DRL学习,我们一起来学习强化学习和深度强化学习的算法及现状应用问题. 强化学习简单说就是学习如何最大化未来奖励的预期总和,以及agent学会在环境中做出的行动序列,其中随机状 ...

  8. .net微信公众号开发——快速入门

    作者:王先荣 最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用. 现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了. 使用该类库的流程及寥寥数行代码得到的结果如下. ...

  9. C#开发微信公众号-学习笔记

    由于最近要做微信服务号的开发,所以开始找相关说明和接口文档开始学,故把学习过程及注意事项记录一下,帮助想学习的快速上手.废话不多少了,直接上干货! 1.申请微信公众号 这个就不需要多说了吧,大家直接照 ...

随机推荐

  1. 用“MEAN”技术栈开发web应用(二)express搭建服务端框架

    上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...

  2. [PCB设计] 1、硬件原理图设计规范(一)——基本原则

    1.1 目的 原理图设计是产品设计的理论基础,设计一份规范的原理图对设计PCB.跟机.做客户资料具有指导性意义,是做好一款产品的基础.原理图设计基本要求: 规范.清晰.准确.易读. 因此制定此< ...

  3. Flyway, 数据库Schema管理利器

    整天跟数据库打交道的程序员都知道,当数据库的Schema发生改变时是多么痛苦的事情.尤其是一个在不断开发完善的项目,随着需求变化,数据库的schema也会跟着变化,而追踪记录这些变化一向都是费时费力. ...

  4. Atitit 图像处理知识点  知识体系 知识图谱

    Atitit 图像处理知识点  知识体系 知识图谱 图像处理知识点 图像处理知识点体系 v2 qb24.xlsx 基本知识图像金字塔op膨胀叠加混合变暗识别与检测分类肤色检测other验证码生成 基本 ...

  5. Atitit 游戏的通常流程 attilax 总结 基于cocos2d api

    Atitit 游戏的通常流程 attilax 总结 基于cocos2d api 加载音效1 加载页面1 添加精灵1 设置随机位置2 移动2 垃圾gc2 点击evt2 爆炸效果3 定时生成精灵3 加载音 ...

  6. atitit 研发管理 要不要自己做引擎自己实现架构?.docx

    atitit 研发管理 要不要自己做引擎自己实现架构?.docx 1.1. 目前已经有很多引擎了,还要自己做吗??1 1.2. 答案是自己做更好,利大于弊1 2. 为什么要自己做??1 2.1. 从历 ...

  7. jQuery对 动态添加 的元素 绑定事件(on()的用法)

    从jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的(官方推荐)首选方法. 当浏览器下载完一个页面的时候就开始渲染(翻译)HTML标签,然后执行css.js代码,在执行js代 ...

  8. android sdk下载

    android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/

  9. Java EE开发平台随手记1

    过完春节以来,一直在负责搭建公司的新Java EE开发平台,所谓新平台,其实并不是什么新技术,不过是将目前业界较为流行的框架整合在一起,做一些简单的封装和扩展,让开发人员更加易用. 和之前负责具体的项 ...

  10. php优点

    PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本 ...