微信公众号开发初探

自媒体运营教程 产品运营 58

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

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


申请微信公众号

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

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

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


微信公众号开发初探-第1张图片-90博客网

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


开始编写代码

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


微信公众号开发初探-第2张图片-90博客网

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

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

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

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

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


微信公众号开发初探-第3张图片-90博客网

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

define("TOKEN","your token"); //token 是刚才你在表单写的token
function 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 已经被取消),需要用以下方式来获取:

$wx_post = file_get_contents("php://input")

然后解析 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,那么代码如下:

$textTpl = "<xml>
<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);

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


微信公众号开发初探-第4张图片-90博客网

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


更进一步

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


总结

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

本文作者:许基伟


想了解更多技术知识,欢迎关注滴滴云知乎机构号,大量教程在线等你~

滴滴云官网:https://www.didiyun.com/?channel=14112

滴滴云疯狂双十一,服务器最低35折起

相关影片资源迅雷下载推荐

微信公众号开发需要多少钱?

有不少企业都想要开通自己的微信公众号,并对其进行开发,但是有一个很大的问题困扰他们,就是要进行微信公众号开发要多少钱?今天就给大家讲解一下首先,我们需要注册认证一个微信公众号。目前公众号分为两种,一种 ...

公众号开发,微信公众号开发需要多少钱?

企业网站建设与开发最低只要299元起,包含域名服务器,需要的联系QQ345424724,电话15516990022,18530226930

标签: 公众号开发 微信公众号开发初探

抱歉,评论功能暂时关闭!