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

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

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

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

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

工作原理

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

http请求方式

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

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

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

HTTP请求与响应

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

在上图中,我调用的是获取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 = ;
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的方法。如图所示,简单明了:

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

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

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

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

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

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

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

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

进入如下页面:

点击添加映射:

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

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

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

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

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

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

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

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

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

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

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

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

如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,  

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

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

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

C#微信开发小白成长教程一(公众平台的工作原理与调试环境部署,附视频)的更多相关文章

  1. C#微信开发小白成长教程二(新手接入指南,附视频)

    距离第一讲又已经过去了一个多星期了,本打算一周更新一讲的,奈何实在太忙.最近也在群里发现有一部分人已经可以熟练调用微信的部分接口但却不是很清楚微信公众平台接收消息的一个处理机制.本讲就来介绍下怎么接入 ...

  2. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  3. 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...

  4. 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上

    在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...

  5. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

  6. php微信开发自动回复一直提示“该公众号提供的服务出现故障,请稍后再试”

    坑:服务器可以接受到发到公众号的信息,但是公众号不能回复,直接echo " ";exit();也会提示“该公众号提供的服务出现故障,请稍后再试”: 可能原因:用的php,是把数组转 ...

  7. 微信开发在Pc端调用公众号粉丝发送过来的图片素材

    因为项目要在PC端搞一个微信墙功能,就是把粉丝发送过来的上墙内容给展示出来,但因为微信对微信素材进行了防盗链加密处理,所以在非微信页面上直接引用在微信服务器上的图片的链接是无法显示的,只会显示一张微信 ...

  8. Zabbix实战-简易教程--通过公众平台企业号发送短信

    一.注册企业号[体验号] 打开页面 http://qydev.weixin.qq.com/try?t=experience   (2016年注册的时候的连接)现在可能变了.进行注册操作,默认有90天的 ...

  9. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...

随机推荐

  1. check_user_createdate.sh

    在前面这篇文章Linux如何找出用户的创建时间里面讨论了查看用户创建时间的方法,后面自己尝试弄了一个脚本来检查所有用户创建时间脚本,当然更合理的应该叫检查所有用户的密码修改时间比较准确(因为这种方法有 ...

  2. Spring AOP 动态代理 缓存

    Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...

  3. jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )

    jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop   在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...

  4. Storm系列(二):使用Csharp创建你的第一个Storm拓扑(wordcount)

    WordCount在大数据领域就像学习一门语言时的hello world,得益于Storm的开源以及Storm.Net.Adapter,现在我们也可以像Java或Python一样,使用Csharp创建 ...

  5. CentOS6.5 oracle 11g R2 开机自动启动

    1.root 用户下修改ORATAB(将N该为Y): [root@ora11gr2 ~]# vim /etc/oratab mytest:/oracle/product//db_1:Y 2.oracl ...

  6. dpdk在虚拟机上出错处理

    目录 1. 所用系统与软件版本 2. 虚拟机配置 3. Ubuntu 12.04上的配置 3.1 准备 3.2 通过setup脚本进行配置 3.3 通过命令配置 4. CentOS 7.0上的配置 4 ...

  7. 在报表中给session赋值实现报表间参数共享

    1. 问题描述 在报表开发工具FineReport中,若有几张不同的报表,每张报表都有一个共同的项可以选择,比如日期时间.我们希望选择了第一张报表的时间之后,其他报表的默认时间都变为第一张报表选择的时 ...

  8. 第二届中国移动互联网测试大会PPT

    第二届中国移动互联网测试大会PPT下载_360云盘 (提取密码:7799) 第二届中国移动互联网测试大会PPT下载_百度云盘 (提取密码: ws8m) 第二届中国移动互联网测试大会PPT下载_Goog ...

  9. Integer & int & == & equals

    int 是基本类型,直接存数值,integer是对象,用一个引用指向这个对象 int 是基本数据类型,Integer是类 int类的变量初始为0,Integer的变量则初始化为null. 如果只是用来 ...

  10. AC日记——基因相关性 openjudge 1.7 03

    03:基因相关性 总时间限制:  1000ms 内存限制:   65536kB 描述 为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性 ...