zoukankan      html  css  js  c++  java
  • C#微信开发小白成长教程一(公众平台的工作原理与调试环境部署,附视频)

        黑夜给了我黑色的眼睛,我决定录视频到天明。半年前的现在,我还在苦逼着加着班,半年后的今天我依旧苦逼着加着班。不过现在的是为自己加班,作为一个资深程序小白,一个月前我光荣的成了一个不称职的资本家,不称职的原因有二:一是我人丑钱少脸皮薄(没有资本),而是我先阶段还只能剥削我自己。

        回想着半年的历程,好像发生很多事。从由于辛辛苦苦准备的微信培训资料被公司的同事忽视而在博客园写下的第一篇微信教程,到电子出版社的编辑联系到我商讨出版的事,从签订出版合同到开始写下书的第一个字,从每天加班到凌晨回去还得加班写会书再到前段时间的全职写我的这个处女作。冷暖自知。

        距离上次写博客已经过去差不多四五个月了,但现在回头看看之前的博客感觉还是差点什么。推到重写也是需要勇气的,因为现在对于我来说自由的时间相对多些,可以持续的更新我的这个系列教程,希望能帮助更多的朋友进入微信开发者的行列。

       废话少说了,说说写这样一篇博文的原因吧。说实在的,在平常在群里和其他微信开发者进行交流的时候发现好多人都不是很了解微信的工作原理, 微信的接口原理,以至于遇到点小问题就在群里问,其中也不乏一些有一定微信开发经验的朋友。所以本篇博文也算是微信开发的脱盲引导篇了吧

        感觉上面还是废话。。。。。。。。。。。。。。。。。。

    工作原理

       直观上,我们看到的微信公众号的工作流程是这样的:用户发送消息或者点击公众号的自定义菜单,服务器收到用户的请求后,根据业务逻辑回复给用户对应的消息,如文本、图文、视频、音频等。学过网络的人看着一定很熟悉,这就是典型的http请求。

    image

       http请求方式

          微信公众平台的自动回复功能就和http的原理一致,而开发者根据微信官方提供的接口来定制自己的公众平台时,就稍微有点差别了。首先,当用户在微信里给公众号发送消息或者点击微信自定义菜单时,微信手机客户端将这条消息发送到微信服务器,其次,微信服务器收到用户的请求后,根据具体的业务逻辑再将消息推送给开发者设置的url,这个url对于微信服务器来说就是一个服务器,微信服务器此时充当的是客户端的角色,开发者的服务器收到微信服务器推送过来的请求后,根据微信提供的规则解析出用户发送的消息内容,然后再根据具体的业务逻辑将响应的内容回复给微信服务器,微信服务器再返回给用户。在整个过程中,开发者的服务器对于用户来说是透明的。如下图所示:

    image

         微信开发者需要做的就是开发者服务器这一块的业务,然后结合微信提供的其他一些功能接口进行开发。 如用户管理、素材管理、微信支付、微信小店等。

        个人觉得可以将微信的接口分为两类:一类是被动请求接口,就是类似于上图所示的用户主动发送消息,开发者解析消息内容后进行回复。这种类型的接口是微信主动请求开发者的程序,数据传输使用XML格式数据。另一类主动请求接口,比如获取access_token接口,由微信服务器提供接口,开发者只需按照接口的请求方式,数据格式进行调用即可,这种接口的数据传输使用的是JSON格式数据(微信支付相关接口是个例外,使用的是XML格式)。总结一下就是:被动请求接口是开发者按照微信的规定协议进行接口开发,由微信服务器进行调用。而主动请求接口就是微信接口开发完毕后,将调用协议告诉开发者,由开发者进行调用。 所以两种场景下,开发者的服务器与微信服务器之间的角色是在变化的。

    HTTP请求与响应

       以上的两种类型,不管是微信服务器作为客户端还是开发者的服务器作为客户端,请求的方式都是基于HTTP的。所以在此简单讲下HTTP请求怎么调用接口的。在此给大家推荐一个工具(谷歌浏览器的插件postman),这个插件可以很方便的发起HTTP请求。如下图所示:

    image

         在上图中,我调用的是获取access_token的接口。请求方式是GET。在我们编写程序时,需要使用程序的方式来发起HTTP请求。具体的实现GET请求的实现是:

         System.Net命名空间下的WebRequest类的Create方法,初始化一个请求实例。

         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

         然后设置下常用的请求头

         request.Method = "GET";//设置请求的方法。这里表示的是请求的方式是GET

         request.Accept = "*/*";//设置Accept标头的值

        最后调用请求实例的GetResponse()方法,获取响应流,并将响应流转换成字符串。完整的实现代码如下所示:

    /// <summary>
    /// HTTP GET方式请求数据.
    /// </summary>
    /// <param name="url">请求的url</param>
    /// <returns>响应信息</returns>
    public static string HttpGet(string url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";//设置请求的方法
         request.Accept = "*/*";//设置Accept标头的值
         string responseStr = "";
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())//获取响应
         {
            using (StreamReader reader = 
    new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
              responseStr = reader.ReadToEnd();
            }
         }
         return responseStr;
    }

    GET请求的方法创建完后,就可以根据上述的代码创建一个POST方法。需要注意的是,如果绝大部分情况下接口POST的请求是需要POST数据包的,所以设置请求的ContentType为application/x-www-form-urlencoded,这里默认先不考虑带文件的FORM表单的提交,在后面的系列使用到的时候会详细讲解。如下所示为POST请求的方法:

    /// <summary>
    /// HTTP POST方式请求数据
    /// </summary>
    /// <param name="url">URL.</param>
    /// <param name="param">POST的数据</param>
    public static string HttpPost(string url, string param)
    {
    //当请求为https时,验证服务器证书
        ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback((a,b,c,d) =>{return true;});
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Accept = "*/*";
        request.Timeout = 15000;
        request.AllowAutoRedirect = false;
        string responseStr = "";
    using (StreamWriter requestStream = 
    new StreamWriter(request.GetRequestStream()))
         {
             requestStream.Write(param);//将请求的数据写入到请求流中
         }
        using (HttpWebResponse response =(HttpWebResponse) request.GetResponse())
         {
             using (StreamReader reader =new StreamReader(response.GetResponseStream(),Encoding.UTF8))
               {
                   responseStr = reader.ReadToEnd();//获取响应
               }
          }
          return responseStr;
    }

    XML与JOSN的使用

          由于在接口调用的过程中,XML和JSON是消息的格式, 那就需要知道该怎样从这样格式的字符串中提取到需要的信息。先来讲下XML吧。个人比较习惯使用Linq To XML的方法。如图所示,简单明了:

    imageimage

         JSON的序列化与反序列化使用newtonsoft.json,可以很方便的进行处理。关于这个第三方插件的使用,园子里已经有很多大神些的博客了,在此我就不废话了。

    IIS+花生壳+VS本地调试微信

        这里我以一个真实的微信代码作为演示。

           首选,安装后IIS后,在IIS里添加一个网站。

    imageimage

    如上图所示,物理路径为web项目的路径。其他的默认即可。保存之后记得给网站目录加上访问权限。

          下载并安装花生壳。下载地址(

    http://101.36.100.83/data/8/9a/f3/9af38abb6fd9266513288a0c79336d54.exe/realuri/peanuthull/windows/NewPhDDNS_2.3.0.33438.exe

           安装完成后,需要注册一个账号。新注册的账号可能会没有免费使用的权限,但是官网是可以申请到资格的。请自行申请。登陆后,界面如下:

          image

           进入如下页面:

           image

            点击添加映射:

            选择当前主机,并勾选使用http80端口。

           image

          确定后,如果不出意外的话就可以正常使用了。

          如下图所示, 我的项目处理微信服务器请求的页面是根目录的wx.ashx页面。

          image

         为了保险起见,可以在浏览器访问下这个页面的url(http://ypyle.xicp.net/wx.ashx),看本地映射是否成功。

    image

            状态为200,说明映射成功了。

           然后在vs中依次进入【调试】→【附加到进程】

           image 

           进入如下页面,选择w3wp进程:

           image

            点击附加按钮,进入即可进入调试。下面就是让微信服务器调用我们的本地计算机了。在微信公众号接入的时候,需要get请求到开发者的服务器,所以,这里使用接入url进行演示。

           如图所示,填写好信息后,点击提交按钮:

           image

            如下图所示,微信请求了上图填写的url,顺利进入了断点:

             image

           

          附视频教程:http://pan.baidu.com/s/1c0o7scg

         本人才疏学浅,人丑钱少脸皮薄,所以文章或视频中有错误或不妥之处,欢迎各位同仁指教。

         如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,   点击这里给我发消息

         如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。

         如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。

         如果你司需求微信开发项目合作,可以私聊我QQ。

      

  • 相关阅读:
    [LeetCode] Best Time to Buy and Sell Stock
    [LeetCode] Generate Parentheses
    [LeetCode] Best Time to Buy and Sell Stock 2
    [CareerCup][Google Interview] 打印组合
    [微软][笔试] 找出最大序列对
    系统之间的接口测试
    进销存业务的自定义分解
    查找数据库中所有有自增列的用户表
    由创建文件想起的。。。
    反编译想到的代码安全问题
  • 原文地址:https://www.cnblogs.com/zskbll/p/4532256.html
Copyright © 2011-2022 走看看