使用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" 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);
    }

本文来源:http://www.cnblogs.com/davidhhuan/archive/2013/04/02/2996526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值