微信公众号开发(2)—接收订阅事件推送并回复消息

在thinkphp框架内完成的,下面是控制器页面(不涉及其他页面)

<?PHP

微信公众号开发(2)---接收订阅事件推送并回复消息

namespace HomeController;

use ThinkController;

class IndexController extends Controller {

    //token验证,微信服务器发送post请求过来

    public function index(){

      $timestamp = $_GET[“timestamp”];//a时间戳

      $nonce = $_GET[“nonce”];//随机数

      $token = “weixin”;//token

      $signature = $_GET[“signature”];//加密签名

      $echoStr = $_GET[“echostr”];;//随机字符串

      //1)将token、timestamp、nonce三个参数进行字典序排序

      $tmpArr = array($token, $timestamp, $nonce);

      sort($tmpArr, SORT_STRING);

     //2)将三个参数字符串拼接成一个字符串进行sha1加密

     $tmpStr = implode( $tmpArr );

     $tmpStr = sha1( $tmpStr );

     //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    if( ($tmpStr == $signature) && $echoStr ){

         echo  $echoStr;//第一次接入

         exit;

       }else{

           $this->responseMsg();//第二、三、、、、、、次接入,除了第一次接入,以后的接入不会传送$echoStr

       }

    }

   //用户关注后,微信推送过来一个包含用户信息的xml数据包,我们接收后并回复

    public function responseMsg(){

       //获取到微信推送过来的数据

       $postArr = $GLOBALS[“HTTP_RAW_POST_DATA”];

       

       //处理消息

//<xml>

//<ToUserName><![CDATA[toUser]]></ToUserName>

//<FromUserName><![CDATA[FromUser]]></FromUserName>

//<CreateTime>123456789</CreateTime>

//<MsgType><![CDATA[event]]></MsgType>

//<Event><![CDATA[subscribe]]></Event>

//</xml>

        $postObj = simplexml_load_string($postArr);//转成了对象

        //判断消息类型

        if(strtolower($postObj->MsgType) == “event”){

            //判断事件类型,是订阅(subscribe),还是退订(unsubscribe)

            if(strtolower($postObj->Event) == “subscribe”){

        $toUserName = $postObj->FromUserName;

        $fromUserName = $postObj->ToUserName;

        $crateTime = time();

        $msgType = “text”;

        $content = “旅行者,欢迎你”; 

        $template=”

        <xml>

        <ToUserName><![CDATA[%s]]></ToUserName>

        <FromUserName><![CDATA[%s]]></FromUserName>

        <CreateTime>%s</CreateTime>

        <MsgType><![CDATA[%s]]></MsgType>

        <Content><![CDATA[%s]]></Content>

        </xml>”;

        $info = sprintf($template,$toUserName,$fromUserName,$crateTime,$msgType,$content);

        echo $info;

            }

        }

    }

}