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


Posted in PHP onApril 26, 2020

本文实例讲述了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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
PHP反射机制用法实例
Aug 28 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php实现比较全的数据库操作类
Jun 18 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 PHP
如何用PHP实现分布算法之一致性哈希算法
May 26 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 #PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 #PHP
PHP优化之批量操作MySQL实例分析
Apr 23 #PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 #PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 #PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 #PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 #PHP
You might like
解析php中heredoc的使用方法
2013/06/17 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
IE下js调试工具Companion.JS
2010/10/15 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
面试常见的js算法题
2017/03/23 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
python发送邮件实例分享
2017/07/28 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
python实现归并排序算法
2018/11/22 Python
Python实现FTP文件传输的实例
2019/07/07 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
商务主管岗位职责
2013/12/08 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
房贷收入证明范本
2015/06/12 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android