• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Yii Framework框架开发微信公众平台示例

    本文实例讲述了Yii Framework框架开发微信公众平台。分享给大家供大家参考,具体如下:

    1. 先到微信公众平台注册帐号

    http://mp.weixin.qq.com

    2. 下载demo

    微信公众平台提供了一个十分“朴素”的demo,说明如何调用消息接口的。代码真的很朴素,具体内容可到官网下载。

    3. 按照Yii的规则,做一个extension。

    这里命名为 weixin,目录结构如下:

    ▾ extensions/
          ▾ weixin/
              Weixin.php*

    Weixin.php代码内容:

    ?php
     
    /**
     * WeixinCallback 
     * 
     * @package 
     * @version $id$
     * @copyright 1997-2005 The PHP Group
     * @author davidhhuan@126.com
     * {@link a href="http://www.sharefamily.net" rel="external nofollow" target="_blank">http://www.sharefamily.net/a>}
     */
    class Weixin
    {
      //$_GET参数
      public $signature;
      public $timest
      public $nonce;
      public $echostr;
      //
      public $token;
      public $debug = false;
      public $msg = array();
      public $setFlag = false;
     
      /**
       * __construct 
       * 
       * @param mixed $params 
       * @access public
       * @return void
       */
      public function __construct($params)
      {
        foreach ($params as $k1 => $v1)
        {
          if (property_exists($this, $k1))
          {
            $this->$k1 = $v1;
          }
        }
      }
       
      /**
       * valid 
       * 
       * @access public
       * @return void
       */
      public function valid()
      {
        //valid signature , option
        if($this->checkSignature()){
          echo $this->echostr;
          Yii::app()->end();
        }
      }
     
      /**
       * 获得用户发过来的消息(消息内容和消息类型 ) 
       * 
       * @access public
       * @return void
       */
      public function init()
      {
        $postStr = empty($GLOBALS["HTTP_RAW_POST_DATA"]) ? '' : $GLOBALS["HTTP_RAW_POST_DATA"];
        if ($this->debug) 
        {
          $this->log($postStr);
        }
        if (!empty($postStr)) {
          $this->msg = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        }
      }
     
      /**
       * makeEvent 
       * 
       * @access public
       * @return void
       */
      public function makeEvent()
      {
         
      }
     
      /**
       * 回复文本消息 
       * 
       * @param string $text 
       * @access public
       * @return void
       */
      public function makeText($text='')
      {
        $createTime = time();
        $funcFlag = $this->setFlag ? 1 : 0;
        $textTpl = "xml>
          ToUserName>![CDATA[{$this->msg->FromUserName}]]>/ToUserName>
          FromUserName>![CDATA[{$this->msg->ToUserName}]]>/FromUserName>
          CreateTime>{$createTime}/CreateTime>
          MsgType>![CDATA[text]]>/MsgType>
          Content>![CDATA[%s]]>/Content>
          FuncFlag>%s/FuncFlag>
          /xml>";
        return sprintf($textTpl,$text,$funcFlag);
      }
       
      /**
       * 根据数组参数回复图文消息 
       * 
       * @param array $newsData 
       * @access public
       * @return void
       */
      public function makeNews($newsData=array())
      {
        $createTime = time();
        $funcFlag = $this->setFlag ? 1 : 0;
        $newTplHeader = "xml>
          ToUserName>![CDATA[{$this->msg->FromUserName}]]>/ToUserName>
          FromUserName>![CDATA[{$this->msg->ToUserName}]]>/FromUserName>
          CreateTime>{$createTime}/CreateTime>
          MsgType>![CDATA[news]]>/MsgType>
          ArticleCount>%s/ArticleCount>Articles>";
        $newTplItem = "item>
          Title>![CDATA[%s]]>/Title>
          Description>![CDATA[%s]]>/Description>
          PicUrl>![CDATA[%s]]>/PicUrl>
          Url>![CDATA[%s]]>/Url>
          /item>";
        $newTplFoot = "/Articles>
          FuncFlag>%s/FuncFlag>
          /xml>";
        $content = '';
        $itemsCount = count($newsData['items']);
        //微信公众平台图文回复的消息一次最多10条
        $itemsCount = $itemsCount  10 ? $itemsCount : 10;
        if ($itemsCount) {
          foreach ($newsData['items'] as $key => $item) {
            if ($key=9) {
              $content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']);
            }
          }
        }
        $header = sprintf($newTplHeader,$itemsCount);
        $footer = sprintf($newTplFoot,$funcFlag);
        return $header . $content . $footer;
      }
     
      /**
       * reply 
       * 
       * @param mixed $data 
       * @access public
       * @return void
       */
      public function reply($data)
      {
        if ($this->debug) 
        {
          $this->log($data);
        }
        echo $data;
      }
     
      /**
       * checkSignature 
       * 
       * @access private
       * @return void
       */
      private function checkSignature()
      {
        $tmpArr = array($this->token, $this->timestamp, $this->nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
         
        if( $tmpStr == $this->signature ){
          return true;
        }else{
          return false;
        }
      }
     
      /**
       * log 
       * 
       * @access private
       * @return void
       */
      private function log($log)
      {
        if ($this->debug)
        {
          file_put_contents(Yii::getPathOfAlias('application').'/runtime/weixin_log.txt', var_export($log, true)."\n\r", FILE_APPEND);
        }
      }
    }
    
    

    使用方法,这里举例在SiteController里面

    /**
       * actionIndex 
       * 
       * @access public
       * @return void
       */
      public function actionIndex()
      {
        $weixin = new Weixin($_GET);
        $weixin->token = $this->_weixinToken;
        //$weixin->debug = true;
     
        //网址接入时使用
        if (isset($_GET['echostr']))
        {
          $weixin->valid();
        }
         
        $weixin->init();
        $reply = '';
        $msgType = empty($weixin->msg->MsgType) ? '' : strtolower($weixin->msg->MsgType);
        switch ($msgType)
        {
        case 'text':
          //你要处理文本消息代码
          break;
        case 'image':
          //你要处理图文消息代码
          break;
        case 'location':
          //你要处理位置消息代码
          break;
        case 'link':
          //你要处理链接消息代码
          break;
        case 'event':
          //你要处理事件消息代码
          break;
        default: 
          //无效消息情况下的处理方式
          break;
        }
        $weixin->reply($reply);
      }
    
    

    至此,基本的逻辑都实现了

    更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 记录Yii2框架开发微信公众号遇到的问题及解决方法
    • 使用YII2框架实现微信公众号中表单提交功能
    • 完美利用Yii2微信后台开发的系列总结
    • Yii PHP Framework实用入门教程(详细介绍)
    • YII Framework框架使用YIIC快速创建YII应用之migrate用法实例详解
    • YII Framework框架教程之使用YIIC快速创建YII应用详解
    • Yii Framework框架获取分类下面的所有子类方法
    • YiiFramework入门知识点总结(图文教程)
    • YII Framework框架教程之缓存用法详解
    • YII Framework框架教程之国际化实现方法
    • YII Framework框架教程之安全方案详解
    上一篇:PHP随机生成中文段落示例【测试网站内容时使用】
    下一篇:PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Yii Framework框架开发微信公众平台示例 Yii,Framework,框架,开发,微信,