weixinModel.php基于mPHP开发的PHP微信模块

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/90/ ]

很早就想写相关的技术分享了,例如如何通过PHP调用微信API,如何使用sphinx实现站内的搜索功能等等一系列我已经实现了的开源技术,但是因为各种各样的原因,迟迟没有下笔.今天有时间,就顺笔写一下基于mPHP​开发的通用微信模块吧.

很早就想写相关的技术分享了,例如如何通过PHP调用微信API,如何使用sphinx实现站内的搜索功能等等一系列我已经实现了的开源技术,但是因为各种各样的原因,迟迟没有下笔。今天有时间,就顺笔写一下基于mPHP开发的通用微信模块吧。

先展示一下使用示例:

<?php
$weixinModel = new weixinModel();
$arrMsg = $weixinModel->getMsg();
if( isset($_GET["echostr"]) ) {
    //验证开发者身份
    $weixinModel->valid();
} elseif( $arrMsg['MsgType'] == 'event' && ( $arrMsg['Event'] == 'subscribe' || $arrMsg['Event'] == 'unsubscribe') ) {
    //关注或取消关注
    if( $arrMsg['Event'] == 'subscribe' ) {
       $weixinModel->subscribe($arrMsg);
    } else {
        //$weixinModel->unsubscribe($arrMsg);
    }
} else {
    //根据用户回复的数字调用相关功能
    $this->service->controller();
    exit;
}

weixinModel的代码实现如下:

<?php
class weixinModel {
    private $token = '设定的token';
    
    public function __construct() {
    }
    
    //微信验证
    public function valid() {
        $echoStr = $_GET["echostr"];
        if( $this->checkSignature() ) {
            echo $echoStr;
            exit;
        }
    }
    
    private function checkSignature() {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = $this->token;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ) {
            return true;
        } else {
            return false;
        }
    }
    
    //解析微信服务器发送过来的xml消息
    public function getMsg() {
        $arrMsg = array();
        $post = $GLOBALS["HTTP_RAW_POST_DATA"];//get post data, May be due to the different environments
        if( !empty($post) ) {
            $objXml = simplexml_load_string($post, 'SimpleXMLElement', LIBXML_NOCDATA);
            foreach( $objXml as $key => $row ) {
                $arrMsg[$key] = $objXml->$key;
            }
            $arrMsg['Content'] = trim($arrMsg['Content']);
        }
        return $arrMsg;
    }
    
    //向微信服务器推送xml消息
    public function putMsg($arrData) {
        //推送消息的时候,互换发信人与收信人的微信号
        $ToUserName = $arrData['FromUserName'];
        $FromUserName = $arrData['ToUserName'];
        $MsgType = $arrData['MsgType'];
        $Content = $arrData['Content'];
        $CreateTime = $_SERVER['REQUEST_TIME'];
        
        $strXml = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    <FuncFlag>0</FuncFlag>
                    </xml>"; 
        $strXml = sprintf($strXml, $ToUserName, $FromUserName, $CreateTime, $MsgType, $Content);
        //$strXml = sprintf($strXml, $ToUserName, $FromUserName, $CreateTime);
        echo $strXml;
    }
    
    /*
    微信用户订阅的时候,磨途歌提示的信息
    $arrMsg:从微信服务器获取用户发送过来的信息
    */
    public function subscribe($arrMsg) {
        $CreateTime = $_SERVER['REQUEST_TIME'];
        $strXml = "
        <xml>
        <ToUserName><![CDATA[{$arrMsg['FromUserName']}]]></ToUserName>
        <FromUserName><![CDATA[{$arrMsg['ToUserName']}]]></FromUserName>
        <CreateTime>{$CreateTime}</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <ArticleCount>1</ArticleCount>
        <Articles>
            <item>
            <Title><![CDATA[感谢您订阅磨途歌]]></Title> 
            <Description><![CDATA[您的支持是我们精彩的延续,我们会努力为您提供优质的博客资讯]]></Description>
            <PicUrl><![CDATA[".IMG_URL."]]></PicUrl>
            <Url><![CDATA[".U()."]]></Url>
            </item>
        </Articles>
        </xml> ";
        $strXml = mini_html($strXml);
        echo $strXml;
    }
    
    /*
    创建xml格式图文信息
    $arrMsg:从微信服务器获取用户发送过来的信息
    $arrBlog:文章数据
    */
    public function getBlogXml($arrMsg,$arrBlog) {
        $intCount = count($arrBlog);
        $CreateTime = $_SERVER['REQUEST_TIME'];
        
        $strXml = "
        <xml>
        <ToUserName><![CDATA[{$arrMsg['FromUserName']}]]></ToUserName>
        <FromUserName><![CDATA[{$arrMsg['ToUserName']}]]></FromUserName>
        <CreateTime>{$CreateTime}</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <ArticleCount>{$intCount}</ArticleCount>
        <Articles>";
        
        foreach( $arrBlog as $row ) {
            $strXml .= "
            <item>
            <Title><![CDATA[{$row['title']}]]></Title> 
            <Description><![CDATA[{$row['description']}]]></Description>
            <PicUrl><![CDATA[".IMG_URL."{$row['img']}]]></PicUrl>
            <Url><![CDATA[".U("a=view&id=$row[id]")."]]></Url>
            </item>";
        }
        $strXml .= "
        </Articles>
        </xml> ";
        $strXml = mini_html($strXml);
        echo $strXml;
    }

}

weixinModel模块已经把关键的功能给封装好了,如果自己有特殊需求,只要根据微信提供的文档进行开发即可。

可以关注我的微信体验一下:http://mo2g.com/message/

评论:

  1. unknown 回复2015年06月01日 20时10分
    磨者
    好文章,内容淋漓尽致.禁止此消息:nolinkok@163.com
    肉牛 http://www.xmten.com/

  2. 我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码