Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 2 微信開發者中心

2 微信開發者中心

編輯:關於Android編程

微信公眾號開發者中心提供了使用代碼開發微信微應用的功能,使用代碼開發微應用需要用到服務器,以存放編寫的代碼,因此我們需要一個服務器。那麼在微信那裡設置服務器呢?在微信公眾號管理界面,點擊【基本配置】


開發


將會看到基本配置信息,在【服務器配置】選項<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxociAvPg0KPHA+PGltZyBhbHQ9"基本配置" src="/uploadfile/Collfiles/20160603/20160603094343260.jpg" title="\" />


啟用並設置服務器後,用戶發送給公眾號的信息將被轉發給此服務器,這樣我們就可以通過代碼靈活的實現各種微應用。

1 新浪SAE

首先,我們要去新浪雲計算 申請一個空間,為什麼使用SAE?因為可以免費申請啊。


新浪雲


點擊【開發者由此進入】鏈接


微博登錄


使用微博賬號登陸SAE雲計算


新浪雲控制台


進入新浪雲控制台後,創建新應用(即服務器),填寫二級域名、應用名稱、運行環境。


創建應用


點擊【創建】,進入代碼管理界面,選擇SVN版本管理工具,為什麼選擇SVN?雲空間收費,不考慮,GIT適合高級用戶,SVN適合一般用戶。


代碼管理


選擇好SVN後,創建版本。版本的好處就是,當你完成一個具有基本功能的代碼後(此版本號為M),交給老板。老板突發靈感說再添加一個功能,你鄙視他後還是老老實以M版本的基礎創建一個N版本,然後就是無窮無盡的錯誤,代碼被弄得亂七八糟。此時你該感激版本這個東西,讓你有機會穿越回M版本。
總而言之,以每個階段做作為一個版本,等回頭看或者出問題的時候,可以查看或者從某個版本重新開始。


創建版本


創建完版本後,將會看到應用的鏈接信息


版本信息


點擊【編輯代碼】,進入SAE編輯器,默認情況下有【config.yaml】配置信息文件和【index.php】文件,

Hello, SAE!';

SAE編輯器


在浏覽器中我們可以輸入: http://wlvsoft.applinzi.com/ 或 http://1.wlvsoft.applinzi.com/ 訪問應用服務器,浏覽器將會顯示echo輸出的語句。


訪問應用


2 服務器配置

申請成功服務器後,就可以在微信公眾號管理界面進行服務器配置,點擊【修改配置】鏈接。


修改配置


填寫基本配置信息:

URL:應用服務器鏈接 Token:任意字符,記住此值,應用服務器需要Token進行驗證 EncodingAESkey:隨機生成即可 消息加解密方式:測試階段選擇【明文模式】

基本配置


此時點擊提交,將會提示token驗證失敗。


token驗證


開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:


發送應用服務器參數


開發者通過檢驗signature,對請求進行校驗。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則服務器配置生效,否則提示token驗證失敗。
下面是微信公眾平台開發者文檔提供的驗證代碼:

private function checkSignature()
{
    //獲取微信服務器提交到應用服務器的參數
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"]; 
    //獲取token,與服務器配置中的一致
    $token = TOKEN;
    //將參數組裝成數組
    $tmpArr = array($token, $timestamp, $nonce);
    //對參數進行排序
    sort($tmpArr, SORT_STRING);
    //將數組轉換為字符串
    $tmpStr = implode( $tmpArr );
    //加密
    $tmpStr = sha1( $tmpStr );
    //加密後與$signature進行對比
    //如果相同,表示請求來自微信服務器
    if( $tmpStr == $signature ){
        return true;
    }else{
        return false;
    }
}

下面是修改後的index.php代碼:

valid();
}else{
    //如果是用戶發送信息,返回空
    echo '';
    exit;
}

