Token验证

<?php

/*

    CopyRight 2019 All Rights Reserved

*/

header('Content-type:text');

define("TOKEN", "myssfwh1234");

class WeChat

{

    //验证签名

    public function valid()

    {

        $echoStr = $_GET["echostr"];

        $signature = $_GET["signature"];

        $timestamp = $_GET["timestamp"];

        $nonce = $_GET["nonce"];

        $token = TOKEN;

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

        sort($tmpArr, SORT_STRING);

        $tmpStr = sha1(implode($tmpArr));

        if($tmpStr == $signature){

            echo $echoStr;

            exit;

        }

    }

    //响应消息

    public function responseMsg()

    {

        $postStr = file_get_contents("php://input");

        if (!empty($postStr)){

            $this->logger("R \r\n".$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":  //视频、小视频

case "shortvideo":

                    $result = $this->receiveVideo($postObj);

                    break;

                case "link":  //链接

                    $result = $this->receiveLink($postObj);

                    break;

                case "file":  //文件

                    $result = $this->receiveFile($postObj);

                    break;

                default:

                    $result = "unknown msg type: ".$RX_TYPE;

                    break;

            }

            $this->logger("T \r\n".$result);

            echo $result;

        }else {

            echo "";

            exit;

        }

    }

    //接收事件消息

    private function receiveEvent($object)

