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

来源:互联网 发布:中国人才流动数据 编辑:程序博客网 时间:2024/06/04 08:34

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

<?php

namespace Home\Controller;
use Think\Controller;

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;
            }
        }
    }
}
0 0