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 $timestamp;
  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程序设计有所帮助。

(0)

相关推荐

  • YII Framework框架教程之使用YIIC快速创建YII应用详解

    本文实例讲述了YII Framework框架使用YIIC快速创建YII应用的方法.分享给大家供大家参考,具体如下: yii提供了强大的命令行工具来快速的创建相关组件和应用.</span> cd进入yii/framework框架的根目录. 执行 # php yiic Yii command runner (based on Yii v1.1.8) Usage: yiic <command-name> [parameters...] The following commands are

  • 记录Yii2框架开发微信公众号遇到的问题及解决方法

    微信公众号开发,提示"该公众号暂时无法提供服务,请稍后再试",如何解决? 以前使用Yii框架的时候,并没有像Yii2,以前的Yii框架似乎用起来在安全方面不如Yii2,后面在用Yii2的时候发现了一个有趣的事情. 以前在用Yii框架做微信方面的开发的时候,开发模式需要添加对应的接口. 这里一定要注意点的点是在做接口验证的时候是使用GET请求,这个毫无疑问没有任何问题,但是在验证完之后,进行接口上面的交互的时候就有问题了,使用的POST的请求. 如果是以前的Yii的话,如果没有做严格的p

  • 完美利用Yii2微信后台开发的系列总结

    网上有很多关于YII2.0微信开发教程,但是太过复杂凌乱,所以今天在这里给大家整理总结利用Yii2微信后台开发的系列了,给需要的小伙伴们参考. 一:接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return [ //微信接入 'wechat' =>[ 'token' => 'your token', ], ]; 2.在app/config/main.php中配置路由 因为接口模块使用的RESTful API,所以需要定义路由规则. 'urlM

  • YII Framework框架教程之缓存用法详解

    本文实例讲述了YII Framework框架缓存用法.分享给大家供大家参考,具体如下: 缓存的产生原因众所周知.于是YII作为一个高效,好用的框架,不能不支持缓存.所以YII对各种流行的缓存都提供了接口,你可以根据你的需要使用不同的缓存. 1.YII中的缓存介绍 YII中的缓存是通过组件方式定义的,具体在如下目录 /yii_dev/yii/framework/caching# tree . ├── CApcCache.php ├── CCache.php ├── CDbCache.php ├──

  • YII Framework框架使用YIIC快速创建YII应用之migrate用法实例详解

    本文实例讲述了YII Framework框架使用YIIC快速创建YII应用之migrate用法.分享给大家供大家参考,具体如下: yii migrate 查看帮助 /* /www/yii_dev/yii/framework# php yiic migrate help Error: Unknown action: help USAGE yiic migrate [action] [parameter] DESCRIPTION This command provides support for d

  • YII Framework框架教程之安全方案详解

    本文讲述了YII Framework框架的安全方案.分享给大家供大家参考,具体如下: web应用的安全问题是很重要的,在"黑客"盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案.当然这里讲的安全是片面的,但是值得一看. 官方提供的解决方案有:如下 1. 跨站脚本攻击的防范 跨站脚本攻击(简称 XSS),即web应用从用户收集用户数据. 攻击者常常向易受攻击的web应用注入JavaScript,VBScript,ActiveX,HT

  • Yii PHP Framework实用入门教程(详细介绍)

    说明:因为最近工作工作关系,需要开发一个在Linux下运行的Web Application,需要对现在比较流行的一些PHP框架做一个了解和评估,下面的这篇文章是笔者最近学习一个比较新的PHP Framework的一点经历和操作步骤,因为官方的手册写得比较晦涩(特别是中文的),曾经尝试遍读它那个手册再动手,读了一大半发现仍无法理解,于是干脆先下手为强了,因而也就有了下面的文章. 介绍Yii 是一个基于组件.纯OOP的.用于开发大型 Web 应用的高性能 PHP 框架.它将 Web 编程中的可重用性

  • 使用YII2框架实现微信公众号中表单提交功能

    刚接触微信,要做一个在手机上的表单提交功能. 需求有这些: 只能在数据库中存在的手机号看到表单. 表单可以重复提交. 第一次进入表单需要验证 分享出去的页面,别人进入后也需要验证. 因为每个手机在同一个公众号当中的openid是唯一性的.所以在手机查看这个表单页面的时候,就将这个openid存到数据库中,方便下次提交可以验证. 下面是我的代码.使用的是YII2框架. Controller //获得回调函数 public function actionCallback($code,$state){

  • YiiFramework入门知识点总结(图文教程)

    本文总结了YiiFramework入门知识点.分享给大家供大家参考,具体如下: 创建Yii应用骨架 web为网站根目录 yiic webapp /web/demo 通过GII创建model和CURD时需要注意 1.Model Generator 操作 即使在有表前缀的情况下,Table Name中也要填写表的全名,即包括表前缀.如下图: 2.Crud Generator 操作 该界面中,Model Class中填写model名称.首字母大写.也可参照在生成model时,在proctected/m

  • Yii Framework框架获取分类下面的所有子类方法

    获取分类下面的所有子类方法: static function getMenuTree($arrCat, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty($arrCat)) return FALSE; $level++; if($level == 1) $arrTree[] = $parent_id; foreach($arrC

  • YII Framework框架教程之国际化实现方法

    本文讲述了YII Framework框架教程之国际化实现方法.分享给大家供大家参考,具体如下: 一个web应用,发布到互联网,就是面向全球用户.用户在世界的各个角落都可以访问到你的web应用,当然要看你的网站和不和谐,不和谐的web应用在和谐社会是不让你访问的. YII提供了国际化的支持,可以让我们创建的应用适合不同语言的人群. 国际化是一个很花哨的东西,没有哪个大型的网站真正能做到国际化.大多都是针对不懂的语言,不同地区设计不同的网站.如果你的应用相对较小,处理的东西不多,那么国际化起来的东西

随机推荐