最近利用空闲时间,申请了个微信公众号,完成一些小功能练练手。
本文总结了开发公众号期间的一些步骤,心得和体会,希望能帮助更多想做微信开发的小白开发者。
申请微信公众号
要体验微信公众号开发,首先得有一个公众号,直接在官网申请即可(记住需要新申请公众号,而不是用你原来的 QQ 或微信登录)。
申请过程中,要注意的是,我们申请的是订阅号,用于个人开发。
申请成功后,登录到公众号后台,左侧有丰富的菜单供你使用,可以选择傻瓜式,就是不用写一行代码,通过在左侧菜单配置,自己设置关注后的欢迎语、给用户发消息操作等。也可以选择开发者模式,将左侧菜单拉到最下面,可以看到如下图所示的开发栏。

为了后续及时查看效果,需要第一时间关注这个公众号,成为自己的第一个粉丝。
开始编写代码
首先,我们要明白微信公众号和用户打交道的流程,下图简单展示了这个流程。

从图中可以看到,当你在微信中向公众号发一条消息,这条消息首先会送到微信服务器,然后转发给你的服务器,经过处理后把响应回给微信服务器,微信服务器再转给你。
这个和我们开发 Web 程序 C/S 模式基本一致,不同的是,在客户端和服务端中间,多了一个微信服务器做转发。
因此我们要关注的,依旧是写服务端程序,以便接收微信服务器转发过来的请求。我们的服务入口必须是微信服务器可以访问的,也就是一个公网地址,内网 IP 肯定是不行的,所以首先得有一台有外网 IP 的服务器。
以滴滴云 DC2 服务器为例,在官网上购买一个带 EIP 的 DC2 实例,ssh 登录到 DC2,安装 lnmp 全家桶。安装好后,确认 Nginx 和 php-fpm 已运行。然后就可以在微信公众平台上配置服务器地址了。
打开基本配置页面,按下图方式填写表单:

填写好后,不要急着提交。我们在 DC2 服务器的 Web 目录下,写个测试程序 main.php,代码如下所示,这段代码也可以在 微信wiki 上找到。
define("TOKEN","your token"); //token 是刚才你在表单写的tokenfunction checkSignature() {
$signature = $_GET['signature']; //微信加密签名
$nonce = $_GET['nonce']; //时间戳
$timestamp = $_GET['timestamp']; //随机数
$arr = [$timestamp, $nonce, TOKEN];
sort($arr);
$arr = implode($arr);
$m_arr = sha1($arr);
if($m_arr == $signature) {
return true;
}
return false;
}
if (checkSignature()) {
$echostr = $_GET['echostr'];
if($echostr) {
echo $echostr;
}
}
简单解释一下,当我们提交上述表单后,微信服务器会对我们填写的地址进行验证,参数如上述注释,如果表单提示成功,则说明微信服务器访问到了你配置的 URL,并认证成功,如果失败,则检查下你的代码。
认证成功后,我们就可以把上面的测试代码删掉,开始写真正的服务端程序。
第一个服务
首先我们写一个天气查询服务,就是给公众号发一个城市名,公众号返回该城市未来三天的天气。我这里用的是心知天气提供的天气 API,我们分两步来进行:
相关影片资源迅雷下载推荐
个人如何成为一个优秀的独立游戏开发者?
个人在具有编码实现的能力以及一定游戏设计的情况下,如何低成本的解决游戏开发过程需要的美术音乐资源的问题?个人的开发者如何竞争过公司,成为优秀的游戏开发者? ...
游戏开发,个人如何成为一个优秀的独立游戏开发者?
1、获取用户输入的城市名
由上图我们知道,用户的输入最终会由微信服务器转发给我们自己的服务端程序,微信服务器转发给我们的数据格式如下:
<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
这里简单解释下上面的各个字段:
- ToUserName 消息要发送给谁
- FromUserName 是消息从哪来
- CreateTime 时间戳
- MsgType 消息类型
- MsgId 消息 Id
我们的服务端程序得获取这个数据,需要注意的是,如果 PHP 版本是 5.x,可以直接使用 $GLOBALS["HTTP_RAW_POST_DATA"]
超全局变量来获取,如果是 PHP7($GLOBALS
已经被取消),需要用以下方式来获取:
然后解析 xml 数据,提取各类字段,如下:
$postObj = simplexml_load_string($wx_post, 'SimpleXMLElement', LIBXML_NOCDATA);$from_user_name = $postObj->FromUserName;
$to_user_name = $postObj->ToUserName;
$city = trim($postObj->Content); //提取用户发送的城市名
2、根据城市名,返回天气信息
拿到了城市名,就可以通过 API 查询城市天气信息了,但有个问题需要解决:一般用户发的是中文城市名,而通过 API 查询,需要的是城市的拼音,因此需要写一个 中文->拼音 的转换函数。在 GitHub 上有很多这类项目,我用的是 这个 库,使用方法自行查看。
转换成拼音后,即可按 API 的要求,拼接 URL,发送查询请求,将返回的天气数据简单解析,并封装成微信需要的格式,构造响应,假如要返回给微信服务器的天气数据为 $weather_info
,那么代码如下:
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
return sprintf($textTpl,$from_user_name,$to_user_name,time(),$weather_info);
到这一步,我们已经做完了所有工作,现在可以尝试向公众号发送一条消息,随便发个城市名,如果代码没有错误,那么会看到下图所示的效果:

如果微信返回类似“该公众号暂时无法提供服务”的提示,那就说明你的代码存在问题,可是能你的程序没给微信服务器返回任何内容,也可能回复的数据不合规范,给你直接返回了 JSON 类型数据。检查下代码,或者看看 Nginx 日志,一般都能找到原因。
更进一步
有了上面简单的实战,我们了解了微信开发的基本流程,并实现了一个向公众号的粉丝提供天气查询的服务。上面只是向用户返回了文字类型消息,我们也可以尝试发送图片、音乐、图文类型的消息,只需要将上述消息 MsgType 字段改为对应类型,并按微信开发手册填充 Content 内容即可,剩下的就是发挥想象力的时候了,可以尝试添加其他功能,比如点歌、查快递,甚至像 Siri 的一个机器助理。
总结
从上述开发过程我们可以看到,微信公众号开发和我们开发普通的 Web 程序基本一致,唯一不同的中间经过了微信服务器做了一次转发。需要注意的是,上述配置的公众号,只有部分微信 API 权限,分享、支付等功能,均需要通过认证才可用。
本文作者:许基伟
想了解更多技术知识,欢迎关注滴滴云知乎机构号,大量教程在线等你~
滴滴云官网:https://www.didiyun.com/?channel=14112
滴滴云疯狂双十一,服务器最低35折起
企业网站建设与开发最低只要299元起,包含域名服务器,需要的联系QQ345424724,电话15516990022,18530226930相关影片资源迅雷下载推荐
微信公众号开发需要多少钱?
有不少企业都想要开通自己的微信公众号,并对其进行开发,但是有一个很大的问题困扰他们,就是要进行微信公众号开发要多少钱?今天就给大家讲解一下首先,我们需要注册认证一个微信公众号。目前公众号分为两种,一种 ...
公众号开发,微信公众号开发需要多少钱?