[.NET] 简单接入微信公众号开发:实现自动回复

简单接入微信公众号开发:实现自动回复

一、前提

  先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID、开发者密码、IP白名单、令牌和消息加解密密钥等)。

二、基本配置信息解读

  开发者ID:固定的;

  开发者密码:自己扫一下就可以看到;

  IP白名单:设置自己配置服务器的地址;

  服务器地址(URL):稍后详解;

  令牌:随便写,按规则;

  消息加解密密钥:随便写,或者随机生成;

三、配置服务器地址(URL)

  服务器地址(URL)应该怎么配置呢?图片上的配置的地址是:http://www.nidie.com.cn/wechat ,那么它对应的控制器应该是怎么样子的呢?

  在这里,我使用了第三方的包,需要通过 Nuget 来安装:

  <package id="Senparc.Weixin" version="4.22.1" targetFramework="net471" />
  <package id="Senparc.Weixin.MP" version="14.14.0" targetFramework="net471" />
  <package id="Senparc.Weixin.MP.MVC" version="5.4.5" targetFramework="net471" />

  接下来新建一个 WeChatController.cs:

using System.Threading.Tasks;
using System.Web.Mvc;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MvcExtension;
using Wen.MvcDemo.Application.WeChat.MessageHandlers.CustomMessageHandlers;
using Wen.MvcDemo.Infrastructure.Configuration;

namespace Wen.MvcDemo.Web.Controllers
{
    /// <summary>
    /// 微信
    /// </summary>
    public class WeChatController : Controller
    {
        #region private static field

        private static readonly string AppId = ApplicationSettingsFactory.GetApplicationSettings().WeChatAppId;

        private static readonly string EncodingAesKey = ApplicationSettingsFactory.GetApplicationSettings().WeChatEncodingAesKey;

        private static readonly string Token = ApplicationSettingsFactory.GetApplicationSettings().WeChatToken;

        #endregion private static field

        /// <summary>
        /// 微信后台验证地址
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="echostr"></param>
        /// <returns></returns>
        [HttpGet]
        public ActionResult Index(string signature, string timestamp, string nonce, string echostr)
        {
            return Content(echostr);
        }

        /// <summary>
        /// 处理用户发送消息后
        /// </summary>
        /// <param name="postModel"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ActionResult> Index(PostModel postModel)
        {
            //校验签名
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
                return new WeixinResult("参数错误!");

            postModel.AppId = AppId;
            postModel.EncodingAESKey = EncodingAesKey;
            postModel.Token = Token;

            //接收消息,自定义 MessageHandler,对微信请求进行处理
            var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);

            //执行微信处理过程
            await messageHandler.ExecuteAsync();
            //返回处理结果
            return new FixWeixinBugWeixinResult(messageHandler);
        }
    }
}

  

  代码分析:

  里面主要包含了三个静态字段和两个 Index 方法。

  其中静态字段对应的就是基本配置信息里面对应的几个参数,平常都是写入配置文件中来进行读取。

  其中一个标识特性为 HttpGet 的 Index 方法,它是用来通过服务器地址(URL)验证的,当你成功部署到你的服务器后,再点击提交认证就可以通过了。注意的是,需要将代码先提交到服务器,再进行提交确认。

  可能你看到该方法好像只返回 return Content(echostr); 这么简单的代码感到质疑:这能行吗?“我”记得官方文档好像要调用很复杂的方法进行校验才行的!?

  上图就是官方文档,但是我只关心通过配置提交认证,也就是我用红圈着色的部分,即原样返回 echostr 参数内容即可。

  第二个是实现 Post 请求的 Index 方法,在这里我进行了签名校验(也就是上图文档的校验逻辑),因为使用了第三方库,我们知道传哪些参数过去就可以了,签名通过后就是读取请求信息并进行后续处理的步骤了。

四、请求处理

  在上面的处理请求信息的代码中,我自定义了一个类 CustomMessageHandler 来处理消息。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Senparc.Weixin.MP.AppStore;
using Senparc.Weixin.MP.AppStore.Utility;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MessageHandlers;

namespace Wen.MvcDemo.Application.WeChat.MessageHandlers.CustomMessageHandlers
{
    /// <summary>
    /// 自定义消息处理
    /// </summary>
    public class CustomMessageHandler : MessageHandler<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel = null, int maxRecordCount = 0, DeveloperInfo developerInfo = null) : base(inputStream, postModel, maxRecordCount, developerInfo)
        {
        }

        public CustomMessageHandler(XDocument requestDocument, PostModel postModel = null, int maxRecordCount = 0, DeveloperInfo developerInfo = null) : base(requestDocument, postModel, maxRecordCount, developerInfo)
        {
        }

        public CustomMessageHandler(RequestMessageBase requestMessageBase, PostModel postModel = null, int maxRecordCount = 0, DeveloperInfo developerInfo = null) : base(requestMessageBase, postModel, maxRecordCount, developerInfo)
        {
        }

        /// <summary>
        /// 默认
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
            responseMessage.Content = $"您好,目前使用的微信公众号仍处于开发阶段,现已接入了【图灵机器人】,您可以尝试和他(她)交流。";
            return responseMessage;
        }
    }
}

  

  CustomMessageHandler 类继承了 MessageHandler 类,然后重写了 DefaultResponseMessage() 方法,返回固定的文本值。base.CreateResponseMessage<T>() 方法可以返回多种不同类型的结果值,如:

