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 相关文章推荐
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
thinkphp实现多语言功能(语言包)
Mar 04 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 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 闭包特性在实际应用中的问题
2009/10/30 PHP
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
js实现选项卡效果
2020/03/07 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
成考报名单位证明范本
2014/01/16 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
企业授权委托书范本
2014/09/22 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
hive数据仓库新增字段方法
2022/06/25 数据库
MySQL存储过程及语法详解
2022/08/05 MySQL