微信公众号开发---基本框架配置

article/2025/10/8 15:47:06

上一章,我们已经初步讲解了微信公众账号开发的基本原理,今天我们来探索设计实现。

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

主要功能介绍如下:

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();}}
复制代码
复制代码

 

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

 

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

 

二、分发请求

 为了能功能封装,我们也将此封装在了处理组件中。其实可以放置在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;}}
复制代码
复制代码

我们将其翻译成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;}}
复制代码
复制代码

这里需要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();}
复制代码
复制代码

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;}
复制代码
复制代码

处理请求的对外方法(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 "无法处理";}}
复制代码
复制代码

 

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

1)消息类型

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

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

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

 

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

这里给出类图,供参考。

 

3)针对不同的消息,会有不同的处理器,来看下具体的类图。

  

4)具体业务处理 

每个handler里面就是可以处理具体请求。输入的什么消息,访问那些数据,调用服务等,都在这里处理。

还是建议大家对具体的业务进行单独封装,在Handler中,只提供调用的接口。

因为随着业务的增加,一个Handler可能要处理很多业务,如果所有的操作逻辑都写在这里,势必影响阅读,也不易于维护与扩展。 

5)产生回复消息

在处理完请求后,需要生成回复消息,响应到终端。消息格式,就是我们介绍那些消息类型,但必须是可用于回复的,当前支持的有:文本、图文、音乐等。

一定要明确:回复的消息类型不一定要与请求的消息类型一样,比如,请求是文本,回复的可以是图文、音乐。

产生回复消息的过程,其实,就是特定的消息对象格式化为对应的XML的过程,然后将XML响应至微信服务器。

6)实例

这里以微信用户关注公众账号,然后服务端处理处理事件请求,登记用户,并提示欢迎信息。

