微信公众平台 验证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;
    }

}
原文地址:https://www.cnblogs.com/feiwu123/p/5234007.html