zoukankan      html  css  js  c++  java
  • 微信开发流程(一)

    因为微信公众号,订阅号,服务号,是否认证原因,接口权限不同,所以使用微信测试号可以测试使用大多数的接口实现功能,和学习微信开发的相关知识。

    1.测试号信息,appID和appsecret是获取验证的重要凭证

    2.接口配置信息,需要我们进行输入,对应的域名和token

    一个可以使用80端口访问的域名或IP,虚拟主机、花生壳映射内网、VPS、独立服务器都可以。

    3.微信公众平台SDK Senparc.Weixin for C#,支持.NET Framework及.NET Core。已支持微信公众号、小程序、小游戏、企业号、企业微信、开放平台、微信支付、JSSDK、微信周边等全平台。 WeChat SDK for C#. https://weixin.senparc.com

         

     3.使用vs2017创建weixin项目

        使用nuget安装Senparc.Weixin.MP插件

    Controllers/WeixinController.cs

    下面的Token需要和微信公众平台后台设置的Token同步,如果经常更换建议写入Web.config等配置文件(实际使用过程中两列建议使用数字+英文大小写改写Token,Token一旦被破解,微信请求将很容易被伪造!):

    public readonly string Token = "weixin";

    下面这个Action(Get)用于接收并返回微信后台Url的验证结果,无需改动。地址如:http://domain/Weixin 或 http://domain/Weixin/Index

    /// <summary>
    /// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
    /// </summary>
    [HttpGet]
    [ActionName("Index")]
    public ActionResult Get(PostModel postModel, string echostr)
    {
        if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
        {
            return Content(echostr); //返回随机字符串则表示验证通过
        }
        else
        {
            return Content("failed:" + postModel.Signature + "," 
                + MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "" +
                "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
        }
    }

    上述方法中的PostModel是一个包括了了Signature、Timestamp、Nonce(由微信服务器通过请求时的Url参数传入),以及AppId、Token、EncodingAESKey等一系列内部敏感的信息(需要自行传入)的实体类,同时也会在后面用到。

    下面这个Action(Post)用于接收来自微信服务器的Post请求(通常由用户发起),这里的if必不可少,之前的Get只提供微信后台保存Url时的验证,每次Post必须重新验证,否则很容易伪造请求。

    /// <summary>
    /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML
    /// </summary>
    [HttpPost]
    [ActionName("Index")]
    public ActionResult Post(PostModel postModel)
    {
        if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
        {
            return Content("参数错误!");
        }
        ...
    }
    如何处理微信公众账号请求?

    Senparc.Weixin.MP提供了2中处理请求的方式,传统方法及使用MessageHandler处理方法(推荐)。上面两个方法在wiki中已经有比较详细的说明,这里简单举例MessageHandler的处理方法。

    MessageHandler的处理流程非常简单:

    [HttpPost]
    [ActionName("Index")]
    public ActionResult Post(PostModel postModel)
    {
        if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
        {
            return Content("参数错误!");
        }
    
        postModel.Token = Token;
        postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
        postModel.AppId = AppId;//根据自己后台的设置保持一致
    
        var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息(第一步)
    
        messageHandler.Execute();//执行微信处理过程(第二步)
    
        return new FixWeixinBugWeixinResult(messageHandler);//返回(第三步)
    }

    整个消息除了postModel的赋值以外,接收(第一步)、处理(第二步)、返回(第三步)分别只需要一行代码。

    上述代码中的CustomMessageHandler是一个自定义的类,继承自Senparc.Weixin.MP.MessageHandler.cs。MessageHandler是一个抽象类,包含了执行各种不同请求类型的抽象方法(如文字,语音,位置、图片等等),我们只需要在自己创建的CustomMessageHandler中逐个实现这些方法就可以了。刚建好的CustomMessageHandler.cs如下:

    using System;
    using System.IO;
    using Senparc.Weixin.MP.MessageHandlers;
    using Senparc.Weixin.MP.Entities;
    
    namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler
    {
        public class CustomMessageHandler : MessageHandler<MessageContext>
        {
            public public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0)
                : base(inputStream, postModel, maxRecordCount)
            {
    
            }
    
            public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
            {
                //ResponseMessageText也可以是News等其他类型
                var responseMessage = CreateResponseMessage<ResponseMessageText>();
                responseMessage.Content = "这条消息来自DefaultResponseMessage。";
                return responseMessage;
            }
    
            public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
            {
                //...
            }
    
            public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
            {
                //...
            }
    
            //更多没有重写的OnXX方法,将默认返回DefaultResponseMessage中的结果。
            ....
        }
    }

    其中OnTextRequest、OnVoiceRequest等分别对应了接收文字、语音等不同的请求类型。

    比如我们需要对文字类型请求做出回应,只需要完善OnTextRequest方法:

     public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
          {
              //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs
              var responseMessage = CreateResponseMessage<ResponseMessageText>();
              responseMessage.Content = string.Format("您刚才发送了文字信息:{0}", requestMessage.Content);
              return responseMessage;
          }

    这样CustomMessageHandler在执行messageHandler.Execute()的时候,如果发现请求信息的类型是文本,会自动调用以上代码,并返回代码中的responseMessage作为返回信息。responseMessage可以是IResponseMessageBase接口下的任何类型(包括文字、新闻、多媒体等格式)。

    从v0.4.0开始,MessageHandler增加了对用户会话上下文的支持,用于解决服务器上无法使用Session管理用户会话的缺陷。详见:用户上下文WeixinContext和MessageContext

    学习:

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持。

    目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享。也欢迎大家的补充!

    1、开源项目:https://github.com/JeffreySu/WeiXinMPSDK

    2、微信技术交流社区:http://weixin.senparc.com/QA

    3、chm帮助文档下载:http://sdk.weixin.senparc.com/Document

    4、Senparc.Weixin SDK官网地址:http://weixin.senparc.com

    5、Senparc.Weixin.MP.Sample Demo地址:http://sdk.weixin.senparc.com

    6、微信开发资源收集:https://github.com/JeffreySu/WeixinResource

    7、Senparc.Weixin 官方图书教程:《微信开发深度解析:微信公众号、小程序高效开发秘籍》,配套辅助阅读系统:https://book.weixin.senparc.com

    转自:https://github.com/JeffreySu/WeiXinMPSDK

  • 相关阅读:
    类型化dataset分页
    cp自动创建层级结构的例子
    You have tried to change the API from what has been previously approved.
    Mysql学习笔记
    cygwin设置NDK环境变量ANDROID_NDK_ROOT
    PowerDesigner学习笔记
    Spring Cloud Commons教程(三)忽略网络接口
    Spring Cloud Commons教程(二)Spring RestTemplate作为负载平衡器客户端
    Spring Cloud Commons教程(一)普通抽象
    Spring Cloud教程(十二)加密和解密
  • 原文地址:https://www.cnblogs.com/xuqp/p/9764489.html
Copyright © 2011-2022 走看看