class wechatCallbackapiTest
{
    //有效驗證
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        //調用驗證方法
        if($this->checkSignature()){
            header('content-type:text');
            //如果驗證成功,返回echoStr
            echo $echoStr;
            exit;
        }
    }

    //驗證方法,如果來自微信服務器返回true
    private function checkSignature()
    {
        //獲取微信服務器提交到應用服務器的參數
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"]; 
        //獲取token,與服務器配置中的一致
        $token = TOKEN;
        //將參數組裝成數組
        $tmpArr = array($token, $timestamp, $nonce);
        //對參數進行排序
        sort($tmpArr, SORT_STRING);
        //將數組轉換為字符串
        $tmpStr = implode( $tmpArr );
        //加密
        $tmpStr = sha1( $tmpStr );
        //加密後與$signature進行對比
        //如果相同,表示請求來自微信服務器
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

此時,再次提交,服務器配置成功。


服務器配置成功


點擊【啟動】,手工配置的自動回復和自定義菜單將失效,全部將由應用服務器代碼進行管理。


提示


打開手機微信查看公眾號,發現菜單和自動回復功能已經不能使用了。


微信手機端


提示(注意:不建議如此,不知道後續有沒有錯誤,在這裡列出僅供娛樂測試)
按照微信驗證原理,其實可以直接返回驗證參數【echostr】,跳過token驗證。將index.php改為:


3 應用服務器向用戶發送消息

當我們在公眾號中輸入信息時,提示“該公眾號暫時無法提供服務器,請稍後再試”。原因是我們在index.php中沒有對用戶的消息進行響應。

//獲取echostr,存在表示提交驗證,否則為用戶發送的一般消息
if (isset($_GET['echostr'])) {
    //如果提交為驗證,進行有效驗證
    $wechatObj->valid();
}else{
    //如果是用戶發送信息,返回空
    echo '';
    exit;
}

如果是用戶在公眾號輸入的信息,我們直接返回為空。但是,微信公眾號要求發送的信息是有標准格式的。簡單的文本消息如下:




12345678


參數作用如下:


文本消息參數


因此,用戶要接收到應用服務器返回的信息,應用服務器必須按照微信公眾號文本消息格式要求返回。
我們可以使用方倍工作室提供的微信調試器 對我們發送的信息進行測試。


測試文本信息


接收用戶指公眾號原始ID 可在公眾號設置中查詢。
當輸入:你好 ;發送給應用服務器的信息如下:


    
    
    1464855763
    
    
    1234567890abcdef

應用服務器可以獲取提交的文本信息,進而獲得公眾號ID【ToUserName】、用戶ID【FromUserName】和發送的文本信息【Content】。依據這些信息,應用服務器可以自動回復信息給用戶。修改index.php:

valid();
}else{
    //如果是用戶發送信息,調用responseMsg方法
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    //有效驗證
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        //調用驗證方法
        if($this->checkSignature()){
            header('content-type:text');
            //如果驗證成功,返回echoStr
            echo $echoStr;
            exit;
        }
    }

    //驗證方法,如果來自微信服務器返回true
    private function checkSignature()
    {
        //獲取微信服務器提交到應用服務器的參數
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"]; 
        //獲取token,與服務器配置中的一致
        $token = TOKEN;
        //將參數組裝成數組
        $tmpArr = array($token, $timestamp, $nonce);
        //對參數進行排序
        sort($tmpArr, SORT_STRING);
        //將數組轉換為字符串
        $tmpStr = implode( $tmpArr );
        //加密
        $tmpStr = sha1( $tmpStr );
        //加密後與$signature進行對比
        //如果相同,表示請求來自微信服務器
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
    //返回文本消息
    public function responseMsg()
    {
        //獲取用戶提交的XML格式數據
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //如果用戶提交的信息不為空
        if (!empty($postStr)){
            //將用戶提交的XML轉換為對象
            $postObj = simplexml_load_string($postStr,
             'SimpleXMLElement', LIBXML_NOCDATA);
            //獲取用戶提交的類型(文本、圖文、音頻、視頻等)
            $RX_TYPE = trim($postObj->MsgType);
            //不同的類型返回的結果不同
            switch ($RX_TYPE)
            {
                //用戶發送類型為文本
                case "text":
                    //公眾號ID
                    $fromUsername = $postObj->FromUserName;
                    //用戶ID
                    $toUsername = $postObj->ToUserName;
                    //用戶發送內容
                    $keyword = trim($postObj->Content);
                    //獲得系統當前時間
                    $time = time();
                    //按照微信格式要求編寫返回格式
                    $textTpl = "
                    
                    
                    %s
                    
                    
                    0
                    ";
                    //應用服務器返回給用戶的類型為文本
                    $msgType = "text";
                    //返回的北榮
                    $contentStr = date("Y-m-d H:i:s",
                    time())."\n".'歡迎關注河源萬綠軟件工作室!';
                    // sprintf() 函數把格式化的字符串寫入一個變量中
                    // $toUsername位置和用戶發送的互換
                    $resultStr = sprintf($textTpl, $fromUsername,
                    $toUsername, $time, $msgType, $contentStr);
                    break;
                //非文本信息,默認不處理
                default:
                    $resultStr = "";
                    break;
             }
            //應用服務器返回信息給用戶
            echo $resultStr;
        }else{
            echo "";
            exit;
        }
    }
}

完成後,測試如下:


測試


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved