固定链接 微信公众号开发初探

微信公众号开发初探

微信公众号开发初探

最近利用空闲时间,申请了个微信公众号,完成一些小功能练练手。

本文总结了开发公众号期间的一些步骤,心得和体会,希望能帮助更多想做微信开发的小白开发者。

申请微信公众号

要体验微信公众号开发,首先得有一个公众号,直接在官网申请即可(记住需要新申请公众号,而不是用你原来的 QQ 或微信登录)。

申请过程中,要注意的是,我们申请的是订阅号,用于个人开发。

申请成功后,登录到公众号后台,左侧有丰富的菜单供你使用,可以选择傻瓜式,就是不用写一行代码,通过在左侧菜单配置,自己设置关注后的欢迎语、给用户发消息操作等。也可以选择开发者模式,将左侧菜单拉到最下面,可以看到如下图所示的开发栏。

为了后续及时查看效果,需要第一时间关注这个公众号,成为自己的第一个粉丝。

开始编写代码

首先,我们要明白微信公众号和用户打交道的流程,下图简单展示了这个流程。

从图中可以看到,当你在微信中向公众号发一条消息,这条消息首先会送到微信服务器,然后转发给你的服务器,经过处理后把响应回给微信服务器,微信服务器再转给你。

这个和我们开发 Web 程序 C/S 模式基本一致,不同的是,在客户端和服务端中间,多了一个微信服务器做转发。

因此我们要关注的,仍然是写服务端程序,以便接收微信服务器转发过来的请求。我们的服务入口必须是微信服务器可以访问的,也就是一个公网地址,内网 IP 肯定是不行的,所以首先得有一台有外网 IP 的服务器。

滴滴云 DC2 服务器为例,在官网上购买一个带 EIP 的 DC2 实例,ssh 登录到 DC2,安装 lnmp 全家桶。安装好后,确认 Nginx 和 php-fpm 已运行。然后就可以在微信公众平台上配置服务器地址了。

打开基本配置页面,按下图方式填写表单:

填写好后,不要急着提交。我们在 DC2 服务器的 Web 目录下,写个测试程序 main.php,代码如下所示,这段代码也可以在 微信wiki 上找到。

简单解释一下,当我们提交上述表单后,微信服务器会对我们填写的地址进行验证,参数如上述注释,如果表单提示成功,则说明微信服务器访问到了你配置的 URL,并认证成功,如果失败,则检查下你的代码。

认证成功后,我们就可以把上面的测试代码删掉,开始写真正的服务端程序。

第一个服务

首先我们写一个天气查询服务,就是给公众号发一个城市名,公众号返回该城市未来三天的天气。我这里用的是心知天气提供的天气 API,我们分两步来进行:

1、获取用户输入的城市名

由上图我们知道,用户的输入最终会由微信服务器转发给我们自己的服务端程序,微信服务器转发给我们的数据格式如下:

这里简单解释下上面的各个字段:

  • ToUserName 消息要发送给谁
  • FromUserName 是消息从哪来
  • CreateTime 时间戳
  • MsgType 消息类型
  • MsgId 消息 Id

我们的服务端程序得获取这个数据,需要注意的是,如果 PHP 版本是 5.x,可以直接使用 $GLOBALS["HTTP_RAW_POST_DATA"] 超全局变量来获取,如果是 PHP7($GLOBALS 已经被取消),需要用以下方式来获取:

然后解析 xml 数据,提取各类字段,如下:

2、根据城市名,返回天气信息

拿到了城市名,就可以通过 API 查询城市天气信息了,但有个问题需要解决:一般用户发的是中文城市名,而通过 API 查询,需要的是城市的拼音,因此需要写一个 中文->拼音 的转换函数。在 GitHub 上有很多这类项目,我用的是 这个 库,使用方法自行查看。

转换成拼音后,即可按 API 的要求,拼接 URL,发送查询请求,将返回的天气数据简单解析,并封装成微信需要的格式,构造响应,假如要返回给微信服务器的天气数据为 $weather_info,那么代码如下:

到这一步,我们已经做完了所有工作,现在可以尝试向公众号发送一条消息,随便发个城市名,如果代码没有错误,那么会看到下图所示的效果:

如果微信返回类似“该公众号暂时无法提供服务”的提示,那就说明你的代码存在问题,可是能你的程序没给微信服务器返回任何内容,也可能回复的数据不合规范,给你直接返回了 JSON 类型数据。检查下代码,或者看看 Nginx 日志,一般都能找到原因。

更进一步

有了上面简单的实战,我们了解了微信开发的基本流程,并实现了一个向公众号的粉丝提供天气查询的服务。上面只是向用户返回了文字类型消息,我们也可以尝试发送图片、音乐、图文类型的消息,只需要将上述消息 MsgType 字段改为对应类型,并按微信开发手册填充 Content 内容即可,剩下的就是发挥想象力的时候了,可以尝试添加其他功能,比如点歌、查快递,甚至像 Siri 的一个机器助理。

总结

从上述开发过程我们可以看到,微信公众号开发和我们开发普通的 Web 程序基本一致,唯一不同的中间经过了微信服务器做了一次转发。需要注意的是,上述配置的公众号,只有部分微信 API 权限,分享、支付等功能,均需要通过认证才可用。

本文作者:许基伟

您的留言将激励我们越做越好