目录

  • 基本原理
  • 公众号申请及配置
  • 验证服务器有效性
  • 微信请求消息类型

基本原理


  • 基本原理如上图:腾讯微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器然后将请求转发给我们的开发者服务器,在开发者服务器端可加入我们的业务处理逻辑(如:调用luis API 获取luis定义的Intent和Entity,接入业务处理逻辑),开发者服务器(应用服务器)处理完毕后,将响应数据回发给微信服务器,微信服务器再将具体响应信息回复到微信App终端
  • 通信协议为:HTTP
  • 数据传输格式为:XML

公众号申请及配置


  • 申请地址: https://mp.weixin.qq.com/
  • 登陆系统,在开发->基本配置界面,设置服务器配置信息,包含服务器地址(URL)、Token和EncodingAESKey,如下图
  • 服务器地址即公众号后台提供业务逻辑的入口地址,包括接入验证以及任何其它操作的请求(例如消息的发送、菜单管理、素材管理等)都要从这个地址进入。
  • 接入验证和其它请求的区别就是,接入验证时是get请求,其它时候是post请求
  • Token: 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
  • EncodingAESKey: 将用作消息体加解密密钥

验证服务器有效性


  • 录入服务器配置信息,点击“提交”按钮后,微信服务器将发送一个http的get请求到刚刚填写的服务器地址,并且携带四个参数
  • 接到请求后,需要做如下三步,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。

    1. 将token、timestamp、nonce三个参数进行字典序排序   

    2. 将三个参数字符串拼接成一个字符串进行sha1加密   

    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

  • c#代码实现:1、创建空的web工程  2、添加wx.ashx文件  3、wx.ashx代码如下

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Xml; namespace WXHandler
    {
    /// <summary>
    /// wx 的摘要说明
    /// </summary>
    public class wx : IHttpHandler
    {
    /// <summary>
    ///
    /// </summary>
    /// <param name="context"></param>
    public void ProcessRequest(HttpContext context)
    {
    WXContext wxContext = new WXContext(context); if (wxContext.IsHttpGet) //校验签名,在公众平台填入服务器端配置信息提交之后检验使用
    {
    ValidateUrl(wxContext);
    }
    else
    {
    HandleMsg(wxContext);
    }
    } /// <summary>
    ///
    /// </summary>
    /// <param name="wxContext"></param>
    private void ValidateUrl(WXContext wxContext)
    {
    string echostr = string.Empty;
    bool success = BasicAPI.CheckSignature(wxContext, out echostr);
    if (success)
    {
    HttpContext context = HttpContext.Current;
    context.Response.ContentType = "text/plain";
    context.Response.Write(echostr);
    }
    } /// <summary>
    ///
    /// </summary>
    /// <param name="wxContext"></param>
    public void HandleMsg(WXContext wxContext)
    {
    string msg = WeixinExecutor.Default.Execute(wxContext.WxMsg);
    HttpContext context = HttpContext.Current;
    context.Response.ContentType = "text/plain";
    context.Response.Write(msg);
    } public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }
    }
  • 检测代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Http;
    using System.IO; namespace WXHandler
    {
    /// <summary>
    /// 对应微信API的 "基础支持"
    /// </summary>
    public class BasicAPI
    {
    /// <summary>
    /// 检查签名是否正确:
    /// </summary>
    /// <param name="wxContext"></param>
    /// <param name="echostr"></param>
    /// <returns></returns>
    public static bool CheckSignature(WXContext wxContext, out string echostr)
    {
    var arr = new[] {wxContext.Token,wxContext.Timetamp,wxContext.Nonce}.OrderBy(z => z).ToArray();
    var arrString = string.Join("", arr);
    var sha1 = System.Security.Cryptography.SHA1.Create();
    var sha1Arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString));
    StringBuilder enText = new StringBuilder();
    foreach (var b in sha1Arr)
    {
    enText.AppendFormat("{0:x2}", b);
    }
    echostr = enText.ToString();
    return wxContext.Signature == enText.ToString();
    } }
    }

