• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 微信公众平台开发教程(三) 基础框架搭建

微信公众平台开发教程(三) 基础框架搭建

作者:停留的风 字体:[增加 减小] 来源:互联网 时间:2017-05-28

停留的风 通过本文主要向大家介绍了微信公众平台框架,微信公众平台开发框架,微信公众平台框架图,微信公众平台基础教程,微信公众平台教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此。具体见下图。

主要功能介绍如下:

1)请求接口层。处理HTTP请求,及响应

2)分发层。由接口层传入请求,然后具体分析请求类型,分发至不同的处理器

3)业务逻辑层。这里是我们的具体业务逻辑了,根据请求,实现具体的业务逻辑。

4)数据层。我们在实现某个应用时可能需要访问数据,可以是数据库或者是文件。如果是简单应用,可能没有这一层。

其实,具体的应用可以在这个结构上去扩展,可以扩展消息对象层、业务对象层、数据访问层、功能管理层等。这里只是提供一种思路,不局限于此。


根据层次图,设计流程图,具体讲述实现的各个过程。以便了解整个处理过程。如下图所示:


根据流程图,我们能够清晰的了解整个流程,消息处理的具体实现步骤。

下面我们针对每个流程进行代码实现。

一、接收HTTP请求

我们需要一个HttpHandler或者一个网页,来处理微信服务端HTTP请求。

这里我们使用了HttpHandler。因为其灵活性高,性能好。

具体实现如下。

public class WeiXinHttpHandler:IHttpHandler
  {
    /// <summary>
    /// 
    /// </summary>
    public bool IsReusable
    {
      get { return true; }
    }
    /// <summary>
    /// 处理请求
    /// </summary>
    /// <param name="context"></param>
    public void ProcessRequest(HttpContext context)
    {
      //由微信服务接收请求,具体处理请求
      WeiXinService wxService = new WeiXinService(context.Request);
      string responseMsg = wxService.Response();
      context.Response.Clear();
      context.Response.Charset = "UTF-8";
      context.Response.Write(responseMsg);
      context.Response.End();
    }
  }
</div>

如果是HTTPHandler,需要在配置文件中,配置具体的应用。具体的节点配置,我们不作说明。直接给出例子,配置HttpHandler节点如下 

<httpHandlers>
  <add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/>
</httpHandlers>
</div>

二、分发请求

 为了能功能封装,我们也将此封装在了处理组件中。其实可以放置在HttpHandler中的。

 1)验证签名

 如果是首次请求,需要验证签名。就相当于一次HTTP握手。之前在上一章中,设置的服务器URL以及token值,这个功能就是检验是否链接成功。

这个请求是GET请求。以下具体说明(官方):

业务逻辑:

加密/校验流程:

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

<2> 将三个参数字符串拼接成一个字符串进行SHA1加密

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

而官方只提供了PHP的代码示例,很多东西在C#中并非直译既得。所以这里面也有一些具体处理。先看官方的代码:

private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];  
        
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }
</div>

我们将其翻译成C#版本:

/// <summary>
    /// 检查签名
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    private bool CheckSignature()
    {
      string signature = Request.QueryString[SIGNATURE];
      string timestamp = Request.QueryString[TIMESTAMP];
      string nonce = Request.QueryString[NONCE];

      List<string> list = new List<string>();
      list.Add(TOKEN);
      list.Add(timestamp);
      list.Add(nonce);
      //排序
      list.Sort();
      //拼串
      string input = string.Empty;
      foreach (var item in list)
      {
        input += item;
      }
      //加密
      string new_signature = SecurityUtility.SHA1Encrypt(input);
      //验证
      if (new_signature == signature)
      {
        return true;
      }
      else
      {
        return false;
      }
    }

</div>

这里需要SHA1加密,具体的算法如下:

/// <summary>
    /// SHA1加密
    /// </summary>
    /// <param name="intput">输入字符串</param>
    /// <returns>加密后的字符串</returns>
    public static string SHA1Encrypt(string intput)
    {
      byte[] StrRes = Encoding.Default.GetBytes(intput);
      HashAlgorithm mySHA = new SHA1CryptoServiceProvider();
      StrRes = mySHA.ComputeHash(StrRes);
      StringBuilder EnText = new StringBuilder();
      foreach (byte Byte in StrRes)
      {
        EnText.AppendFormat("{0:x2}", Byte);
      }
      return EnText.ToString();
    }
</div>

2)分发请求

接下来就是具体的消息请求了,这里都是POST请求。

因为有多种消息类型,我们通过工厂类来进行封装,然后每种消息都有专门的处理器来进行处理。具体实现逻辑:

/// <summary>
    /// 处理请求
    /// </summary>
    /// <returns></returns>
    private string ResponseMsg()
    {
      string requestXml = Common.ReadRequest(this.Request);
      IHandler handler = HandlerFactory.CreateHandler(requestXml);
      if (handler != null)
      {
        return handler.HandleRequest();
      }

      return string.Empty;
    }

</div>

处理请求的对外方法(HttpHandler调用的方法就是这个了),即:

/// <summary>
    /// 处理请求,产生响应
    /// </summary>
    /// <returns></returns>
    public string Response()
    {
      string method = Request.HttpMethod.ToUpper();
      //验证签名
      if (method == "GET")
      {
        if (CheckSignature())
        {
          return Request.QueryString[ECHOSTR];
        }
        else
        {
          return "error";
        }
      }

      //处理消息
      if (method == "POST")
      {
        return ResponseMsg();
      }
      else
      {
        return "无法处理";
      }
    }

</div>

三、消息处理器具体处理消息

1)消息类型

首先我们来看下,具体的消息类型,其实上一张中已经明确给了消息的接口。

这里再看具体看一下,请求的消息类型有哪些,回复的消息类型有哪些等。

千万要注意,请求的消息是文本类型,回复的消息,不一定也是文本哦,可以是图文、音乐等任意一种可回复的消息。具体见下表所示。


2)根据具体的消息接口,设计消息类。

这里给出类图,供参考。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 微信公众平台开发教程(三) 基础框架搭建

相关文章

  • 2017-05-28c#中的常用ToString()方法总结
  • 2017-05-28c# 实现窗体拖到屏幕边缘自动隐藏
  • 2017-05-28C#使用Windows Service的简单教程(创建、安装、卸载、调试)
  • 2017-05-28C# winform 模拟键盘输入自动接入访问网络的实例
  • 2017-05-28读取图片像素的具体实例
  • 2017-05-28C# 利用IRawPixels接口遍历栅格数据
  • 2017-05-28c# 对cookies(增、删、改、查)的操作方法
  • 2017-05-28C# DataTable 转换为 实体类对象实例
  • 2017-05-28C#遍历文件夹及子目录下所有图片
  • 2017-05-28C#中ToString数据类型格式大全(千分符)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#定义并实现单链表实例解析
    • C#遍历文件夹及其子目录的完整实现方法
    • C#计算字符串相似性的方法
    • C#封装的常用文件操作类实例
    • 详解C#中HashTable的用法
    • C#根据身份证号码判断出生日期和性别
    • C#获取Windows进程监听的TCP/UDP端口实例
    • C#获取文件创建时间的方法
    • AnyChat的视频会议程序实例详解
    • C# 汉字转化拼音的简单实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有