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+xslt在windows平台上
Oct 09 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php 时间计算问题小结
Jan 04 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
php实现断点续传大文件示例代码
Jun 19 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中feof()函数实例测试
2014/08/23 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python实现电脑自动关机
2018/06/20 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
实例详解Python模块decimal
2019/06/26 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
小学少先队活动方案
2014/02/18 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
宾馆安全管理制度
2015/08/06 职场文书
优秀员工演讲稿
2019/06/21 职场文书
导游词之山东孔庙
2019/11/04 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
windows系统搭建WEB服务器详细教程
2022/08/05 Servers