当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-02 09:44:57 浏览: 评论:0 

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

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

http://mp.weixin.qq.com

2. 下载demo

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

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

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

  1. ▾ extensions/ 
  2.       ▾ weixin/ 
  3.           Weixin.php* 

Weixin.php代码内容:

  1. <?php 
  2.    
  3. /** 
  4.  * WeixinCallback  
  5.  *  
  6.  * @package  
  7.  * @version $id$ 
  8.  * @copyright 1997-2005 The PHP Group 
  9.  * @author davidhhuan@126.com 
  10.  * {@link <a href="http://www.sharefamily.net" rel="external nofollow" target="_blank">http://www.sharefamily.net</a>} 
  11.  */ 
  12. class Weixin 
  13.   //$_GET参数 
  14.   public $signature
  15.   public $timestamp
  16.   public $nonce
  17.   public $echostr
  18.   // 
  19.   public $token
  20.   public $debug = false; 
  21.   public $msg = array(); 
  22.   public $setFlag = false; 
  23.    
  24.   /** 
  25.    * __construct  
  26.    *  
  27.    * @param mixed $params  
  28.    * @access public 
  29.    * @return void 
  30.    */ 
  31.   public function __construct($params
  32.   { 
  33.     foreach ($params as $k1 => $v1
  34.     { 
  35.       if (property_exists($this$k1)) 
  36.       { 
  37.         $this->$k1 = $v1
  38.       } 
  39.     } 
  40.   } 
  41.      
  42.   /** 
  43.    * valid  
  44.    *  
  45.    * @access public 
  46.    * @return void 
  47.    */ 
  48.   public function valid() 
  49.   { 
  50.     //valid signature , option 
  51.     if($this->checkSignature()){ 
  52.       echo $this->echostr; 
  53.       Yii::app()->end(); 
  54.     } 
  55.   } 
  56.    
  57.   /** 
  58.    * 获得用户发过来的消息(消息内容和消息类型 )  
  59.    *  
  60.    * @access public 
  61.    * @return void 
  62.    */ 
  63.   public function init() 
  64.   { 
  65.     $postStr = emptyempty($GLOBALS["HTTP_RAW_POST_DATA"]) ? '' : $GLOBALS["HTTP_RAW_POST_DATA"]; 
  66.     if ($this->debug)  
  67.     { 
  68.       $this->log($postStr); 
  69.     } 
  70.     if (!emptyempty($postStr)) { 
  71.       $this->msg = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA); 
  72.     } 
  73.   } 
  74.    
  75.   /** 
  76.    * makeEvent  
  77.    *  
  78.    * @access public 
  79.    * @return void 
  80.    */ 
  81.   public function makeEvent() 
  82.   { 
  83.        
  84.   } 
  85.    
  86.   /** 
  87.    * 回复文本消息  
  88.    *  
  89.    * @param string $text  
  90.    * @access public 
  91.    * @return void 
  92.    */ 
  93.   public function makeText($text=''
  94.   { 
  95.     $createTime = time(); 
  96.     $funcFlag = $this->setFlag ? 1 : 0; 
  97.     $textTpl = "<xml> 
  98.       <ToUserName><![CDATA[{$this->msg->FromUserName}]]></ToUserName> 
  99.       <FromUserName><![CDATA[{$this->msg->ToUserName}]]></FromUserName> 
  100.       <CreateTime>{$createTime}</CreateTime> 
  101.       <MsgType><![CDATA[text]]></MsgType> 
  102.       <Content><![CDATA[%s]]></Content> 
  103.       <FuncFlag>%s</FuncFlag> 
  104.       </xml>"; 
  105.     return sprintf($textTpl,$text,$funcFlag); 
  106.   } 
  107.      
  108.   /** 
  109.    * 根据数组参数回复图文消息  
  110.    *  
  111.    * @param array $newsData  
  112.    * @access public 
  113.    * @return void 
  114.    */ 
  115.   public function makeNews($newsData=array()) 
  116.   { 
  117.     $createTime = time(); 
  118.     $funcFlag = $this->setFlag ? 1 : 0; 
  119.     $newTplHeader = "<xml> 
  120.       <ToUserName><![CDATA[{$this->msg->FromUserName}]]></ToUserName> 
  121.       <FromUserName><![CDATA[{$this->msg->ToUserName}]]></FromUserName> 
  122.       <CreateTime>{$createTime}</CreateTime> 
  123.       <MsgType><![CDATA[news]]></MsgType> 
  124.       <ArticleCount>%s</ArticleCount><Articles>"; 
  125.     $newTplItem = "<item> 
  126.       <Title><![CDATA[%s]]></Title> 
  127.       <Description><![CDATA[%s]]></Description> 
  128.       <PicUrl><![CDATA[%s]]></PicUrl> 
  129.       <Url><![CDATA[%s]]></Url> 
  130.       </item>"; 
  131.     $newTplFoot = "</Articles> 
  132.       <FuncFlag>%s</FuncFlag> 
  133.       </xml>"; 
  134.     $content = ''
  135.     $itemsCount = count($newsData['items']); 
  136.     //微信公众平台图文回复的消息一次最多10条 
  137.     $itemsCount = $itemsCount < 10 ? $itemsCount : 10; 
  138.     if ($itemsCount) { 
  139.       foreach ($newsData['items'as $key => $item) { 
  140.         if ($key<=9) { 
  141.           $content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']); 
  142.         } 
  143.       } 
  144.     } 
  145.     $header = sprintf($newTplHeader,$itemsCount); 
  146.     $footer = sprintf($newTplFoot,$funcFlag); 
  147.     return $header . $content . $footer
  148.   } 
  149.    
  150.   /** 
  151.    * reply  
  152.    *  
  153.    * @param mixed $data  
  154.    * @access public 
  155.    * @return void 
  156.    */ 
  157.   public function reply($data
  158.   { 
  159.     if ($this->debug)  
  160.     { 
  161.       $this->log($data); 
  162.     } 
  163.     echo $data
  164.   } 
  165.    
  166.   /** 
  167.    * checkSignature  
  168.    *  
  169.    * @access private 
  170.    * @return void 
  171.    */ 
  172.   private function checkSignature() 
  173.   { 
  174.     $tmpArr = array($this->token, $this->timestamp, $this->nonce); 
  175.     sort($tmpArr); 
  176.     $tmpStr = implode( $tmpArr ); 
  177.     $tmpStr = sha1( $tmpStr ); 
  178.        
  179.     if$tmpStr == $this->signature ){ 
  180.       return true; 
  181.     }else
  182.       return false; 
  183.     } 
  184.   } 
  185.    
  186.   /** 
  187.    * log  
  188.    *  
  189.    * @access private 
  190.    * @return void 
  191.    */ 
  192.   private function log($log
  193.   { 
  194.     if ($this->debug) 
  195.     { 
  196.       file_put_contents(Yii::getPathOfAlias('application').'/runtime/weixin_log.txt', var_export($log, true)."\n\r", FILE_APPEND); 
  197.     } 
  198.   } 

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

  1. /** 
  2.    * actionIndex  
  3.    *  
  4.    * @access public 
  5.    * @return void 
  6.    */ 
  7.   public function actionIndex() 
  8.   { 
  9.     $weixin = new Weixin($_GET); 
  10.     $weixin->token = $this->_weixinToken; 
  11.     //$weixin->debug = true; 
  12.    
  13.     //网址接入时使用 
  14.     if (isset($_GET['echostr'])) 
  15.     { 
  16.       $weixin->valid(); 
  17.     } 
  18.        
  19.     $weixin->init(); 
  20.     $reply = ''
  21.     $msgType = emptyempty($weixin->msg->MsgType) ? '' : strtolower($weixin->msg->MsgType); 
  22.     switch ($msgType
  23.     { 
  24.     case 'text'
  25.       //你要处理文本消息代码 
  26.       break
  27.     case 'image'
  28.       //你要处理图文消息代码 
  29.       break
  30.     case 'location'
  31.       //你要处理位置消息代码 
  32.       break
  33.     case 'link'
  34.       //你要处理链接消息代码 
  35.       break
  36.     case 'event'
  37.       //你要处理事件消息代码 
  38.       break
  39.     default:  
  40.       //无效消息情况下的处理方式 
  41.       break
  42.     } 
  43.     $weixin->reply($reply); 
  44.   } 

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

Tags: Framework Yii开发微信公众平台

分享到: