zoukankan      html  css  js  c++  java
  • 微信公众平台 验证URL及简单设置

    加密/校验流程如下:
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    <?php 
    
    class Weixin extends My_Controller
    {
        public function __construct()
        {        
            parent::__construct(); 
            define('TOKEN','123456');            //定义常量
        }
    
    
       public function test()
       {
          header("Content-type:text/html;charset=utf-8");
          if (!isset($_GET['echostr']))
          {
              $this->responseMsg();
          }
          else
          {   
              $this->valid();
          }    
       }
       
    
       public function valid()
       {
          $echostr = $_GET["echostr"];
          if($this->check()){     
             header("Content-type:text");
             ob_clean();
             echo $echostr;                    //开发者模式接收到$echostr,再输出回去
             exit;
          }
       }
    
       public function check()
      {
            $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 );        //sha1加密
      
            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);
                $RX_TYPE = trim($postObj->MsgType);
    
                switch ($RX_TYPE)
                {
                    case "text":
                        $resultStr = $this->receiveText($postObj);
                        break;
                    case "event":
                        $resultStr = $this->receiveEvent($postObj);
                        break;
                    default:
                        $resultStr = "";
                        break;
                }
                echo $resultStr;
            }else {
                echo "";
                exit;
            }
        }
    
        private function receiveText($object)
        {
            $funcFlag = 0;
            $contentStr = "你发送的内容为:".$object->Content;
            $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
            return $resultStr;
        }
        
        private function receiveEvent($object)
        {
            $contentStr = "";
            switch ($object->Event)
            {
                case "subscribe":
                    $contentStr = "欢迎关注逍游";
                case "unsubscribe":
                    break;
                case "CLICK":
                    switch ($object->EventKey)
                    {
                        case "company":
                            $contentStr[] = array("Title" =>"公司简介", 
                            "Description" =>"逍游提供好玩的手游", 
                            "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", 
                            "Url" =>"http://xiaoyou-game.com");
                            break;
                        case "game":
                            $contentStr[] = array("Title" =>"星座召唤", 
                            "Description" =>"八十八星座来袭,你是什么座?", 
                            "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", 
                            "Url" =>"http://xzzh.xiaoyou-game.com");
                            break;
                        case "dhm":
                            $contentStr[] = array("Title" =>"礼包兑换码", 
                            "Description" =>"快点击领取游戏礼包兑换码吧~", 
                            "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", 
                            "Url" =>"http://xzzh.xiaoyou-game.com/web/list/lbdhm.shtml");
                            break;
                        default:
                            $contentStr[] = array("Title" =>"默认菜单回复", 
                            "Description" =>"您正在使用的是自定义菜单测试接口", 
                            "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
                            "Url" =>"weixin://addfriend/pondbaystudio");
                            break;
                    }
                    break;
                default:
                    break;      
    
            }
            if (is_array($contentStr)){
                $resultStr = $this->transmitNews($object, $contentStr);
            }else{
                $resultStr = $this->transmitText($object, $contentStr);
            }
            return $resultStr;
        }
    
        private function transmitText($object, $content, $funcFlag = 0)
        {
            $textTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <FuncFlag>%d</FuncFlag>
            </xml>";
            $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $funcFlag);
            return $resultStr;
        }
    
        private function transmitNews($object, $arr_item, $funcFlag = 0)
        {
            //首条标题28字,其他标题39字
            if(!is_array($arr_item))
                return;
    
            $itemTpl = "    <item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
            </item>
            ";
    
            $item_str = "";
            foreach ($arr_item 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>
            <FuncFlag>%s</FuncFlag>
            </xml>";
    
            $resultStr = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item), $funcFlag);
            return $resultStr;
        }
    
    }
  • 相关阅读:
    机器视觉行业分析
    lua sample code analysis
    My GPU info from "GPU Caps Viewer"
    网页hack程序编写
    debug redmine send email
    如何下载web资源
    看国内网络电视解决方案2
    看国内网络电视解决方案
    babel-polyfill使用与性能优化
    升级NGINX支持HTTP/2服务端推送
  • 原文地址:https://www.cnblogs.com/feiwu123/p/5234007.html
Copyright © 2011-2022 走看看