环境准备:
- 阿里云服务器。我用的是 centos7 的服务器系统环境。可以使用 lsb_release -a 命令查看自己的服务器相关信息。
- 在阿里云服务器上配置 nginx + php-fpm + php + mysql 的开发环境。这里需要强调的是,微信公众号接口只支持80端口。即:微信公众平台开发者模式只支持80端口的自定义服务器地址调用,就是说,我们需要将 nginx 的80端口配置指向我们的 index.php ,然后再在 index.php 中实现我们自己的逻辑。这里大致描述一下这个过程。关于配置 nginx 的80端口指向 index.php,其实只是利用 nginx 的 try_files 或者 rewrite 来将 nginx 服务器接受到的请求转化成对 php 静态文件(就是我们的 index.php)的请求,然后根据 nginx 的配置,会将 php 文件的请求再次转发给 php-fpm,进而完成 php 的解析与逻辑的处理。
- 开发工具:PhpStorm + xshell + xftp。PhpStorm 是一个非常强大的 php ide,自动代码提示功能非常强大,同时可以在你更改代码之后自动同步到配置好的服务器上。xshell 和 xftp 顾名思义,是非常强大的 shell 和 ftp 工具,使用起来也很方便。
- 微信公众平台开发者账户申请。高德地图开发者申请。SmartWeather 天气接口开发权限申请。这个天气接口目前(2016/01/26)并没有收费,只需要通过开发者资格认证就能0元购买对应的服务了。
微信公众号开发概述
微信公众号本身提供了一个网页端的后台管理界面,可以群发、设置自动回复、设置自定义菜单、查看用户留言、回复用户留言等。但是,原生提供的功能毕竟有限。因此,我们需要将自己的服务器绑定到对应的微信公众号上。这样,就出现了两个服务器:微信服务器、业务服务器(这个是我们自己的)。那么在绑定了服务器之后,用户通过微信客户端的交互行为背后发生了什么呢?
首先,用户针对你的公众号的操作会被发送到微信服务器上,然后由微信服务器生成 xml 格式的数据通过 post 的方式转发到业务服务器上,业务服务器接受到微信服务器转发过来的请求后,解析数据,处理业务逻辑,然后将结果还是以 xml 的形式通过 post 的方式返回给微信服务器,微信服务器再去解析业务服务器的信息,并产生对应的行为,返回给用户的微信客户端。这就是一个完整的流程。微信服务器 本质上起到了一个 中转服务器 的作用。
既然微信服务器本质上是一个中转服务器,那么就不能避免两个问题:微信服务器端如何验证“业务服务器”就是“业务服务器”,业务服务器端如何验证“微信服务器”就是“微信服务器”。对于微信服务器端验证业务服务器的真实性的方法,参考公众平台开发者文档 ,微信服务器将发送包含 signature、timestamp、nonce、echostr 四个参数的 GET 请求到你填写的业务服务器地址 url 上(只能是80端口)。在微信服务器验证业务服务器这个子流程中,微信服务器只期望能从业务服务器中获取相同的 echoStr 字符串,以此来判定业务服务器在“你的掌控下”。而且在第一次验证成功后,以后就不再验证了(除非你在微信开发者后台对服务器设置进行了修改,比如更改了加密方式等)。在业务服务器验证微信服务器这个子流程中,业务服务器获取上文提到的几个参数的值,再根据开发者文档描述的方式来进行运算,进而就能验证微信服务器是否是“微信服务器”,进而可以避免恶意攻击。具体代码如下:
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
接下来的开发流程:
- 从微信公众号获取地理坐标
- 从高德地图服务器上,根据地理坐标获取地点信息(xx省xx市xx区)
- 从自己的数据库中,根据地点信息查询对应的地点编号
- 从 SmartWeather 服务器接口中根据地点编号获取天气信息
- 将生成的天气信息返回给微信服务器
ps: 教程中如果有阐述不清楚的地方,或者有一些你想详细了解的点,请在下面评论我会更改完善。