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 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
php设计模式之命令模式的应用详解
May 21 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
php_pdo 预处理语句详解
Nov 21 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python交互界面的退出方法
2019/02/16 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python增加图像对比度的方法
2019/07/12 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
学校采购员岗位职责
2014/01/02 职场文书
高三历史教学反思
2014/01/09 职场文书
集中整治工作方案
2014/05/01 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书