1. 前提

微信接口接上之后我们就可以开始开发功能了,微信接口接入可参考:微信公众平台开发——准备开发和接口接入

2. 注意

需要注意的是$wechatObj->valid()和$wechatObj->responseMsg(),valid是用来调试时验证接口用的,在接入后我们就不需要用到了,可以注释掉,然后调用$wechatObj->responseMsg()来实现功能.

3. 实现

这里实现公众号关注自动回复和普通消息回复作为例子.

<?php
/* 微信接口文件*/
//define your token
define("TOKEN", "wechatgzp");
$wechatObj = new wechatCallbackapiTest(); //实例化封装类
//$wechatObj->valid(); //注释掉这里
$wechatObj->responseMsg(); //这里调用回复功能封装的函数

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        if (!empty($postStr)){
            /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
               the best way is to check the validity of xml by yourself */
            libxml_disable_entity_loader(true);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $textTpl = "<xml>
 <ToUserName><![CDATA[%s]]></ToUserName>
 <FromUserName><![CDATA[%s]]></FromUserName>
 <CreateTime>%s</CreateTime>
 <MsgType><![CDATA[%s]]></MsgType>
 <Content><![CDATA[%s]]></Content>
 <FuncFlag>0</FuncFlag>
 </xml>";

            //加载图文模版
            $picTpl = "<xml>
 <ToUserName><![CDATA[%s]]></ToUserName>
 <FromUserName><![CDATA[%s]]></FromUserName>
 <CreateTime>%s</CreateTime>
 <MsgType><![CDATA[%s]]></MsgType>
 <ArticleCount>1</ArticleCount>
 <Articles>
 <item>
 <Title><![CDATA[%s]]></Title>
 <Description><![CDATA[%s]]></Description>
 <PicUrl><![CDATA[%s]]></PicUrl>
 <Url><![CDATA[%s]]></Url>
 </item>
 </Articles>
 <FuncFlag>1</FuncFlag>
 </xml> ";

            //用户输入内容了
            if(!empty( $keyword ))
            {
                $msgType = "text";
                $contentStr = "欢迎关注!更多内容,敬请期待!";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }

            //判断是否是新关注
            elseif(trim($postObj->MsgType) == "event" and trim($postObj->Event) == "subscribe")
            {
                $msgType = "news";
                $title = "大兄弟别跑听锅锅说话"; //标题
                $data  = date('Y-m-d'); //时间
                $desription = "感谢您关注【大兄弟别跑听锅锅说话】"."\n"."微信号:gzpblog"."\n"."博客网址:http://www.gzpblog.com"."\n"."更多内容,敬请期待!"; //简介
                $image = "http://www.gzpblog.com/usr/uploads/shuta.jpg"; //图片地址
                $turl = "http://www.gzpblog.com"; //链接地址
                $resultStr = sprintf($picTpl, $fromUsername, $toUsername, $time, $msgType, $title,$desription,$image,$turl);
                echo $resultStr;
            }
        }
        else
        {
            echo "";
            exit;
        }
    }
}

在这里我们用了两种回复格式,关注时自动回复用的是带图片的新闻模式,而普通消息回复则是纯文字。判断关注使用事件来判断,而普通消息回复判断其keyword,各消息类型的推送XML数据包结构在开发者文档中列出来,这里就不列了,给个地址:http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html

以我自己的公众号为例,实现的效果如下:

实际上,这只是其中的一个简单小功能,然后我们会发现,个人公众号,不能通过认证,能调用的接口权限很少,只能实现一些简单功能,具体权限也可以在官方文档中找到。而且,连自定义菜单这种功能,个人公众号都无法调用接口,实在蛋疼得很。(后续补充:个人公众号可以自定义菜单了)

当然,还是有一些功能挺有意思的等待去发掘,将微信服务器和博客的共用可能可以打造出一些有意思的效果,不过不知道能不能实现,现在只是想想,以后有时间研究研究。

4. 后续更新(2017年~)

微信公众号已经可以在后台直接设置自动回复了,个人公众号也可以自定义菜单了,逐渐放开了。所以本文仅供参考了。