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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
php中Ctype函数用法详解
Dec 09 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
多种js图片预加载实现方式分享
2016/02/19 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Django中使用locals()函数的技巧
2015/07/16 Python
Python模拟登陆实现代码
2017/06/14 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
python实现定时提取实时日志程序
2018/06/22 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python 下载文件的多种方法汇总
2020/11/17 Python
Python页面加载的等待方式总结
2021/02/28 Python
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
外包公司软件测试工程师
2014/11/01 面试题
本科生详细的自我评价
2013/09/19 职场文书
元宵节晚会主持词
2015/07/01 职场文书