微信公众号开发初探

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

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

申请微信公众号

要体验微信公众号开发,首先得有一个公众号,直接在官网申请即可(记住需要新申请公众号,而不是用你原来的 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 是刚才你在表单写的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);

到这一步,我们已经做完了所有工作,现在可以尝试向公众号发送一条消息,随便发个城市名,如果代码没有错误,那么会看到下图所示的效果:
在这里插入图片描述
如果微信返回类似“该公众号暂时无法提供服务”的提示,那就说明你的代码存在问题,可是能你的程序没给微信服务器返回任何内容,也可能回复的数据不合规范,给你直接返回了 JSON 类型数据。检查下代码,或者看看 nginx 日志,一般都能找到原因。

更进一步

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值