前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Yii Framework框架开发微信公众平台示例

Yii Framework框架开发微信公众平台示例

作者头像
砸漏
发布2020-11-02 15:25:44
3390
发布2020-11-02 15:25:44
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

本文实例讲述了Yii Framework框架开发微信公众平台。分享给大家供大家参考,具体如下:

1. 先到微信公众平台注册帐号

http://mp.weixin.qq.com

2. 下载demo

微信公众平台提供了一个十分“朴素”的demo,说明如何调用消息接口的。代码真的很朴素,具体内容可到官网下载。

3. 按照Yii的规则,做一个extension。

这里命名为 weixin,目录结构如下:

▾ extensions/ ▾ weixin/ Weixin.php*

Weixin.php代码内容:

代码语言:javascript
复制
<?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里面

代码语言:javascript
复制
/**
* 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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档