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 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
php5.3 废弃函数小结
May 16 PHP
PHP获取url的函数代码
Aug 02 PHP
php中模拟POST传递数据的两种方法分享
Sep 16 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
PHP实现关键字搜索后描红功能示例
Jul 03 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
js中function()使用方法
2013/12/24 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python当中的array数组对象实例详解
2019/06/12 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
测绘工程系学生的自我评价
2013/11/30 职场文书
医院护士的求职信
2014/01/03 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
会计自我鉴定
2014/02/04 职场文书
环保倡议书500字
2014/05/15 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
合作意向协议书
2015/01/29 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
趣味运动会标语口号
2015/12/26 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技