复制代码
复制代码
    class EventHandler : IHandler{/// <summary>/// 请求的xml/// </summary>private string RequestXml { get; set; }/// <summary>/// 构造函数/// </summary>/// <param name="requestXml"></param>public EventHandler(string requestXml){this.RequestXml = requestXml;}/// <summary>/// 处理请求/// </summary>/// <returns></returns>public string HandleRequest(){string response = string.Empty;EventMessage em = EventMessage.LoadFromXml(RequestXml);if (em.Event == EventType.Subscribe){//注册用户User user = new User();user.OpenID = em.FromUserName;UserManager.Regester(user);//回复欢迎消息TextMessage tm = new TextMessage();tm.ToUserName = em.FromUserName;tm.FromUserName = em.ToUserName;tm.CreateTime = Common.GetNowTime();tm.Content = "欢迎您关注xxx,我是小微。有什么我能帮助您的吗?";response = tm.GenerateContent();}return response;}}
复制代码
复制代码

 

四、HTTP响应

 最后将处理结果返回至最初HttpHandler,响应给微信服务器,直接Response处理。这也是在最开始设计的HttpHandler中实现的。

下面是代码片段,具体可见一、Http请求 

            context.Response.Clear();context.Response.Charset = "UTF-8";context.Response.Write(responseMsg);context.Response.End();

http://chatgpt.dhexx.cn/article/1JZP5vYf.shtml

相关文章

微信公众号之开发者工具

一、前言 这次的项目主要是关于微信公众号的一个开发,本人这次分配的模块是后台微信公众号的支付和退款,第一次接触微信公众的项目刚开始一脸懵逼,开发过程中遇到各种坑,所以想自己写一篇详细的关于微信公众号的开发,希望能对小伙伴们有所帮助!在开发过程中会设计到微信接…

微信公众号 几种移动端UI框架介绍

微信公众号 几种移动端UI框架介绍 微信公众号开发&#xff0c;主要是移动端网页的页面开发&#xff0c;在这里推荐3个移动端UI框架&#xff1a;WeUI、SUI和Mint UI。 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计&#xff0c;可以令用户在HTML5应用中的使用…

微信公众号号开发小记(六)使用开源框架开发

到了现在&#xff0c;必须要正视一个问题了&#xff0c;之前所作的都是不推荐的&#xff0c;为什么&#xff0c;因为你没发现之前咱们还在调用官方API接口吗&#xff1f;还在写程序去获取token机械json数据呢&#xff1f;而且json数据咱们还要自己拼接&#xff0c;这可是不行的…

WxJava微信公众号开发实战

本文从本人博客搬运&#xff0c;原文格式更加美观&#xff0c;可以移步原文阅读&#xff1a;WxJava微信公众号开发实战 之前我们介绍了Java如何进行微信公众号开发&#xff0c;阅读本文前小伙伴们可以先去了解下Java微信公众号开发 之前我们开发微信公众号时&#xff0c;都是…

【程序源代码】微信公众号开发框架

关键字&#xff1a;java 管理系统 公众号开发框架 正文 | 内容 01 — 【概述】 本项目基于Spring Cloud 和Ant Design Pro实现前后端管理平台一站式脚手架&#xff0c;便于快速开发企业级应用。 02 — 【技术框架】 软件架构 核心框架&#xff1a;Spring Boot 2.2.5.RELEAS…

微信公众号开发(三)前端界面

有问题可以关注公众号&#xff1a;提着月亮去火星 由于该公众号主要的用途是用于公司售后服务,经沟通确定相关需求. 第一: 了解相关的UI框架,最终选定了Jquery-WeUI框架. 第二: 制作简单案例,在移动端进行测试,要达到移动端的自适应. 目前完成三个界面如下: 上面的就是 目前…

Java开发微信公众号之整合weixin-java-tools框架开发微信公众号

微信开发者接入文档 &#xff1a; https://mp.weixin.qq.com/wiki?tresource/res_main&idmp1421135319 微信公众平台测试账号申请&#xff1a; http://mp.weixin.qq.com/debug/cgi-bin/sandbox?tsandbox/login 一、前言 首先&#xff0c;在要做微信项目开发前&#xf…

微信公众号开发入门

实在是太折腾&#xff0c;太难懂了。也太坑了。 下面是这几天来&#xff0c;有关微信公众号的工作总结。算不上全面&#xff0c;只是作为一个初学者的记录&#xff0c;仅以备忘。 一、微信公众号开发&#xff0c;开发什么&#xff1f; 公众号与小程序不同。小程序类似手机AP…

微信公众平台快速开发框架源码

ASP.NET微信快速开发框架源码 微信公众平台快速开发框架源码 框架主要技术&#xff1a; ASP.NET MVC5、ASP.NET Identity、Bootstrap、KnockoutJs、Entity Framework等。 主要特色&#xff1a; 快速迭代开发&#xff0c;提供最好的威信开发框架&#xff1b; 基于ASP.NET MVC5Bo…

微信公众号开发,原来这么简单?[java框架]

终于有时间更新啦&#xff01;&#xff01;最新教程双手奉上&#xff01;公众号开发之wx-toolsspringboot应用实战-音乐爬虫推送[JAVA] 下面都是旧的教程&#xff0c;建议参考上面最新的教程~~ 可能你不知道&#xff0c;有个框架叫wx-tools&#xff08;小心翼翼地说&#xff09…

公众号开发(2) —— 盛派.net SDK + vue搭建微信公众号网页开发框架

需求&#xff1a;通过微信公众号菜单跳转到手机端网页&#xff0c;跳转后通过微信授权登录获取微信公众号用户的OpenId&#xff08;用户关注公众号后&#xff0c;用户在公众号的唯一凭证&#xff09;&#xff0c;通过OpenId和后台数据库用户信息绑定起来并实现一些业务逻辑。 技…

微信公众号开发框架讲解

微信公众号的开发在基于微信给的开发文档基础上&#xff0c;特别做微商城那底层用Java框架会相当方便。下面长沙Java培训给大家具体讲讲微信公众号开发框架&#xff1a; 核心框架&#xff1a;Spring Boot2 Spring Cloud Alibaba Spring Cloud Gateway 配置中心、注册中心&am…

人工智能博弈树极大极小搜索算法alpha-beta剪枝实现五子棋,带禁手

由于2020的特殊情况&#xff0c;导致了一个被拖了挺久的大作业。。。。 五子棋其实大家很多时候会在闲暇时刻和朋友随便玩玩&#xff0c;这不仅让我回忆起了高中时候摸鱼休息就喜欢和同学在自己打的格子中用铅笔来一盘五子棋&#xff0c;回想起来确实是至今以来最快乐的一段时光…

基于Python的人机交互的五子棋博弈树搜索

1. 算法原理 1.1 博弈树 博弈树针对的是二人零和博弈的问题&#xff0c;二人轮流行动&#xff0c;行动时令自己的优势最大。二人零和博弈有如下特点&#xff1a; 确定性&#xff1a;二人的行动有多种选择&#xff0c;但最终的行动是确定的信息完备性&#xff1a;博弈双方知道…

C++实现基于博弈树的5x5一子棋人机对战

基于博弈树的5x5一子棋人机对战 919106840637实验2 这是智能计算三个课程实验的第二个实验&#xff0c;即博弈树搜索 。我之前对博弈树的了解不多&#xff0c;所以实现起来比较的简略&#xff0c;仅仅是基本达到了要求 实验语言 C 实验内容 实践博弈树搜索——“5x5格子的一…

人工智能作业——搜索树博弈树一阶逻辑表达式CNF范式

1. 人工智能定义 1. 简述什么是人工智能 人工智能可分为两个维度:一个维度是从思维推理过程到行为结果(过程与结果);另一个维度是与人类表现的逼真度到数学与工程结合后的精确性(主观与客观)。 像人—样行动&#xff1a;图灵测试的途径&#xff1b;像人—样思考&#xff1a;认…

AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台

AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台 前言一、AlphaBeta剪枝是什么&#xff1f;1.由来, 最大最小决策树2.发展3. AlphaBeta剪枝 二、实验算法伪代码三、实验算法代码四、实验结果在这里插入图片描述 五、感谢 前言 产生本文的缘由 人工智能原理课程 可选实验 “…

并行博弈树搜索算法-第3篇 优秀的园丁:Alpha-Beta算法

3.1 Alpha-Beta算法 虽然博弈树的状态是有限的,但是状态个数却非常多.假设博弈树的深度为d,每个结点有b个分支,即分支因子&#xff08;branchingfactor&#xff09;为b,那么使用Min-Max方法搜索这个博弈树需要搜索个结点. 然而幸运的是,Min-Max方法的一些搜索是没有必要的,…

利用α-β搜索的博弈树算法编写一字棋游戏 python

游戏规则 “一字棋"游戏&#xff08;又叫"三子棋"或"井字棋”&#xff09;&#xff0c;是一款十分经典的益智小游戏。“井字棋"的棋盘很简单&#xff0c;是一个 33 的格子&#xff0c;很像中国文字中的"井"字&#xff0c;所以得名"井字…

博弈树 极小极大分析法

一、博弈概述 博弈特点&#xff1a; &#xff08;1&#xff09;博弈的初始格局是初始节点 &#xff08;2&#xff09;在博弈树中&#xff0c;“或”和“与”是交替出现的。自己一方的扩展节点是“或”关系&#xff0c;对方扩展的节点是“与”关系。双方轮流扩展节点。 &…