在上期第一讲中,我们讲解了如何申请微信公众号,公众平台开发的基本原理以及用花生壳搞定服务器环境的搭建。这一讲开始,我们正式进入微信公众号的开发。
1.微信接口
我们前一篇已经讲了,微信平台(不管是订阅号还是服务号)和我们的网站进行交互时,都是通过微信平台开放给外部系统的接口调用来实现的,也就是说,粉丝向公众号发送一次交互(文字,图片,声音或者菜单点击都算交互)后,微信平台会向你配置的url所对应的网站发出调用请求,来执行你的网站的代码,在代码中你进行各种处理后返回一个处理结果。
你的网站具体使用什么语言来开发取决于你自己的爱好,不过我建议大家使用php来做,因为目前做web开发php是最方便的,当然你也可以用Java写,没关系的,我们以php为例说明。
微信平台在配置url时会验证一下你对应的这个url的网站是否真实存在,是否是你自己的网站。验证的原理很简单,你首先填写一个Token(你不用管这个是什么,只要记住它其实就是一个字符串符号,用来生成一个代表你自己身份的签名),然后填写你的网站的url,点击提交,如下图。
平台就会向这个url所对应的网站发送一个GET请求,同时携带4个参数。参数参考的说明,如下图。
其中timestamp是一个时间戳。时间戳其实就是从 1970年 1月 1日至当前时间的总秒数。你就数吧,从1970年 1月 1日到我们现在这个时刻一共流逝了多少秒那么这个时间戳就是多少。所以时间戳任何时刻都是不同的。Nonce和echostr都是平台产生的随机数。Signature也就是签名,它是经过如下计算得到的:
将当前时间戳(timestamp),nonce以及你输入的TOKEN按照字母顺序排序后拼接在一起形成一个字符串。例如: timestamp是345632,nonce是132a,TOKEN是123,那么我们先按照字母顺序排列,得到这样的顺序:123,132a,345632.然后拼接得到:123132a345632。最后经过SHA1加密运算得到签名Signature:E69E5E13D8B045923EF1BE38DF938F5621CA3004。SHA1是一个加密算法,细节这里就不讲了,这些参数一般都会通过查询参数的形式发送给我们网站的。
为了能够接受这些参数我们需要一个自己的php网站。Ok,我们现在就开始搭建这样的一个网站。
1.下载WAMP集成安装套件,这个很简单,大家一直点击“下一步”,最后点击一下“完成”就可以了,我是直接安装在C盘根目录的,安装好了以后的目录结构,如下图。 安装完成后我们可以看到,我们需要的apache,mysql和php都已经安装好了,而且默认帮你安装了一个管理工具,非常方便。最重要的就是www这个目录,这个是就我们即将要创建的网站的根目录。
2.进入www目录,新建一个index.php的文件,在里面只写入一行代码,如下图所示。
然后在浏览器里面输入localhost,如果出现上图的页面,说明我们的服务器环境是已经ok,我们就可以继续下一步了。
3.接下来,我们开始代码处理。我们首先获取平台传过来的4个参数,具体的代码见下面,里面已经有很详细的说明了哦。这里再说一下,为什么使用php,大家看到没有,用php 代码只有不到100行,而我之前用java实现过同样的功能,却花了500多行,这得益于php的很多函数已经帮我们做好了,我们可以直接使用。所以,php特别适合中小型网站的开发哦,大家也可以用其他语言换个方式实现一下试试。
这里再补充解释一下上面的代码:代码的处理过程是这样的,将传过来的时间戳timestamp,随机数nonce和你自己输入的TOKEN(你自己输入的,所以当然知道TOKEN是多少)排序,拼接,SHA1处理,最后得到一个签名。
因为我们得到这个签名的过程和平台处理的过程是一模一样的,所以我们得到的签名和平台发送给我们的签名Signature的值应该是一模一样的。
将得到的结果和传过来的签名Signature比较,如果相等,就返回echostr(echostr也是平台发给我们的参数哦)给平台,告诉平台我已经接受到了你的请求,而且这个请求在网络传输的过程中没有被篡改(因为签名相等)。这样验证就通过了,相当于和平台和我们的网站之间建立了一个可信的通信通道。
如果你看到平台显示下面的信息,说明验证通过了,你就可以正式开始你的微信开发了。
2.使用php开发微信服务器端
我们的微信商城其实就是一个web程序,只不过这个web程序的客户端不再是浏览器而是微信平台了,所以,任何支持web服务器端开发的语言都可以作为我们微信商城的开发语言,例如Java、php等。为什么这里我选择php呢,因为php是目前为止最适合web开发的语言,而且随着我们的深入,你会发现php在web开发上的强大之处,很多java要很多行代码才能够实现的功能,php只要一句代码就可以很好的实现了。所以,我们选择php作为我们的示例开发语言。
那么,大家在使用php开发时,我相信一提到调试,很多人还是会觉得很头疼,特别是新手更加是这样。我见过很多人抱怨php调试非常不方便,只能使用一些echo,print等输出语句输出变量值来进行调试,这样的确是非常麻烦的,因为这些输出语句无法设置断点。所以,我这里首先帮大家解决php断点调试的问题,因为没有这个断点调试的“利器”,以后的开发中出现问题,你想解决是很痛苦的。
说起php的断点调试,我相信很多同学首先想到的就是zend studio+zend debugger。没错,你可以这么做,但是,这么做就意味着你需要手动配置很多东西,而且还不一样能保证停留在断点处。这里,我就不饶湾子了,我教大家一个很方便的工具,直接安装一下就可以原来调试php了。
这个工具就是XAMPP+PhpEclipse的组合,其中XAMPP是一个集成安装包,里面包括了:Apache, MySQL、PHP和Perl。XAMPP其中的A代表Apache,M代表MySQL,第一个P代表PHP,第2个P代表Perl。这个工具自身携带了php调试功能xdbug,大家安装以后几乎不需要特意配置就可以用来调试php了。
下面请跟着我一步步来操作:
1.打开/zh_cn/download.html ,下载XAMPP for Windows1.8.2 & 1.8.3
2.解压该压缩包,并双击xampp-win32-1.8.0-VC9-installer.exe。
3.一直点Next,在选择文件安装位置时,选择安装在C:\盘根目录。
4.等待安装。
5.完成。
6.完成后会自动打开控制面板。其中1处是启动各种服务的按钮,2 是配置各种服务的按钮,3是查看各种服务的日志的按钮。
7.点击Apache,MySql的Start按钮,启动apache web服务器和mysql 数据库服务器,如下图。能看到Pid和ports的下方出现了值时表示服务启动成功。如果出现启动报错时,检查一下是否 相关的端口被占用了,修改配置文件里面的相关端口的配置后再重新启动试试。
下载并解压phpeclipse,点击运行,你会发现聪明的phpeclipse已经自动发现了xampp,并且已经自动帮你配置好了。
接下来很重要的一步,我们将创建一个php网站项目,并且验证一下我们的xampp是否能对我们的php网站进行调试。只有我们的调试能正常进行,以后的课程中我才能一步步的帮大家分析微信平台和我们的网站的交互过程的细节,大家才能真正明白原理,然后大家在实际中遇到问题时也可以使用调试来分析解决。
1.首先,新建一个php项目。增加一个php文件,里面随便加一些最简单的代码,并设置几个断点。这里注意:设置断点时一定不要双击来设置,一定要通过在左侧右键,然后在弹出的右键菜单里面选择:“Toggle Xdebug BreakPoint”来设置。这是因为双击设置的是java的断点,而我们是需要对php设置断点,必须通过右键的方式来设置,这样设置的才是php的断点,这样的断点XDebug才可以识别。否则,你很容易会出现莫名其妙的无法在断点处停住的问题。
2.接下来,打开我们的xampp的安装目录,我的是:C:\xampp\php,用记事本打开里面的php.ini配置文件。我们要把里面的最后一部分关于xdebug的配置前的注释打开,修改好之后的截图如下:
这样,我们就打开了xampp的xdebug调试功能。如果你不是很肯定是否已经打开了该调试功能,可以自己创建任意一个php项目,在里面写上一个文件,在该文件里面写上:phpinfo();然后执行,看看是否有如下输出:
3.我们已经完成了服务器端的配置。接下来需要在我们的phpeclipse里面设置,让我们的ide能够和我们服务器端的xdebug通信。跟我来,打开windows-prefrences下面的phpeclipse,按照如下图所示检查是否配置正确。
4.接下来就测试一下调试功能是否能正常调试了。在file.php上右击,选择debug as->debugconfiguration。
5.配置完保存后,以后调试时,只需要在工具栏的那个debug图标下选择我们刚才的配置就可以进行调试了,如下图。
6.这时,我们在phpeclipse里面自带的浏览器或者在ie浏览器里面输入:http://localhost:8080/phpTest/file.php?XDEBUG_SESSION_START=testID
注意后面的参数:XDEBUG_SESSION_START=testID,这里的testID 就是我们之前在debug配置里面设置的标识字符串,如图。
7.最后,停在断点的效果如下图所示。
有了断点单步调试的功能,接下来我们不管做什么php网站,都方便很多了。在下一期,我将结合php单步调试给大家深入分析微信商城开发的原理。