ResponseMessageText - 对应文本消息

ResponseMessageNews - 对应图文消息

ResponseMessageMusic - 对应音乐消息

ResponseMessageXXX - 其他类型以此类推

  

  上述方法只是一种默认的消息处理,我们也可以专门针对不同的请求类型做出不同的回应,比如重写 OnTextRequest(),其它重载需要自己观察基类成员:

        /// <summary>
        /// 文本请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = $"您刚才发送的文字信息是:{requestMessage.Content}。";  //\r\n用于换行,requestMessage.Content即用户发过来的文字内容
            return responseMessage;
        }

  因为在继承 MessageHandler<T> 类的同时,我创建了一个 CustomMessageContext 自定义消息上下文的类,该类内容如下,并没有包含其它方法,直接继承 MessageContext<IRequestMessageBase, IResponseMessageBase> 即可:

using Senparc.Weixin.Context;
using Senparc.Weixin.MP.Entities;

namespace Wen.MvcDemo.Application.WeChat.MessageHandlers.CustomMessageHandlers
{
    /// <summary>
    /// 自定义消息上下文
    /// </summary>
    public class CustomMessageContext : MessageContext<IRequestMessageBase, IResponseMessageBase>
    {
    }
}

  

  这样,就完成了所有代码的编写,现在我们再次把代码部署好之后就可以开始进行测试了。

  因为我除了部署自己的站点之外,还接入了【图灵机器人】回复,所以你看到了两条信息。

原文地址:https://www.cnblogs.com/liqingwen/p/9219454.html

时间: 2024-10-09 23:32:53

[.NET] 简单接入微信公众号开发:实现自动回复的相关文章

Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有(如图): 附上解析xml类的依赖: 1 <!-- dom对象读取写入xml文件 --> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId>dom4j</artifactId>

开发微信公众号后台,原来这么简单?[微信公众号开发]

可能你不知道,有个框架叫wx-tools(小心翼翼地说) Wx-tools是基于微信公众平台API的轻量级框架. 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台. 博主最近终于有空!!已经更新到2.0.0啦!! GitHub仓库 下载wx-tools-2.0.0.jar wx-tools开发文档及demo 据说看到文档最后的都是真爱粉! 不多说!讲讲使用wx-tools开发轻量级公众号到底有多简单? 简单到哭 就三步! 1. 创建web工程,添加jar包及依赖 2. 配置w

4.微信公众号开发:自动回复用户消息

在上一篇文章里 我们配置好和微信交互的URL里 我们就能接收到微信用户发送的消息了 我只需要判断消息的类型或者其他处理其他的业务逻辑 比如你可以根据他发的关键字来处理 他发订单号 你收到后可以去数据库查询 然后在反馈给他 这里我们就简单回复好了 比如他发送什么消息 我们就返回什么消息 首先是我封装的微信类 <?php /** * 微信公众平台操作类 */ class WeChat { private $_appid; private $_appsecret; //微信公众平台请求开发者的服务器需

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微

[转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台

先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数: function CheckSignature(const signature, timestamp, nonce, token: string): boolean; var strs: TStringList;   tmpStr: string; begin strs := TStringList.Create;   try     strs.Add(token);     strs.A

微信公众号开发纪要(2)-微信公众号接入

当搭建好微信公众号开发环境后,先要和微信公众号建立联系.从本质上来说,微信公众号开发就是如何让自己的服务器与微信服务器进行交互的一个过程. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器然后将请求转发给我们的应用服务器.应用服务器处理完毕后,将响应数据回发给微信服务器,微信服务器再将具体响应信息回复到微信App终端. 通信协议为:HTTP 数据传输格式为:XML 具体的流程如下图所示: 来一张更加直观的图吧: 我们需要做的事情,就是对微信服务器转发的HT

微信公众号开发--接入

微信公众号开发 微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 需要绑定开发者账号:微信公众平台--开发者工具--web开发者工具--绑定开发者微信号 微信公众平台接口调试工具:https://mp.weixin.qq.com/debug/ 接口调试需要使用"access_token",access_token的获取需要从在基本设置中的url访问获取,其他终端基本无法获取 1

微信公众号开发简单的网页授权登陆获取用户基本信息

由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息. 但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程. 首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信开发文档

利用OpenShift托管Node.js Web服务进行微信公众号开发

最近写了一个微信的翻译机器人.用户只要关注该微信号,发送英文的消息,就能收到中文翻译的回复.后台是用Node.js写的,托管在OpenShift的Paas平台上.翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块.下面把做的过程详细说一下. 1. 微信公众号开发 首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者.目前个人只