微信開發

<?php
/**
  * wechat php test
  */php

//define your token
//定義TOKEN密鑰
define("TOKEN", "weixin");
//實例化微信對象
$wechatObj = new wechatCallbackapiTest();
//驗證成功後,註釋掉valid方法
$wechatObj->valid();
//開啓自動回覆功能
$wechatObj->responseMsg();git

//定義類文件
class wechatCallbackapiTest
{
    //實現valid驗證方法:實現對接微信公衆平臺
    public function valid()
    {
        //接收隨機字符串
        $echoStr = $_GET["echostr"];算法

        //valid signature , option
        //進行用戶數字簽名驗證
        if($this->checkSignature()){
            //若是成功,則返回接收到的隨機字符串
            echo $echoStr;
            //退出
            exit;
        }
    }json

    //定義自動回覆功能
    public function responseMsg()
    {
        //get post data, May be due to the different environments
        //接收用戶端發送過來的XML數據
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];api

          //extract post data
        //判斷XML數據是否爲空
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                //經過simplexml進行xml解析
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //手機端
                $fromUsername = $postObj->FromUserName;
                //微信的公衆平臺
                $toUsername = $postObj->ToUserName;
                //接收用戶發送的關鍵詞
                $keyword = trim($postObj->Content);
                //接收用戶消息類型
                $msgType = $postObj->MsgType;
                //定義$longitude與$latitude接收用戶發送的經緯度信息
                $latitude = $postObj->Location_X;
                $longitude = $postObj->Location_Y;
                //時間戳
                $time = time();
                //文本發送模板
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";  
                //音樂發送模板
                $musicTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Music>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <MusicUrl><![CDATA[%s]]></MusicUrl>
                            <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
                            </Music>
                            </xml>";
                   //圖文發送模板
                   $newsTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <ArticleCount>%s</ArticleCount>
                            %s
                            </xml>";
                
                if($msgType=='text') {
                    //判斷用戶發送關鍵詞是否爲空
                    if(!empty( $keyword ))
                    {
                        if($keyword=='文本') {
                            //回覆類型,若是爲「text」,表明文本類型
                            $msgType = "text";
                            //回覆內容
                            $contentStr = "您發送的是文本消息";
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //把XML數據返回給手機端
                            echo $resultStr;
                        } elseif($keyword=='?' || $keyword=='?') {
                            //定義回覆類型
                            $msgType=='text';
                            //回覆內容
                            $contentStr = "【1】特種服務號碼\n【2】通信服務號碼\n【3】銀行服務號碼\n您能夠經過輸入【】方括號的編號獲取內容哦!";
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //返回數據到微信客戶端
                            echo $resultStr;
                        } elseif ($keyword=='1') {
                            //定義回覆類型
                            $msgType=='text';
                            //回覆內容
                            $contentStr = "經常使用特種服務號碼:\n匪警:110\n火警:119";
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //返回數據到微信客戶端
                            echo $resultStr;
                        } elseif ($keyword=='2') {
                            //定義回覆類型
                            $msgType=='text';
                            //回覆內容
                            $contentStr = "經常使用通信服務號碼:\n中移動:10086\n中電信:10000";
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //返回數據到微信客戶端
                            echo $resultStr;
                        } elseif ($keyword=='3') {
                            //定義回覆類型
                            $msgType=='text';
                            //回覆內容
                            $contentStr = "經常使用銀行服務號碼:\n工商銀行:95588\n建設銀行:95533";
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //返回數據到微信客戶端
                            echo $resultStr;
                        } elseif ($keyword=='音樂') {
                            //定義回覆類型
                            $msgType='music';
                            //定義音樂標題
                            $title = '冰雪奇緣';
                            //定義音樂描述
                            $desc = '《冰雪奇緣》原聲大碟...';
                            //定義音樂連接
                            $url = 'http://czbk888.duapp.com/music.mp3';
                            //定義高清音樂連接
                            $hqurl = 'http://czbk888.duapp.com/music.mp3';
                            //格式化字符串
                            $resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $msgType, $title, $desc, $url, $hqurl);
                            //返回XML數據到微信客戶端
                            echo $resultStr;
                        } elseif ($keyword=='圖文') {
                            //定義回覆類型
                            $msgType='news';
                            //定義返回圖文數量
                            $count = 4;
                            //組裝Articles節點信息
                            $str = '<Articles>';
                            for($i=1;$i<=$count;$i++) {
                                $str .= "<item>
                                        <Title><![CDATA[微信開發教程{$i}]]></Title> 
                                        <Description><![CDATA[傳智播客微信開發教程...]]></Description>
                                        <PicUrl><![CDATA[http://czbk888.duapp.com/images/{$i}.jpg]]></PicUrl>
                                        <Url><![CDATA[http://www.itcast.cn]]></Url>
                                        </item>";
                            }
                            $str .= '</Articles>';
                            //格式化字符串
                            $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, $msgType, $count, $str);
                            //輸出XML數據並返回到微信客戶端
                            echo $resultStr;
                        } else {
                            //定義回覆類型
                            $msgType='text';
                            //定義url連接操做
                            $url = "http://www.tuling123.com/openapi/api?key=9009fc44f168cfc7055c8a469821ce9b&info={$keyword}";
                            //模擬發送http中的get請求
                            $str = file_get_contents($url);
                            //格式化json字符串爲對象或數組
                            $json = json_decode($str);
                            //定義回覆內容
                            $contentStr = $json->text;
                            //格式化字符串
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            //返回數據到微信客戶端
                            echo $resultStr;
                        }
                    }else{
                        echo "Input something...";
                    }
                } elseif($msgType=='image') {
                    //回覆類型,若是爲「text」,表明文本類型
                    $msgType = "text";
                    //回覆內容
                    $contentStr = "您發送的是圖片消息";
                    //格式化字符串
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    //把XML數據返回給手機端
                    echo $resultStr;
                } elseif($msgType=='location') {
                    //回覆類型
                    $msgType='text';
                    //定義接口請求地址
                    $url = "http://api.map.baidu.com/telematics/v3/reverseGeocoding?location={$longitude},{$latitude}&coord_type=gcj02&output=json&ak=2pReiGS2nQV9Gi7tslO9r2UZ";
                    //模擬http中的get請求
                    $str = file_get_contents($url);
                    //轉化json格式數據爲數組或對象
                    $json = json_decode($str);
                    //回覆內容
                    $contentStr = "您發送的是地理位置信息,您的位置:{$json->description}";
                    //格式化字符串
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    //返回XML數據到微信客戶端
                    echo $resultStr;
                }數組

        }else {
            echo "";
            exit;
        }
    }
    
    //定義checkSignature
    private function checkSignature()
    {
        // you must define TOKEN by yourself
        //判斷TOKEN密鑰是否認義
        if (!defined("TOKEN")) {
            //若是沒有定義拋出異常
            throw new Exception('TOKEN is not defined!');
        }
        //接收微信加密簽名
        $signature = $_GET["signature"];
        //接收時間戳
        $timestamp = $_GET["timestamp"];
        //接收隨機數
        $nonce = $_GET["nonce"];
        //把TOKEN常量賦值給$token變量
        $token = TOKEN;
        //把相關參數組裝爲數組(密鑰、時間戳、隨機數)
        $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        //經過字典法進行排序
        sort($tmpArr, SORT_STRING);
        //把排序後的數組轉化字符串
        $tmpStr = implode( $tmpArr );
        //經過哈希算法對字符串進行加密操做
        $tmpStr = sha1( $tmpStr );
        
        //與加密簽名進行對比
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}微信

?>微信開發

相關文章
相關標籤/搜索