微信请求消息类型


  • 微信开发文档参见: https://mp.weixin.qq.com/wiki
  • 参见如下代码:包含有文本、语音、图片、位置等信息类型
  • 注意:开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。
  • 在处理这些消息时,先可查看当前帐号已经获取的权限,位置:开发-->接口权限,默认情况,接收消息中的“接收语音识别结果”选项是关闭的
  • 实现代码如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using System.Runtime.Serialization;
    using System.IO; namespace WXHandler
    {
    /// <summary>
    ///
    /// </summary>
    public class WeixinExecutor : IWeixinExecutor
    {
    /// <summary>
    ///
    /// </summary>
    public static WeixinExecutor Default
    {
    get { return new WeixinExecutor(); }
    } /// <summary>
    ///
    /// </summary>
    /// <param name="message"></param>
    /// <returns>已经打包成xml的用于回复用户的消息包</returns>
    public string Execute(WeixinMessage message)
    {
    string result = string.Empty;
    var openId = message.Body.FromUserName.Value;
    var myUserName = message.Body.ToUserName.Value;
    switch (message.Type)
    {
    case WeixinMessageType.Text://文字消息
    {
    string userMessage = message.Body.Content.Value;
    var BotMessage = LuisService.Default.PostMessage(userMessage);
    result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
    }
    break;
    case WeixinMessageType.Image://图片消息
    {
    string imageUrl = message.Body.PicUrl.Value;//图片地址 var msg = ImageService.Default.PostMessage(imageUrl);
    result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, msg);
    }
    break;
    case WeixinMessageType.Voice://语音消息
    {
    var recognition = Convert.ToString(message.Body.Recognition.Value);
    var BotMessage = LuisService.Default.PostMessage(recognition);
    if (BotMessage == LuisInfos.DEFAULT_LUIS)
    BotMessage += string.Format(" 您输入的内容为:{0}", recognition);
    result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
    }
    break;
    case WeixinMessageType.Location://地理位置消息
    {
    var location_X = message.Body.Location_X.Value.ToString();
    var location_Y = message.Body.Location_Y.Value.ToString(); var BotMessage = LocationService.Default.PostMessage(location_Y, location_X);
    result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
    }
    break;
    case WeixinMessageType.Link://链接消息
    {
    var title = message.Body.Title.Value.ToString();
    var description = message.Body.Description.Value.ToString();
    var url = message.Body.Url.Value.ToString();
    var msgId = message.Body.MsgId.Value.ToString();
    }
    break;
    default:
    result = ReplayPassiveMessageAPI.RepayText(openId, myUserName,"xxxxxx......");
    break;
    }
    return result;
    }
    }
    }

AI(三):微信与luis结合(上)的更多相关文章

  1. AI(四): 微信与luis结合(下)

    LUIS(Language Understanding Intelligent Services)是微软新近推出了的的语义理解服务,可以方便用户进行API调用,创建自己场景的语义理解服务,网址为 ht ...

  2. 微信小程序实现上拉和下拉加载更多

    在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...

  3. 【百度地图API】建立全国银行位置查询系统(三)——如何在地图上添加银行标注

    原文:[百度地图API]建立全国银行位置查询系统(三)--如何在地图上添加银行标注 <摘要>你将在第三章中学会以下知识: 如何在地图上添加带银行logo的标注?(你也可以换成商场logo, ...

  4. 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

    朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设 ...

  5. 基于vue + axios + lrz.js 微信端图片压缩上传

    业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能 ...

  6. 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件

    使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...

  7. 5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用

    本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频 ...

  8. 使用Laya引擎开发微信小游戏(上)

    本文由云+社区发表 使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏. 作者:马晓东,腾讯前端高级工程师. 微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现 ...

  9. 快速高效实现微信小程序图片上传与腾讯免费5G存储空间的使用

    本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率 对于一般的图片上传功能开发,我们 ...

随机推荐

  1. CSS学习笔记:文本换行显示(word-wrap)

    在CSS3中新定义了文本换行属性,word-wrap: nomal属性值表示控制连续文本换行. break-word属性值表示内容将在边界内换行.如果需要,词内换行(word-break)也会发生. ...

  2. vsphere client 虚拟机安装操系统

    vSphere 是 VMware 推出的基于云计算的新一代数据中心虚拟化套件,提供了虚拟化基础架构.高可用性.集中管理.监控等一整套解决方案. VMware ESXi 是VMware vSphere ...

  3. CSS3 实现六边形Div图片展示效果

    原文:CSS3 实现六边形Div图片展示效果 效果图: 实现原理: 这个效果的主要css样式有: 1.>transform: rotate(120deg); 图片旋转 2.>overflo ...

  4. ASP.NET WebForm路由模拟

    一.ASP.NET MVC 路由(一)--- ASP.NET WebForm路由模拟 2014-11-08 11:49 by 郝喜路, 232 阅读, 0 评论, 收藏, 编辑 ASP.NET Web ...

  5. highchart几个图表马金摘要

    1)  Js的引入顺序不对,导致highchart的图表出不来. 由于Highchart插件中用到了jquery,jquery的js要在引入highchart的js之前引入,否则当会导致当载入high ...

  6. MySql处理数据库和表

    show databases; mysql> show databases; mysql> create database db_test; Query OK, 1 row affecte ...

  7. ASP.NET中Partial Class部分类

    原文:ASP.NET中Partial Class部分类 如果您在开发项目的公用函数库,用于公用函数库的内容越丰富越好,但这不可能一下子就写好,需要一点一点的积累,这时就可以使用Partial Clas ...

  8. HTML的框架,表格

    #2 HTML的框架,表格   [以下是个人笔记,由于水平有限,因此有错误的地方,希望M我.谢谢] 表格|表单|框架---------------表格:布局     ----现在很少用到好处: 适合做 ...

  9. Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作

    Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...

  10. 看AngularJS

    最近一段时间一直在看AngularJS,趁着一点时间总结一下. 官网地址:http://angularjs.org/ 先推荐几个教程 1. AngularJS入门教程 比较基础,是官方Tutorial ...