    {

        $content = "";

        switch ($object->Event)

        {

            case "subscribe":

                $content = "欢迎关注方倍工作室 \n请回复以下关键字:文本 表情 链接 图文 音乐\n请按住说话 或 点击 + 再分别发送以下内容:语音 图片 小视频 我的收藏 位置";

                if (!empty($object->EventKey)){

                    $content .= "\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey);

                }

                break;

            case "unsubscribe":

                $content = "取消关注";

                break;

            case "CLICK":

                switch ($object->EventKey)

                {

                    case "TEXT":

                        $content = "微笑:/::)\n乒乓:/:oo\n裙子:?\n六角星:?\n仙人掌:?";

                        break;

case "SINGLENEWS":  //单图文

                        $content = array();

$content[] = array("Title"=>"单图文标题",  "Description"=>"单图文内容", "PicUrl"=>"https://files-cdn.cnblogs.com/files/txw1958/cartoon.gif", "Url" =>"http://m.cnblogs.com/?u=txw1958");

                        break;

case "MULTINEWS":  //多图文

                        $content = array();

$content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"https://files-cdn.cnblogs.com/files/txw1958/cartoon.gif", "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 "MUSIC":  //音乐

                        $content = array();

$content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://mascot-music.stor.sinaapp.com/zxmzf.mp3", "HQMusicUrl"=>"http://mascot-music.stor.sinaapp.com/zxmzf.mp3");

                        break;

                    default:

                        $content = "点击菜单:".$object->EventKey;

                        break;

                }

                break;

            case "VIEW":

                $content = "跳转链接 ".$object->EventKey;

                break;

            case "SCAN":

                $content = "扫描场景 ".$object->EventKey;

                break;

            case "LOCATION":

                $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude;

                break;

            case "scancode_waitmsg":

                if ($object->ScanCodeInfo->ScanType == "qrcode"){

                    $content = "扫码带提示:类型 二维码 结果:".$object->ScanCodeInfo->ScanResult;

                }else if ($object->ScanCodeInfo->ScanType == "barcode"){

                    $codeinfo = explode(",",strval($object->ScanCodeInfo->ScanResult));

                    $codeValue = $codeinfo[1];

                    $content = "扫码带提示:类型 条形码 结果:".$codeValue;

                }else{

                    $content = "扫码带提示:类型 ".$object->ScanCodeInfo->ScanType." 结果:".$object->ScanCodeInfo->ScanResult;

                }

                break;

            case "scancode_push":

                $content = "扫码推事件";

                break;

            case "pic_sysphoto":

                $content = "系统拍照";

                break;

            case "pic_weixin":

                $content = "相册发图:数量 ".$object->SendPicsInfo->Count;

                break;

            case "pic_photo_or_album":

                $content = "拍照或者相册:数量 ".$object->SendPicsInfo->Count;

                break;

            case "location_select":

                $content = "发送位置:标签 ".$object->SendLocationInfo->Label;

                break;

            default:

                $content = "receive a new event: ".$object->Event;

                break;

        }

        if(is_array($content)){

            if (isset($content[0])){

                $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 receiveText($object)

    {

        $keyword = trim($object->Content);

        //多客服人工回复模式

        if (strstr($keyword, "请问在吗") || strstr($keyword, "在线客服")){

            $result = $this->transmitService($object);

            return $result;

        }

        //自动回复模式

        if (strstr($keyword, "文本")){

            $content = "这是个文本消息";

        }else if (strstr($keyword, "表情")){

            $content = "微笑:/::)\n乒乓:/:oo\n裙子:?\n六角星:?\n仙人掌:?";

        }else if (strstr($keyword, "链接")){

            $content = "电话号码:0755-83765566\n\n电子邮件:40012345@qq.com\n\n访问链接:<a href='http://m.cnblogs.com/?u=txw1958'>点此访问方倍网</a>";

        }else if (strstr($keyword, "图文")){

            $content = array();

            $content[] = array("Title"=>"图文标题",  "Description"=>"图文内容", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");

        }else if (strstr($keyword, "音乐")){

            $content = array();

            $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://mascot-music.stor.sinaapp.com/zxmzf.mp3", "HQMusicUrl"=>"http://mascot-music.stor.sinaapp.com/zxmzf.mp3");

        }else{

            $content = date("Y-m-d H:i:s",time())."\nOpenID:".$object->FromUserName."\n技术支持 方倍工作室";

// $content = "";

        }

        if(is_array($content)){

            if (isset($content[0])){

                $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_Y.";纬度为:".$object->Location_X.";缩放级别为:".$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 receiveFile($object)

    {

        $content = "你发送的是文件,标题为:".$object->Title.";大小为:".$object->Description.";文件MD5为:".$object->FileMd5.";文件长度为:".$object->FileTotalLen;

        $result = $this->transmitText($object, $content);

        return $result;

    }



    //回复文本消息

    private function transmitText($object, $content)

    {

        if (!isset($content) || empty($content)){

            return "";

        }

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

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

</xml>";

        $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);

        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']);

        }

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

    <ArticleCount>%s</ArticleCount>

    <Articles>

$item_str    </Articles>

</xml>";

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

        return $result;

    }

    //回复音乐消息

    private function transmitMusic($object, $musicArray)

    {

        if(!is_array($musicArray)){

            return "";

        }

        $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']);

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

    $item_str

</xml>";

        $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());

        return $result;

    }

    //回复图片消息

    private function transmitImage($object, $imageArray)

    {

        $itemTpl = "<Image>

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

    </Image>";

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

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

    $item_str

</xml>";

        $result = sprintf($xmlTpl, $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']);

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

    $item_str

</xml>";

        $result = sprintf($xmlTpl, $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']);

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

    $item_str

</xml>";

        $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());

        return $result;

    }

    //回复多客服消息

    private function transmitService($object)

    {

        $xmlTpl = "<xml>

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

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

    <CreateTime>%s</CreateTime>

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

</xml>";

        $result = sprintf($xmlTpl, $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 = 1000000;

            $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('Y-m-d H:i:s')." ".$log_content."\r\n", FILE_APPEND);

        }

    }

}

$wechat = new WeChat();

if (!isset($_GET['echostr'])) {

    $wechat->responseMsg();

}else{

    $wechat->valid();

}

?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,通常使用token来对用户进行身份验证和授权。引用是一个示例代码,它演示了如何创建一个用于生成和验证token的类。该类名为Jwt,它引入了一些必要的模块,如fs、path和jsonwebtoken。该类具有两个方法:generateToken用于生成token,verifyToken用于验证token。生成token时,需要传入数据和有效期,同时使用私钥对数据进行签名;验证token时,需要传入token并使用公钥进行验证。如果验证通过,则返回token中的数据,否则返回错误信息。 在示例代码中,展示了如何在用户登录成功后生成对应的token并返回给客户端。这段代码引入了JwtUtil工具类和AesUtil工具类。在登录接口中,首先查询用户名对应的用户信息,然后使用AesUtil进行密码解密,将解密后的密码与用户输入的密码进行比较。如果匹配成功,则生成对应的token,并将其返回给客户端。 为了保护需要验证身份信息的请求接口,示例代码中引入了中间件函数。该函数对所有需要验证身份的请求进行拦截,并校验token的合法性。如果token校验通过,则继续执行下一个中间件或路由处理程序;否则,返回登录信息不正确的错误提示。 综上所述,可以使用示例代码中的Jwt类来生成和验证token,然后在登录接口中生成对应的token并返回给客户端,同时使用中间件函数来拦截需要验证身份信息的请求并校验token的合法性。这样可以实现Node.js中的token验证机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值