黑夜给了我黑色的眼睛,我决定录视频到天明。半年前的现在,我还在苦逼着加着班,半年后的今天我依旧苦逼着加着班。不过现在的是为自己加班,作为一个资深程序小白,一个月前我光荣的成了一个不称职的资本家,不称职的原因有二:一是我人丑钱少脸皮薄(没有资本),而是我先阶段还只能剥削我自己。
回想着半年的历程,好像发生很多事。从由于辛辛苦苦准备的微信培训资料被公司的同事忽视而在博客园写下的第一篇微信教程,到电子出版社的编辑联系到我商讨出版的事,从签订出版合同到开始写下书的第一个字,从每天加班到凌晨回去还得加班写会书再到前段时间的全职写我的这个处女作。冷暖自知。
距离上次写博客已经过去差不多四五个月了,但现在回头看看之前的博客感觉还是差点什么。推到重写也是需要勇气的,因为现在对于我来说*的时间相对多些,可以持续的更新我的这个系列教程,希望能帮助更多的朋友进入微信开发者的行列。
废话少说了,说说写这样一篇博文的原因吧。说实在的,在平常在群里和其他微信开发者进行交流的时候发现好多人都不是很了解微信的工作原理, 微信的接口原理,以至于遇到点小问题就在群里问,其中也不乏一些有一定微信开发经验的朋友。所以本篇博文也算是微信开发的脱盲引导篇了吧
感觉上面还是废话。。。。。。。。。。。。。。。。。。
工作原理
直观上,我们看到的微信公众号的工作流程是这样的:用户发送消息或者点击公众号的自定义菜单,服务器收到用户的请求后,根据业务逻辑回复给用户对应的消息,如文本、图文、视频、音频等。学过网络的人看着一定很熟悉,这就是典型的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项目的路径。其他的默认即可。保存之后记得给网站目录加*问权限。
下载并安装花生壳。下载地址(
)
安装完成后,需要注册一个账号。新注册的账号可能会没有免费使用的权限,但是官网是可以申请到资格的。请自行申请。登陆后,界面如下:
进入如下页面:
点击添加映射:
选择当前主机,并勾选使用http80端口。
确定后,如果不出意外的话就可以正常使用了。
如下图所示, 我的项目处理微信服务器请求的页面是根目录的wx.ashx页面。
为了保险起见,可以在浏览器访问下这个页面的url(http://ypyle.xicp.net/wx.ashx),看本地映射是否成功。
状态为200,说明映射成功了。
然后在vs中依次进入【调试】→【附加到进程】
进入如下页面,选择w3wp进程:
点击附加按钮,进入即可进入调试。下面就是让微信服务器调用我们的本地计算机了。在微信公众号接入的时候,需要get请求到开发者的服务器,所以,这里使用接入url进行演示。
如图所示,填写好信息后,点击提交按钮:
如下图所示,微信请求了上图填写的url,顺利进入了断点:
附视频教程:http://pan.baidu.com/s/1c0o7scg
本人才疏学浅,人丑钱少脸皮薄,所以文章或视频中有错误或不妥之处,欢迎各位同仁指教。
如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,
如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。
如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。
如果你司需求微信开发项目合作,可以私聊我QQ。
C#微信开发小白成长教程一(公众平台的工作原理与调试环境部署,附视频)的更多相关文章
-
C#微信开发小白成长教程二(新手接入指南,附视频)
距离第一讲又已经过去了一个多星期了,本打算一周更新一讲的,奈何实在太忙.最近也在群里发现有一部分人已经可以熟练调用微信的部分接口但却不是很清楚微信公众平台接收消息的一个处理机制.本讲就来介绍下怎么接入 ...
-
微信公众号开发系列教程一(调试环境部署续:vs远程调试)
http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...
-
微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...
-
使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...
-
Android开发:图文分析 Handler通信机制 的工作原理
前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...
-
php微信开发自动回复一直提示“该公众号提供的服务出现故障,请稍后再试”
坑:服务器可以接受到发到公众号的信息,但是公众号不能回复,直接echo " ";exit();也会提示“该公众号提供的服务出现故障,请稍后再试”: 可能原因:用的php,是把数组转 ...
-
Zabbix实战-简易教程--通过公众平台企业号发送短信
一.注册企业号[体验号] 打开页面 http://qydev.weixin.qq.com/try?t=experience (2016年注册的时候的连接)现在可能变了.进行注册操作,默认有90天的 ...
-
使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...
-
使用java开发微信公众平台(1)
目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...
随机推荐
-
Linux搭建Nginx
1.Nginx安装 1.1 pcre (1)下载编译包 http://www.pcre.org/ (注意需要的是pcce,而非pcre2) (2)tar -zxvf pcre-8.36.tar.gz ...
-
Android之AlertDialog.Builder详解
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; ...
-
02_天气查询_socket方式模拟_单线程
[远程请求的B/S模式(客户端/服务器)] TCP: 是一种传输层协议,一种面向连接的协议.经过三次握手客户端和服务器端连接一个连接(通道).提供可靠的数据传输,该协议一般服务质量要求比较高的情况,T ...
-
jquery 缓冲加载图片插件 jquery.lazyload
第一:加入jquery 第二:加入jquery.lazy.load.js文件 第三:在网页中加<script> $(document).ready(function(){ $(" ...
-
JSONP跨域的原理
一种脚本注入行为 在 2011年10月27日 那天写的 已经有 12671 次阅读了 感谢 参考或原文 服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...
-
对 dotweb 框架进行统一的自定义错误处理
助移动端的增长,如今 RESTful 风格的 API 已经十分流行, 用各种语言去写后端 API 都有很成熟方便的方案,用 golang 写后端 API 更是生产力的代表, 你可以用不输 python ...
-
Windows 7安装Tensorflow
以前是在Cent OS中运行Tensorflow,,经常需要切换操作系统,很不方便,于是决定在Windows 7下安装Tensorflow. 过程还是挺复杂的,需要安装的包括:Visual Studi ...
-
大数据入门第十二天——flume入门
一.概述 1.什么是flume 官网的介绍:http://flume.apache.org/ Flume is a distributed, reliable, and available servi ...
-
多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)
多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...
-
Ping用法大全
Ping是典型的网络工具.Ping可以辨别网络功能的某些状态. 这些网络功能的状态是日常网络故障诊断的基础.特别是Ping可以识别连接的二进制状态(也就是是否连通).可是,这仅仅是 ...