微信公众测试号开发改进版---php

来源:互联网 发布:孩子学编程的优缺点 编辑:程序博客网 时间:2024/05/22 01:10
<?php
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();

if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            header('content-type:text');
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];   //获取微信服务器推送的消息数据

        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

            //判断该数据包是否是订阅的事件推送
            if (strtolower($postObj->MsgType)=='event') {
                //如果是关注 subscribe 事件
                if (strtolower($postObj->Event)=='subscribe') {
                    //回复用户消息(纯文本格式)
                    $toUser   = $postObj->FromUserName;
                    $fromUser = $postObj->ToUserName;
                    $time     = time();
                    $msgType  =  'text';
                    $content  = "欢迎关注我们的微信公众账号\n<a href='http://blog.csdn.net/zzz3112362088'>我的个人博客</a>";
                    $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, $toUser, $fromUser, $time, $msgType, $content);
                    echo $info;
                }
                if (strtolower($postObj->Event)=='click') {
                    if (strtolower($postObj->EventKey)=='item1') {
                        $contentStr='此处为功能保留区,以便于后面的开发';
                        $this->responseText($postObj,$contentStr);
                    }

                    if (strtolower($postObj->EventKey=='songs')) {  //回复音乐
                        $fromUsername = $postObj->FromUserName;
                        $toUsername = $postObj->ToUserName;
                        $time     = time();
                        $musicTpl='<xml>
                                    <ToUserName><![CDATA[%s]]></ToUserName>
                                    <FromUserName><![CDATA[%s]]></FromUserName>
                                    <CreateTime>%s</CreateTime>
                                    <MsgType><![CDATA[music]]></MsgType>
                                    <Music>
                                        <Title><![CDATA[最炫民族风]]></Title>
                                        <Description><![CDATA[凤凰传奇]]></Description>
                                        <MusicUrl><![CDATA[http://1.tianyu12345.applinzi.com/music/1.mp3]]></MusicUrl>
                                        <HQMusicUrl><![CDATA[http://1.tianyu12345.applinzi.com/music/1.mp3]]></HQMusicUrl>
                                    </Music>
                                    <FuncFlag>0</FuncFlag>
                                </xml>';
                        $resultStr=sprintf($musicTpl,$fromUsername,$toUserName,$time);
                        echo $resultStr;
                    }
                }
            }
            else if (strtolower($postObj->MsgType)=='text') {
                $keyword = trim($postObj->Content);
                switch ($keyword) {
                    case '?':
                    case '?':
                        $fromUsername=$postObj->FromUserName;
                        $toUsername=$postObj->ToUserName;
                        $contentStr=date("Y-m-d  H:i:s");
                        $this->responseText($postObj,$contentStr);
                        break;  
                    case 'hello':
                        $contentStr="我知道你是谁";
                        $this->responseText($postObj,$contentStr);
                        break;
                    case 'picture':
                        $arr=array(
                            array(
                                'title'=>'个人博客',
                                'description'=>'包含我所学知识的记录',
                        
                                'picurl'=>'http://1.tianyu12345.applinzi.com/images/23.jpg',
                                'url'=>'http://blog.csdn.net/zzz3112362088',),
                            // array(
                            //     'title'=>'qq空间',
                            //     'description'=>'个人生活记录',
                            //     'picurl'=>'http://1.tianyu12345.applinzi.com/images/24.jpg',
                            //     'url'=>'http://user.qzone.qq.com/649832402/main',),
                            );

                        $this->responseImage($postObj,$arr);                    
                        break;
                    default:
                        $contentStr="本部分功能还未实现,快加入我们吧!";
                        $this->responseText($postObj,$contentStr);
                        break;
                }
            }
        }else{    //数据包为空
            echo "";
            exit;
        }
    }

     
/**
 * [responseText 回复文本消息]
 * @param  [type] $postObj   [微信服务器推送的消息(xml)经过simplexml_load_string转换成的对象]
 * @param  [type] $contentText [回复的文本内容]
 * @return [type]              [description]
 */
  public function responseText($postObj,$contentStr=''){
        $fromUsername=$postObj->FromUserName;
        $toUsername=$postObj->ToUserName;
        $time=time();
        $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>';
        $resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$contentStr);
        echo $resultStr;
    }

/**
 * [responseImage 图文回复]
 * @param  [type] $postObj [微信服务器推送的消息(xml)经过simplexml_load_string转换成的对象]
 * @param   array $arr     [回复的图文信息]
 * @return [type]          [description]
 */
    public function responseImage($postObj,$arr=''){
        $fromUsername=$postObj->FromUserName;
        $toUsername=$postObj->ToUserName;
        $time=time();
        $imageTpl="<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <ArticleCount>".count($arr)."</ArticleCount>
                    <Articles>";
        foreach ($arr as $key => $value) {
            $imageTpl.="<item>
                    <Title><![CDATA[".$value['title']."]]></Title>
                    <Description><![CDATA[".$value['description']."]]></Description>
                    <PicUrl><![CDATA[".$value['picurl']."]]></PicUrl>
                    <Url><![CDATA[".$value['url']."]]></Url>
                    </item>";
        }                      
        $imageTpl.="</Articles>
                    </xml>";  
        echo sprintf($imageTpl,$fromUsername,$toUsername,$time,'news');
    }




    // access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token
    // 公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得
    /**
     * [getWXAccess_Token 获得access_token
     * @return [type] [description]
     */
    public function getWXAccess_Token(){
        session_start();
        if ($_SESSION['access_token']&&$_SESSION['expire_time']>time()) {
            return $_SESSION['access_token'];
        }
        else
        {
            $appID='wx2cd45e202c124d6e';
            $appsecret='12add95378046d862b5a71d6e84bf583';
            $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appID."&secret=".$appsecret;
            $res=$this->http_curl($url,'get','json');
            $access_token=$res['access_token'];
            $_SESSION['access_token']=$access_token;
            $_SESSION['expire_time']=time()+7000;
            return $access_token;
        }
    }


    /**
     * 创建自定义菜单
     * @return [type] [description]
     */
    public function defineItem(){
        $access_token=getWXAccess_Token();
        $curl='https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token;
        $postArr=array(
            'button'=>array(
                array(
                    'name'=>urlencode('菜单一'),
                    'type'=>'click',
                    'key'=>'item1',
                    ),
                array(
                    'name'=>urlencode('菜单二'),
                    'sub_button'=>array(
                        array(
                            'name'=>urlencode('歌曲'),
                            'type'=>'click',
                            'key'=>'songs',
                            ),
                        array(
                            'name'=>urlencode('电影'),
                            'type'=>'view',
                            'url'=>'http://1.tianyu12345.applinzi.com/images/23.jpg',
                            ),
                        ),
                    ),
                array(
                    'name'=>urlencode('菜单三'),
                    'type'=>'view',
                    'url'=>'http://blog.csdn.net/zzz3112362088'
                    ),
            ),
        );
        $postJson=urldecode(json_encode($postArr));
        $res=$this->http_curl($curl,'post','json',$postJson);
        var_dump($res);
    }


    public function http_curl($curl,$type='get',$res='json',$arr=''){
        $ch=curl_init();
        curl_setopt($ch,CURLOPT_URL,$curl);  //设置获取URL地址
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //

        //出现SSL certificate problem: unable to get local issuer certificate问题的解决方法是添加以下两句
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);

        if ($type='post') {
           curl_setopt($ch,CURLOPT_POST,1);
           curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
        }

        $output=curl_exec($ch);
        curl_close($ch);
        if ($res=='json') {
           return json_decode($output,true);
        }else{
            return $output;
        }
    }
}
0 0