最近在研究微信公众号开发,消息回复是订阅号基础的可获取的接口,因此先从这里开始练起。
我的服务端采用的是新浪的SAE平台,现在要想提交代码,是要每月上交10元的,有500M空间可用。
以腾讯云服务器为示例:腾讯云服务器购买入口,购买指导请参考快速入门linux云服务器。
学生党注意:腾讯公司为在读高校生提供了云+校园计划,1元/月即可使用腾讯云。
开始操作,进入微信公众开发平台后台,个人一般只能申请订阅号(限制主要功能),我这里使用的是微信的【公众平台测试帐号】。
只要你登录微信开发平台,就可以在【公众平台测试帐号】中看到:appID / appsecret ,这两个参数在整个开发过程中缺一不可。
点提交,配置成功就OK了,如果提示Token验证失败,则是下载的示例代码中有点小问题,需要在接入方法valid()中增加一个type:
public function valid()
    {
        //判断微信现在是否做接入操作,根据$_GET["echostr"]这个参数进行判断
        $echoStr = $_GET["echostr"];
        //valid signature , option
        if($this->checkSignature()){
            //必须在这里增加header(‘content-type:text‘); 否则,会报错“token验证失败”
            header(‘content-type:text‘);
            echo $echoStr;
            exit;
        }
    }
下图为配置成功之后显示效果:

示例代码:wx_jiaj.php,所有的消息推送方法,都在这个文件中配置:
<?php
/**
  * wechat php test
  */
//define your token
//默认的token 的值 为 weixin20161208
define("TOKEN", "weixin20161208");
$wechatObj = new wechatCallbackapiTest();
//判断一下,获取到这个参数才会进行接入操作
if($_GET["echostr"]){
    //进行接入的操作
    $wechatObj->valid();
}else{
    //如果没有获取到,就说明接入成功
    $wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
    //valid 接入时进行的一个操作
    public function valid()
    {
        //判断微信现在是否做接入操作,根据$_GET["echostr"]这个参数进行判断
        $echoStr = $_GET["echostr"];
        //valid signature , option
        if($this->checkSignature()){
            //必须在这里增加header(‘content-type:text‘); 否则,会报错“token验证失败”
            header(‘content-type:text‘);
            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); //关键字
                $Event = $postObj->Event; //关注与取消关注事件
                $time = time(); //时间
                $MsgType = $postObj->MsgType; //image 参数
                $EventKey = $postObj->EventKey; //事件key
                //$textTpl  是开发文档中的回复文字的格式,参照开发者文档》消息管理》被动回复用户消息》回复文本消息
                $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>";  
                //当发送一条图片信息时,推送一条消息
                if($MsgType == "image"){
                    $MsgType = "text";
                    $contentStr = "你发送了一条图片信息";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $MsgType, $contentStr);//将上面的信息发送到服务器的过程中需要传的参数
                    echo $resultStr;
                }
                //点击菜单时,推送一条工菜单的消息
                if($Event == "CLICK" and $EventKey == "V1001_TODAY_MUSIC"){
                    $MsgType = "text";
                    $contentStr = "你点击了今日歌曲";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $MsgType, $contentStr);//将上面的信息发送到服务器的过程中需要传的参数
                    echo $resultStr;
                }
                //订阅事件,回复图文
                //ArticleCount 2 说明有两个图文,限制炎10条
                //Articles 多图文标志,里面有几个item就有几个图文
                //Description 图文描述消息
                //PicUrl 图片地址
                //如何替换 修改CDATA数组内的内容即可,只修改item的东西就可以,ToUserName~CreateTime是不需要修改的,MsgType要改为news
                //$textTpl  是开发文档中的回复文字的格式,参照开发者文档》消息管理》被动回复用户消息》回复图文消息
                if($Event == "subscribe"){
                    $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[news]]></MsgType>
                            <ArticleCount>1</ArticleCount>
                            <Articles>
                            <item>
                            <Title><![CDATA[欢迎关注医首信息]]></Title> 
                            <Description><![CDATA[3D婴儿分娩过程]]></Description>
                            <PicUrl><![CDATA[http://pic.qbaobei.com/Uploads/Picture/2016-07-05/e55f79d3f8b5f77b6c4618968f9c8672.gif]]></PicUrl>
                            <Url><![CDATA[https://www.youtube.com/watch?v=vzuVEyr4sRk]]></Url>
                            </item>
                            </Articles>
                            </xml> "; 
                            //发送到服务器的过程需要传的参数 
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time);//将上面的信息发送到服务器的过程
                            echo $resultStr;
                }
                //回复关键字,回复图文消息。定义关键字为“医首信息”
                if(!empty( $keyword )){
                    if($keyword == "医首信息"){
                        //下面为图文回复
                        $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[news]]></MsgType>
                            <ArticleCount>1</ArticleCount>
                            <Articles>
                            <item>
                            <Title><![CDATA[欢迎关注医首信息]]></Title> 
                            <Description><![CDATA[3D婴儿分娩过程]]></Description>
                            <PicUrl><![CDATA[http://pic.qbaobei.com/Uploads/Picture/2016-07-05/e55f79d3f8b5f77b6c4618968f9c8672.gif]]></PicUrl>
                            <Url><![CDATA[https://www.youtube.com/watch?v=vzuVEyr4sRk]]></Url>
                            </item>
                            </Articles>
                            </xml> "; 
                            //发送到服务器的过程需要传的参数 
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time);//将上面的信息发送到服务器的过程
                            echo $resultStr;
                    }else{
                        echo "Input something...";
                    }
                }
                //订阅事件,要先回复文字,
                //当Event为subscribe时,它就是订阅事件,参照开发者文档》消息管理》接收事件推送》关注/取消事件的参数说明
                if($Event == "subscribe") {
                    //把下面的回复关键字复制上来,修改下消息
                    $msgType = "text";
                    $contentStr = "欢迎关注医首信息";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//将上面的信息发送到服务器的过程中需要传的参数
                    echo $resultStr;
                } 
                //关键字回复文字    
                if(!empty( $keyword ))
                {
                      $msgType = "text";
                    $contentStr = "Welcome to jiajian";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//将上面的信息发送到服务器的过程
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }
        }else {
            echo "";
            exit;
        }
    }
        
    private function checkSignature()
    {
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception(‘TOKEN is not defined!‘);
        }
        
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}
?>
所有的参数在使用前要参考文档,提前获取:
//下面为获取参数信息,前面是获取的参数,后面是它的描述
                $fromUsername = $postObj->FromUserName; //开发者微信号
                $toUsername = $postObj->ToUserName; //接收方帐号
                $keyword = trim($postObj->Content); //关键字
                $Event = $postObj->Event; //关注与取消关注事件
                $time = time(); //时间
                $MsgType = $postObj->MsgType; //image 参数
                $EventKey = $postObj->EventKey; //事件key
每个动作在回复前,需要判断,如果符合规则,则返回一条消息或者返回一条图文消息。
推荐极客学院的教程:
原文:http://www.cnblogs.com/baiyygynui/p/6146171.html