微信公众平台开发接口PHP SDK完整版

前端技术 2023/09/01 Android

代码如下:

更新日志:

2013-01-01 版本1.0
2014-03-15 增加图片、视频、语音的内容回复
2014-04-09 增加菜单链接事件
2014-04-10 修改文本回复的判定方法

复制代码 代码如下:

<?php
/*
    方倍工作室
    CopyRight 2014 All Rights Reserved
*/

define(\"TOKEN\", \"weixin\");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET[\'echostr\'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    //验证消息
    public function valid()
    {
        $echoStr = $_GET[\"echostr\"];
        if($this->checkSignature()){
            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)){
            $this->logger(\"R \".$postStr);
            $postObj = simplexml_load_string($postStr, \'SimpleXMLElement\', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)
            {
                case \"event\":
                    $result = $this->receiveEvent($postObj);
                    break;
                case \"text\":
                    $result = $this->receiveText($postObj);
                    break;
                case \"image\":
                    $result = $this->receiveImage($postObj);
                    break;
                case \"location\":
                    $result = $this->receiveLocation($postObj);
                    break;
                case \"voice\":
                    $result = $this->receiveVoice($postObj);
                    break;
                case \"video\":
                    $result = $this->receiveVideo($postObj);
                    break;
                case \"link\":
                    $result = $this->receiveLink($postObj);
                    break;
                default:
                    $result = \"unknow msg type: \".$RX_TYPE;
                    break;
            }
            $this->logger(\"T \".$result);
            echo $result;
        }else {
            echo \"\";
            exit;
        }
    }

    //接收事件消息
    private function receiveEvent($object)
    {
        $content = \"\";
        switch ($object->Event)
        {
            case \"subscribe\":
                $content = \"欢迎关注方倍工作室 \";
                $content .= (!empty($object->EventKey))?(\"\\n来自二维码场景 \".str_replace(\"qrscene_\",\"\",$object->EventKey)):\"\";
                break;
            case \"unsubscribe\":
                $content = \"取消关注\";
                break;
            case \"SCAN\":
                $content = \"扫描场景 \".$object->EventKey;
                break;
            case \"CLICK\":
                switch ($object->EventKey)
                {
                    case \"COMPANY\":
                        $content = \"方倍工作室提供互联网相关产品与服务。\";
                        break;
                    default:
                        $content = \"点击菜单:\".$object->EventKey;
                        break;
                }
                break;
            case \"LOCATION\":
                $content = \"上传位置:纬度 \".$object->Latitude.\";经度 \".$object->Longitude;
                break;
            case \"VIEW\":
                $content = \"跳转链接 \".$object->EventKey;
                break;
            default:
                $content = \"receive a new event: \".$object->Event;
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

    //接收文本消息
    private function receiveText($object)
    {
        switch ($object->Content)
        {
            case \"文本\":
                $content = \"这是个文本消息\";
                break;
            case \"图文\":
            case \"单图文\":
                $content = array();
                $content[] = array(\"Title\"=>\"单图文标题\",  \"Description\"=>\"单图文内容\", \"PicUrl\"=>\"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg\", \"Url\" =>\"http://m.cnblogs.com/?u=txw1958\");
                break;
            case \"多图文\":
                $content = array();
                $content[] = array(\"Title\"=>\"多图文1标题\", \"Description\"=>\"\", \"PicUrl\"=>\"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg\", \"Url\" =>\"http://m.cnblogs.com/?u=txw1958\");
                $content[] = array(\"Title\"=>\"多图文2标题\", \"Description\"=>\"\", \"PicUrl\"=>\"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg\", \"Url\" =>\"http://m.cnblogs.com/?u=txw1958\");
                $content[] = array(\"Title\"=>\"多图文3标题\", \"Description\"=>\"\", \"PicUrl\"=>\"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg\", \"Url\" =>\"http://m.cnblogs.com/?u=txw1958\");
                break;
            case \"音乐\":
                $content = array(\"Title\"=>\"最炫民族风\", \"Description\"=>\"歌手:凤凰传奇\", \"MusicUrl\"=>\"http://121.199.4.61/music/zxmzf.mp3\", \"HQMusicUrl\"=>\"http://121.199.4.61/music/zxmzf.mp3\");
                break;
            default:
                $content = date(\"Y-m-d H:i:s\",time());
                break;
        }
        if(is_array($content)){
            if (isset($content[0][\'PicUrl\'])){
                $result = $this->transmitNews($object, $content);
            }else if (isset($content[\'MusicUrl\'])){
                $result = $this->transmitMusic($object, $content);
            }
        }else{
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

    private function receiveImage($object)
    {
        $content = array(\"MediaId\"=>$object->MediaId);
        $result = $this->transmitImage($object, $content);
        return $result;
    }

    private function receiveLocation($object)
    {
        $content = \"你发送的是位置,纬度为:\".$object->Location_X.\";经度为:\".$object->Location_Y.\";缩放级别为:\".$object->Scale.\";位置为:\".$object->Label;
        $result = $this->transmitText($object, $content);
        return $result;
    }

    private function receiveVoice($object)
    {
        if (isset($object->Recognition) && !empty($object->Recognition)){
            $content = \"你刚才说的是:\".$object->Recognition;
            $result = $this->transmitText($object, $content);
        }else{
            $content = array(\"MediaId\"=>$object->MediaId);
            $result = $this->transmitVoice($object, $content);
        }

        return $result;
    }

    private function receiveVideo($object)
    {
        $content = array(\"MediaId\"=>$object->MediaId, \"ThumbMediaId\"=>$object->ThumbMediaId, \"Title\"=>\"\", \"Description\"=>\"\");
        $result = $this->transmitVideo($object, $content);
        return $result;
    }

    private function receiveLink($object)
    {
        $content = \"你发送的是链接,标题为:\".$object->Title.\";内容为:\".$object->Description.\";链接地址为:\".$object->Url;
        $result = $this->transmitText($object, $content);
        return $result;
    }

    private function transmitText($object, $content)
    {
        $textTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>\";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    private function transmitImage($object, $imageArray)
    {
        $itemTpl = \"<Image>
    <MediaId><![CDATA[%s]]></MediaId>
</Image>\";

        $item_str = sprintf($itemTpl, $imageArray[\'MediaId\']);

        $textTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>\";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    private function transmitVoice($object, $voiceArray)
    {
        $itemTpl = \"<Voice>
    <MediaId><![CDATA[%s]]></MediaId>
</Voice>\";

        $item_str = sprintf($itemTpl, $voiceArray[\'MediaId\']);

        $textTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>\";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    private function transmitVideo($object, $videoArray)
    {
        $itemTpl = \"<Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
</Video>\";

        $item_str = sprintf($itemTpl, $videoArray[\'MediaId\'], $videoArray[\'ThumbMediaId\'], $videoArray[\'Title\'], $videoArray[\'Description\']);

        $textTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>\";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return;
        }
        $itemTpl = \"    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
\";
        $item_str = \"\";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item[\'Title\'], $item[\'Description\'], $item[\'PicUrl\'], $item[\'Url\']);
        }
        $newsTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>\";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }

    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = \"<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>\";

        $item_str = sprintf($itemTpl, $musicArray[\'Title\'], $musicArray[\'Description\'], $musicArray[\'MusicUrl\'], $musicArray[\'HQMusicUrl\']);

        $textTpl = \"<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>\";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    private function logger($log_content)
    {
        if(isset($_SERVER[\'HTTP_APPNAME\'])){   //SAE
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        }else if($_SERVER[\'REMOTE_ADDR\'] != \"127.0.0.1\"){ //LOCAL
            $max_size = 10000;
            $log_filename = \"log.xml\";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
            file_put_contents($log_filename, date(\'H:i:s\').\" \".$log_content.\"\\r\\n\", FILE_APPEND);
        }
    }
}
?>

本文地址:https://www.stayed.cn/item/3098

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。