此文将分两篇讲解,主要分为以下几步
- 签名校验;
- 首次提交验证申请;
- 接收消息;
- 被动响应消息(返回XML);
- 映射图灵消息及微信消息;
其实图灵机器人搭载微信公众号很简单,只需要把图灵的地址配到公众后台就可以了。 不过这样做之后也就没有任何扩展的可能了,因此自己实现一套!
一、签名校验
在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。
此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。
根据微信开发者平台中的描述,我们在首次提交验证申请及接收用户消息时,都需要校验签名以确保消息来源真实。
参与签名的参数为timestamp
、nonce
及token
(即开发者中心中配置的Token令牌)
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序(此处注意:是三个参数的值,而不是按参数名排序)
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
由于这个东西在接收消息时是通用的,我们可以使用授权过滤器AuthorizeAttribute
来实现。
using System.Configuration; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; using System.Linq; using System.Web.Http.Controllers; using Efh.Core.Security; namespace Efh.Blog.Web.Areas.WeiXin.Filter { public class WXAuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 签名Key /// </summary> private string _wxToken = ConfigurationManager.AppSettings["WXToken"]; /// <summary> /// 是否通过授权 /// </summary> /// <param name="actionContext">上下文</param> /// <returns>是否成功</returns> protected override bool IsAuthorized(HttpActionContext actionContext) { var requestQueryPairs = actionContext.Request.GetQueryNameValuePairs().ToDictionary(k => k.Key, v => v.Value); if (requestQueryPairs.Count == 0 || !requestQueryPairs.ContainsKey("timestamp") || !requestQueryPairs.ContainsKey("signature") || !requestQueryPairs.ContainsKey("nonce")) { return false; } string[] waitEncryptParamsArray = new[] { _wxToken, requestQueryPairs["timestamp"], requestQueryPairs["nonce"] }; string waitEncryptParamStr = string.Join("", waitEncryptParamsArray.OrderBy(m => m)); string encryptStr = HashAlgorithm.SHA1(waitEncryptParamStr); return encryptStr.ToLower().Equals(requestQueryPairs["signature"].ToLower()); } /// <summary> /// 处理未授权请求 /// </summary> /// <param name="actionContext">上下文</param> protected sealed override void HandleUnauthorizedRequest(HttpActionContext actionContext) { actionContext.Response = actionContext.Request.CreateResponse( HttpStatusCode.Unauthorized, new { status = "sign_error" }); } } }
将该特性声明在我们的微信Controller或者Action上,我们的签名校验便完成了。
二、首次提交验证申请
首次提交验证申请,微信服务器来调的时候是Get请求,而且要求我们将echostr原样返回。 注意,是原样返回。不是XML,也不是Json,<string>echostr</string>
和"echostr"都是不行的!
囊中羞涩,本人使用的是虚拟主机搭载在原有的项目中,故新建微信区域(WeiXin)来实现。WeiXinAreaRegistration.cs文件如下:
public class WeiXinAreaRegistration : AreaRegistration { public override string AreaName { get { return "WeiXin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.Routes.MapHttpRoute( "WeiXinProcessor", "WeiXin/{controller}", new { controller = "Processor" } ); } }
新建Processor控制器,实现如下:
[WXAuthorize] public class ProcessorController : ApiController { public HttpResponseMessage Get() { var requestQueryPairs = Request.GetQueryNameValuePairs().ToDictionary(k => k.Key, v => v.Value); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(requestQueryPairs["echostr"]), }; } }
上述我们便实现了首次微信的验证。
三、接收消息
微信将请求的消息分为六种:文本消息、图片消息、语音消息、视频消息、地理位置消息、链接消息,其实我们还可以将事件推送也理解为其中一种。
将响应的消息分为六种: 1. 回复文本消息 2. 回复图片消息 3. 回复语音消息 4. 回复视频消息 5. 回复音乐消息 6. 回复图文消息 。我们在这儿主要使用文本消息和图文消息。
分析后我们发现,ToUserName
、FromUserName
、CreateTime
、MsgType
是所有消息共有的参数。同时也是我们响应时必需的参数。
我们创建消息基类和消息类型枚举如下
public class BaseMsg { public string ToUserName { get; set; } public string FromUserName { get; set; } public long CreateTime { get; set; } public MsgType MsgType { get; set; } } public enum MsgType { [XmlEnum("event")] Event, [XmlEnum("text")] Text, [XmlEnum("image")] Image, [XmlEnum("voice")] Voice, [XmlEnum("video")] Video, [XmlEnum("music")] Music, [XmlEnum("news")] News }
此处枚举字段标注的XmlEnum稍候解释。
而后按照各消息类型的非共有的参数,分别创建对应消息的实体类
文本消息:
[XmlRoot("xml")] public class TextMsg : BaseMsg { public string Content { get; set; } }
图文消息:
[XmlRoot("xml")] public class NewsMsg : BaseMsg { public int ArticleCount { get; set; } [XmlArray("Articles")] [XmlArrayItem("item")] public List<NewsInfo> Articles { get; set; } } public class NewsInfo { public string Title { get; set; } public string Description { get; set; } public string PicUrl { get; set; } public string Url { get; set; } }
等等。
接下来我们就可以开始接收微信的消息了
微信是通过Post,从正文中以XML的格式将参数传递过来的
var requestContent = Request.Content.ReadAsStreamAsync().Result;
将正文参数读取出来后,转为Xml
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(requestContent);
这样,我们便可以读取到我们需要的内容了
string msgTypeStr = xmlDoc.SelectSingleNode("xml/MsgType").InnerText;//消息类型 string userName = xmlDoc.SelectSingleNode("xml/FromUserName").InnerText;//来源用户标识 string efhName = xmlDoc.SelectSingleNode("xml/ToUserName").InnerText;//我们的用户标识
而后,我们根据消息类型,进行进一步的处理。
转下一篇
第二篇:使用web api开发微信公众号,调用图灵机器人接口(二)
原文链接:http://efenghuo.com/blog/2498.aspx
相关推荐
如何在微信公众号调用图灵机器人.docx
微信公众号开发,内容带有图灵机器人接口,图灵机器人接口需要自己在图灵机器人网站注册。
源代码中包括了各种网络消息接收类,比如接收到的微信xml实体类,解析接收到的微信xml,微信服务端收发消息接口,返回消息对象,调用图灵机器人api接口,获取智能回复内容,解析获取自己所需结果,图灵api接口,参数key...
微信公众平台开发的所有流程的代码,包括接收xml数据、解析xml数据、调用图灵机器人api接口获取智能回复内容、封装结果xml数据等
微信消息接入图灵机器人
调用图灵机器人的免费接口,导入自己的知识库信息实现微信智能客服,
1、能够调用图灵机器人或天行机器人智能回复消息。 2、支持模板式自动回复。 3、支持群发功能。 注意事项: 由于WechatPCAPI的限制,仅支持旧版本微信,资源已经包含安装包,下载即可; 资源中包含详细的使用文档,...
本例中列出了微信公众平台开发的所有流程的代码,包括接收xml数据、解析xml数据、调用图灵机器人api接口获取智能回复内容、封装结果xml数据等,简单明了,不明之处可查看个人博客中的讲解。
通过接口调用图灵机器人的微信端口的开发,通过JavaEE技术实现微信上对图灵机器人的调用,比如智能客服
vb.net 微信开发 token 验证 & 实现订阅号 调用 图灵机器人文字处理回复 连接SQL 欢迎更多技术交流 如有问题 请不吝指出!
这篇文章主要介绍了Python使用微信接入图灵机器人过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.wxpy库介绍 wxpy 在 itchat 的基础上,通过大量...
本系统主要实现的是一个聊天机器人,界面仿照微信网页版聊天界面进行实现,主要实现方式是调用图灵机器人openAPI,如果使用自己的KEY直接在图灵机器人官网(http://www.tuling123.com)创建自己的机器人,将自己的...
通过python实现的微信机器人,调用图灵机器人实现消息自动回复。包含源码和项目介绍文档。
自己写的一个小demo,调用的是百度API市场里面的图灵机器人,主要包含的学习点有: listview的仿微信界面写法 API接口的调用方法 EditText的回车键监听事件 异步网络请求AsyncTask的使用等内容。
python语言写的itchat微信后台聊天机器人代码,含文档。...注:这个机器人没有调用其他机器人如图灵机器人,所以不会侃侃而谈,只能回复关键字回复对应内容,除此之外功能齐全,可以用作小课程设计。
用python实现微新聊天机器人,调用了图灵机器人的API,亲测可用,也可以花钱买更加智能的机器人,可以通过不断聊天训练使得他更智能。
关于微信公众号的学习,首先要有自己的服务器。主要实现功能:调用机器人智能回复文字,可在微信上传下载资源,语音输入识别后智能回复文字,预留有回复语音,图片,图文,视屏功能。
研究目的 基于Python实现微信公众平台机器人的功能,用以接收消息以及实现对话。 研究方法 NGINX做负载均衡,反向代理 ...图灵机器人api调用 注册一个账号,调用图灵api,解析封装返回微信即可 动态语料库
这是python调用微信聊天接口的源码文件,通过微信的Python接口itchat获取微信消息。 将微信消息传输到机器人接口(这里以图灵为例),获取机器人的返回消息。 将返回消息返回给微信消息的发送人。 实现将微信个人...
带java后台的微信调用图灵机器人接口的源码