Subversion Repositories qbpwcf-lib(archive)

Rev

Rev 915 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

/*

        QBPWCF, Quick Build PHP website Component base on Fedora Linux.
    Copyright (C) 2015~2025 Min-Jhin,Chen

    This file is part of QBPWCF.

    QBPWCF is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    QBPWCF is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.

*/
namespace qbpwcf;

/*
類別說明:
存取Amazon服務的類別
備註:
建議改用 odrive 來跟雲端硬碟互動,參考資料https://docs.odrive.com/v1.0/docs.
*/
class amazon{

        /*
        #函式說明:
        #當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$reuslt["error"],執行不正常結束的錯訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #必填參數:
        #$method,物件,為物件實體或類別名稱,會自動置入該參數.
        #$arguments,陣列,為呼叫方法時所用的參數.
        #可省略參數:
        #無.
        #參考資料:
        #__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
        #備註:
        #無.
        */
        public function __call($method,$arguments){

                #取得當前執行的函式
                $result["function"]=__FUNCTION__;

                #設置執行不正常
                $result["status"]="false";

                #設置執行錯誤
                $result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";

                #設置所丟入的參數
                $result["error"][]=$arguments;

                #回傳結果
                return $result;

                }#function __call end

        /*
        #函式說明:
        #當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$reuslt["error"],執行不正常結束的錯訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #必填參數:
        #$method,物件,為物件實體或類別名稱,會自動置入該參數.
        #$arguments,陣列,為呼叫方法時所用的參數.
        #可省略參數:
        #無.
        #參考資料:
        #__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
        #備註:
        #無.
        */
        public static function __callStatic($method,$arguments){

                #取得當前執行的函式
                $result["function"]=__FUNCTION__;

                #設置執行不正常
                $result["status"]="false";

                #設置執行錯誤
                $result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";

                #設置所丟入的參數
                $result["error"][]=$arguments;

                #回傳結果
                return $result;

                }#function __callStatic end

        /*
        #函式說明:
        #用 amazon 的登入機制來認證,登入成功後轉址到特定頁面.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息
        #$result["content"],語法
        #$result["function"],當前執行的函數名稱
        #必填參數:
        #$conf["clientId"],字串,login app 用戶端的 id.
        $conf["clientId"]="";
        #可省略參數:
        #$conf["redirect_uri"],字串,認證完要轉址到哪哩,預設為$_SERVER["REQUEST_URI"].
        #$conf["redirect_uri"]="";
        #可省略參數:
        #無
        #參考資料:
        #http://login.amazon.com/website
        #http://login.amazon.com/documentation
        #https://images-na.ssl-images-amazon.com/images/G/01/lwa/dev/docs/website-developer-guide._TTH_.pdf
        #https://sellercentral.amazon.com/gp/homepage.html
        #備註:
        #好像壞了,請檢查.
        */
        public static function loginWithAmazonAccount(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #初始化要回傳的語法
                $result["content"]="";

                #如果沒有參數
                if(func_num_args()==0){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]="函數".$result["function"]."需要參數";

                        #回傳結果
                        return $result;

                        }#if end

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!=="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf===null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("clientId");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                #$conf["skipableVariableCanNotBeEmpty"]=array();
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["skipableVariableName"]=array("redirect_uri");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                $conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($_SERVER["REQUEST_URI"]);
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果參數檢查失敗
                if($checkArguments["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #如果參數檢查不通過
                if($checkArguments["passed"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #設置登入按鈕
                $result["content"]=$result["content"]."
                        <!-- login button -->
                        <div id=\"LoginWithAmazon\">
                                <img
                                border=\"0\"
                                alt=\"Login with Amazon\"
                                src=\"https://images-na.ssl-images-amazon.com/images/G/01/lwa/btnLWA_gold_156x32.png\"
                                width=\"156\" height=\"32\"
                                /img>
                        </div>
                        ";

                #設置登出按鈕
                $result["content"]=$result["content"]."
                        <!-- logout div -->
                        <div id=\"Logout\">Logout</div>
                        ";

                #設置取得資訊的區塊
                $result["content"]=$result["content"]."<div id=\"amazon-root\"></div>";

                #設置嵌入 amazon login js jdk 與登入、登出事件的js語法
                $result["content"]=$result["content"]."
                        <script>
                        //當 amazon login sdk 載入完畢後在設置 app client id
                        window.onAmazonLoginReady = function()
                        {
                                amazon.Login.setClientId('".$conf["clientId"]."');
                        };

                        //優先載入amazon login sdk
                        (function(d)
                        {
                                var a = d.createElement('script'); a.type = 'text/javascript';
                                a.async = true; a.id = 'amazon-login-sdk';
                                a.src = 'https://api-cdn.amazon.com/sdk/login1.js';
                                d.getElementById('amazon-root').appendChild(a);
                         })(document);

                        //登入與取得個資
                        document.getElementById('LoginWithAmazon').onclick = function()
                        {
                                options = { scope : 'profile' };
                                amazon.Login.authorize(options, '".$conf["redirect_uri"]."');
                                return false;
                        };

                        //登出事件
                        document.getElementById('Logout').onclick = function()
                        {
                                amazon.Login.logout();
                        };
                        </script>
                        ";

                #設置執行正常
                $result["status"]="true";

                #回傳結果
                return $result;

                }#function loginWithAmazonAccount end



        /*
        #函式說明:
        #解析從 amazon 認證過後的 token 與相關資訊,並將結果儲存到$_SESSION["amazon::parseToken"]
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["founded"],是否有找到必備的token.
        #$result["error"],錯誤訊息
        #$result["content"],解析後的結果
        #$result["function"],當前執行的函數名稱
        #必填參數:
        #無.
        #可省略參數:
        #無.
        #參考資料:
        #無.
        #備註:
        #請勿跟authenticateToAC()用在同一個頁面.
        */
        public static function parseToken(){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #接收變數
                #涵式說明:
                #可以處理多個透過GET、POST而來的資訊,儲存成變數,同時限定傳送的方法、來源,來增加安全性,檢查有沒有皆收到必須要接收到的變數,沒有接收到的變數可以指定從session變數中取得.
                #回傳的結果:
                #$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$resutl["function"],當前執行的涵式名稱.
                #$result["warning"],警告訊息陣列.
                #$result["passed"],是否有皆收到全部該接收到的變數,若有設定$conf["checkedVarName"]的話,執行正常後會回傳該結果。
                #$result["lostVarName"],沒有皆收到的變數名稱陣列
                #$result["inputDataContent"],所接收的參數陣列.
                #$result["inputDataContent"]["變數名稱"],所接收變數的內容.
                #$result["inputDataCount"],從表單總共接收到幾個元素.
                #$result["HTTP_REFERER"],前一頁的網址,null代表不存在.
                #必填的參數:
                #$conf["method"],字串,傳送過來的資料是用"post/POST"還是"get/GET"?
                $conf["form::responseMultiInputDataSecurityEnhance"]["method"]="GET";
                #可省略的參數:
                #$conf["allowGet"],字串,是否要允許 get 傳值,"true",代表允許;"false" ,代表不允許,預設爲不允許.
                $conf["form::responseMultiInputDataSecurityEnhance"]["allowGet"]="true";
                #$conf["limitPrePage"],字串陣列,是否要限定前一頁的網址為哪些,才能接收內容,不符合則轉址.
                #$conf["limitPrePage"]=array("");
                #$conf["transferLocation"],字串,遇到get傳值,或前一個頁面不符合要求時要轉址到的頁面,預設爲資安素養網"https://isafe.moe.edu.tw/"
                #$conf["transferLocation"]="";
                #$conf["ignore"]=字串陣列,如果要接收的變數名稱與該陣列其一元素一樣,則不放進要回傳的變數裏面.
                #$conf["ignore"]=array();
                #$conf["correctCharacter"]=,字串,如果爲"false",則不處理可能導致網頁出問題的字串,預設爲要進行處理.
                #$conf["correctCharacter"]="false";
                #$conf["checkedVarName"],字串陣列,為檢查是否有接收到哪些變數.
                $conf["form::responseMultiInputDataSecurityEnhance"]["checkedVarName"]=array("access_token");
                #$conf["canBeEmptyString"],字串,用$conf["checkedVarName"]指定接收的變數名稱陣列,若接收到的內容為空字串是否算有接收到內容,預設為"false","true"代表接收到的內容可以為空字串,"false"代表接收到的內容不可以為空字串.
                #$conf["canBeEmptyString"]="false";
                #$conf["sessionNameArray"],陣列,若存在則代表若沒有從表單取得變數,則從session變數中取得內容,每個元素代表每個表單變數對應的session名稱,若不是要改用session方式取得變數內容的變數,請輸入null,數量請跟$conf["checkedVarName"]參數一致.
                #$conf["sessionNameArray"]=array();
                #$conf["unsetSessionArray"],陣列,與$conf["sessionNameArray"]對應的元素,是否要接收到變數後就卸除,"true"代表要卸除,"false"代表不要卸除.
                #$conf["unsetSessionArray"]=array();
                #參考資料來源:
                #foreach 的用法 -> http://php.net/manual/en/control-structures.foreach.php
                #伺服器端的變數 -> http://php.net/manual/en/reserved.variables.server.php
                #備註:
                #表單變數的名稱若含有「.」,則會變成「-」。
                $responseMultiInputDataSecurityEnhance=form::responseMultiInputDataSecurityEnhance($conf["form::responseMultiInputDataSecurityEnhance"]);
                unset($conf["form::responseMultiInputDataSecurityEnhance"]);

                #如果接收變數失敗
                if($responseMultiInputDataSecurityEnhance["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$responseMultiInputDataSecurityEnhance;

                        #回傳結果
                        return $result;

                        }#if end

                #如果沒有接收到一定要的變數
                if($responseMultiInputDataSecurityEnhance["passed"]==="false"){

                        #嘗試取得 session 變數 amazon::parseToken
                        #函式說明:
                        #取得session變數裡面的數值,然後卸除該session變數
                        #回傳的結果:
                        #$result["status"],執行是否正常,"true"代表正常,"false"代表有誤.
                        #$result["error"],錯誤訊息.
                        #$result["founded"],是否找到session變數,"true"代表找到,"false"代表沒找到.
                        #$result["content"],取得的變數內容.
                        #$result["function"],當前執行的函數名稱.
                        #必填的參數:
                        #$conf["sessionVarName"],字串,要取得內容的session變數名稱
                        $conf["session::getSessionValue"]["sessionVarName"]="amazon::parseToken";
                        #可省略的參數:
                        #$conf["unsetSessionVar"],字串,代表要卸除session變數,預設為"false"不卸除,"true"代表要卸除.
                        $conf["session::getSessionValue"]["unsetSessionVar"]="true";
                        #參考資料:
                        #call-time-pass-by-reference-easy-fix-available=>http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
                        #可變變數=>http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
                        #卸除參考的原始變數=>http://stackoverflow.com/questions/6654538/php-function-to-unset-variables-passed-by-reference
                        $getSessionValue=session::getSessionValue($conf["session::getSessionValue"]);
                        unset($conf["session::getSessionValue"]);

                        #如果嘗試取得session變數失敗
                        if($getSessionValue["status"]==="false"){

                                #設置執行不正常
                                $result["status"]="false";

                                #設置執行錯誤
                                $result["error"]=$getSessionValue;

                                #回傳結果
                                return $result;

                                }#if end

                        #如果取得到session變數
                        if($getSessionValue["founded"]==="true"){

                                #取得 session 變數值
                                $result["content"]=$getSessionValue["content"];

                                #設置執行正常
                                $result["status"]="true";

                                #設置有取得到token
                                $result["founded"]="true";

                                #回傳結果
                                return $result;

                                }#if end

                        #反之
                        else{

                                #設置執行正常
                                $result["status"]="true";

                                #設置沒有取得到token
                                $result["founded"]="false";

                                #回傳結果
                                return $result;

                                }#else end

                        }#if end

                #將網址的GET變數去掉
                #函式說明:
                #將字串特定關鍵字與其後面的內容剔除
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["warning"],警告訊息鎮列.
                #$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
                #$result["function"],當前執行的函數名稱.
                #$result["oriStr"],要處理的原始字串內容.
                #$result["content"],處理好的的字串內容.
                #必填的參數:
                $conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$_SERVER["REQUEST_URI"];#要處理的字串.
                $conf["stringProcess::delStrAfterKeyWord"]["keyWord"]="?";#特定字串.
                $delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
                unset($conf["stringProcess::delStrAfterKeyWord"]);

                #如果濾掉get變數失敗
                if($delStrAfterKeyWord["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$delStrAfterKeyWord;

                        #回傳結果
                        return $result;

                        }#if end

                #如果濾掉get變數失敗
                if($delStrAfterKeyWord["founded"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$delStrAfterKeyWord;

                        #回傳結果
                        return $result;

                        }#if end

                #建立session變數,然後轉址到不含get變數的當前頁面.
                #函式說明:
                #設定session變數後,立即轉址.
                #回傳的結果:
                #$result["status"],執行是否成功,"true"代表成功,"false"代表不成功.
                #$result["function"],當前執行的函數名稱.
                #$result["error"],錯誤訊息陣列.
                #必填的參數:
                #$conf["headerLocation"],為要轉址到的地方,若爲 $_SERVER["PHP_SELF"],則爲回到目前頁面,全民資安素養網爲 https://isafe.moe.edu.tw/.
                $conf["header::redirectionNow"]["headerLocation"]=$delStrAfterKeyWord["content"];
                #可省略的參數:
                #$conf["sessionName"],字串陣列,可以指派session變數的名稱.
                $conf["header::redirectionNow"]["sessionName"]=array("amazon::parseToken");
                #$conf["sessionValue"]字串陣列,可以指派session變數的內容.
                $conf["header::redirectionNow"]["sessionValue"]=array($responseMultiInputDataSecurityEnhance["inputDataContent"]);
                #參靠資料來源:
                #http://php.net/manual/en/reserved.variables.server.php
                $redirectionNow=header::redirectionNow($conf["header::redirectionNow"]);
                unset($conf["header::redirectionNow"]);

                #如果轉址失敗
                if($redirectionNow["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$redirectionNow;

                        #回傳結果
                        return $result;

                        }#if end

                #執行到這代表不正常
                $result["status"]="false";

                #設置錯誤訊息
                $result["error"][]="非預期的結果";

                #回傳結果
                return $result;

                }#function parseToken end

        /*
        #函式說明:
        #從表單接收解析從 amazon REST API 認證過後的 token 與相關資訊,並將結果儲存到$_SESSION變數裡面.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息
        #$result["content"],解析後的結果
        #$result["function"],當前執行的函數名稱.
        #$result["founded"],是否有找到必備的token.
        #$result["isJson"],如果是輸出json,則為"true",反之為"false".
        #$result["isJs"],如果回傳的是js語法則為"true",反之為"false".
        #必填參數:
        #無.
        #可省略參數:
        #$conf["inputVar"],字串,接收的post變數名稱,預設為"unParsedRestStr";
        #$conf["inputVar"]="unParsedRestStr";
        #$conf["restTokenSessionName"],字串陣列,儲存token資訊的session變數名稱,預設為array("amazon::parseRestToken").
        #$conf["restTokenSessionName"]=array("amazon::parseRestToken");
        #$conf["re_url"],字串,成功取得token資訊後要轉位到哪邊,預設為$_SERVER["PHP_SELF"].
        #$conf["re_url"]=$_SERVER["PHP_SELF"];
        #參考資料:
        #無.
        #備註:
        #無.
        */
        public static function parseRestToken(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf==null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。
                #必填參數:
                #$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?
                $conf["variableCheck::checkSkipableVarType"]["checkedVar"]=$conf;
                #$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.
                $conf["variableCheck::checkSkipableVarType"]["sikpableVarNameArray"]=array("inputVar","restTokenSessionName","re_url");
                #$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).
                $argu=&$conf;
                #可省略參數:
                #$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何,null代表不指定變數形態.
                $conf["variableCheck::checkSkipableVarType"]["skipableVarTypeArray"]=array("string","string","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的變數要初始化為什麼,null代表不指定.
                $conf["variableCheck::checkSkipableVarType"]["skipableVarDefaultValue"]=array("unParsedRestStr","amazon::parseRestToken",$_SERVER["PHP_SELF"]);
                $checkSkipableVarType=variableCheck::checkSkipableVarType($conf["variableCheck::checkSkipableVarType"],$argu);
                unset($conf["variableCheck::checkSkipableVarType"]);

                #如果檢查可省略參數失敗
                if($checkSkipableVarType["status"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]=$checkSkipableVarType;

                        #回傳結果
                        return $result;

                        }#if end

                #取得變動後的參數
                $conf=$argu;

                #判斷是否為ajax要求
                #函式說明:
                #判斷當前php檔的執行是否為ajax的要求.
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["function"],當前執行的函數.
                #$result["content"],是否為ajax要求,"true"代表是,"false"代表不是.
                #可省略參數:
                #$conf["useGetVarToRecogniseAjaxRequest"],字串,用來識別是否為ajax要求的get變數名稱,若其值為"true"則代表為ajax要求,反之為"false",判斷好後會將該變數移除.
                #$conf["useGetVarToRecogniseAjaxRequest"]="is_ajax";
                #$conf["usePostVarToRecogniseAjaxRequest"],字串,用來識別是否為ajax要求的post變數名稱,若其值為"true"則代表為ajax要求,反之為"false",判斷好後會將該變數移除.
                #$conf["usePostVarToRecogniseAjaxRequest"]="is_ajax";
                #備註:
                #如果client端沒有傳送ajax要求的識別header,則無法識別是ajax要求.
                $is_ajax=form::is_ajax();

                #如果不是ajax
                if($is_ajax["content"]==="false"){

                        #建立傳送當前網址的ajax要求.
                        #涵式說明:
                        #建立透過javaScript傳送post數值到特定頁面,並且取得頁面的回應,將之結果放置在特定的區塊裏面的js函式.
                        #回傳結果:
                        #$result["status"],執行正確與否,"true"代表執行正確,"false"代表執行失敗.
                        #$result["error"],錯誤訊息陣列.
                        #$result["content"],JavaScript的語法
                        #$result["function"],當前執行的函數名稱
                        #必填參數:
                        #$conf["receivePage"],字串,要接收數值的頁面.
                        $conf["javaScript::ajaxSendPostValue"]["receivePage"]=$_SERVER["PHP_SELF"];
                        $conf["javaScript::ajaxSendPostValue"]["jsFunctionName"]="parseRestToken";
                        #可省略參數:
                        #$conf["scriptTag"],是否要用<script></script>包住,預設為"false",不包住;"true"為包住.
                        $conf["javaScript::ajaxSendPostValue"]["scriptTag"]="true";
                        #$conf["varNameArray"],字串陣列,要傳送的數值名稱.
                        #$conf["javaScript::ajaxSendPostValue"]["varNameArray"]=array($conf["inputVar"]);
                        #$conf["varValueArray"],陣列,要傳送的數值內容.
                        #$conf["javaScript::ajaxSendPostValue"]["varValueArray"]=array("window.location.href");
                        #$conf["jsFunctionName"],字串,ajax裏面的js涵式名稱.
                        #$conf["jsVarNameArray"],字串陣列,要傳送的js數值名稱.
                        $conf["javaScript::ajaxSendPostValue"]["jsVarNameArray"]=array($conf["inputVar"]);
                        #$conf["jsVarValueArray"],陣列,要傳送的js數值內容.
                        $conf["javaScript::ajaxSendPostValue"]["jsVarValueArray"]=array("'&'+window.location.href.split('#')[1]");
                        #$conf["javaScript::ajaxSendPostValue"]["jsVarValueArray"]=array("encodeURIComponent(window.location.href.split('#')[1])");
                        #$conf["javaScript::ajaxSendPostValue"]["jsVarValueArray"]=array("encodeURI('&'+window.location.href.split('#')[1])");
                        #$conf["responsePalaceId"],字串,回傳的內容要呈現於哪個<span id = ? ></span>、<div id= ? ></div>區塊之間。
                        #$conf["javaScript::ajaxSendPostValue"]["responsePalaceId"]="";
                        #$conf["condition"],字串,立即執行ajax的條件.
                        $conf["javaScript::ajaxSendPostValue"]["condition"]=
                        "
                        window.location.href.search('&')!==-1 &&
                        window.location.href.search('#')!==-1 &&
                        window.location.href.search('access_token')!== -1 &&
                        window.location.href.search('token_type')!== -1 &&
                        window.location.href.search('expires_in')!== -1 &&
                        window.location.href.search('scope')!== -1
                        ";
                        #$conf["conditionComment"],字串,立即執行ajax的條件註解,預設為$conf["condition"].
                        $conf["javaScript::ajaxSendPostValue"]["conditionComment"]="if is amazon token response";
                        #$conf["sendNow"],字串,是否要在document.
                        #$conf["sendNow"],字串,是否要在document.ready後馬上執行ajax,預設為"false",代表不要,"true"代表要.
                        $conf["javaScript::ajaxSendPostValue"]["sendNow"]="true";
                        #$conf["successAction"],字串,ajax要求成功後做的事情.
                        $conf["javaScript::ajaxSendPostValue"]["successAction"]="

                                //如果存在回應內容
                                if(xmlhttp.responseText!==undefined){

                                        //取得json
                                        if(data=JSON.parse(xmlhttp.responseText)){

                                                //debug
                                                //alert(data.toSource());

                                                //如果存在 data.status
                                                if(data.status!==undefined){

                                                        //如果 data.status 為 'true'
                                                        if(data.status==='true'){

                                                                //轉址
                                                                window.location.href='".$conf["re_url"]."';

                                                                }//if end

                                                        }//if end

                                                }//if end

                                        }//if end
                                ";

                        #如果有設置 conf["re_url"]
                        if(isset($conf["re_url"])){

                                #$conf["redir_url"],字串,是否要在要求成功後進行轉址的動作,轉址到$conf["redir_url"].
                                $conf["javaScript::ajaxSendPostValue"]["redir_url"]=$conf["re_url"];

                                }#if end

                        #參考資料來源:
                        #http://www.w3school.com.cn/php/php_ajax_suggest.asp
                        $ajaxSendPostValue=javaScript::ajaxSendPostValue($conf["javaScript::ajaxSendPostValue"]);
                        unset($conf["javaScript::ajaxSendPostValue"]);

                        #如果建立 ajax 要求失敗
                        if($ajaxSendPostValue["status"]==="false"){

                                #設置執行失敗
                                $result["status"]="false";

                                #設置執行錯誤訊息
                                $result["error"]=$ajaxSendPostValue;

                                #回傳結果
                                return $result;

                                }#if end

                        #取得js語法
                        $result["content"]=$ajaxSendPostValue["content"];

                        #設置執行正常
                        $result["status"]="true";

                        #不是json
                        $result["isJson"]="false";

                        #是js語法
                        $result["isJs"]="true";

                        #回傳結果
                        return $result;

                        }#if end

                #反之是ajax
                else{

                        #接收變數
                        #涵式說明:
                        #可以處理多個透過GET、POST而來的資訊,儲存成變數,同時限定傳送的方法、來源,來增加安全性,檢查有沒有皆收到必須要接收到的變數,沒有接收到的變數可以指定從session變數中取得.
                        #回傳的結果:
                        #$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
                        #$result["error"],錯誤訊息陣列.
                        #$resutl["function"],當前執行的涵式名稱.
                        #$result["warning"],警告訊息陣列.
                        #$result["passed"],是否有皆收到全部該接收到的變數,若有設定$conf["checkedVarName"]的話,執行正常後會回傳該結果。
                        #$result["lostVarName"],沒有皆收到的變數名稱陣列
                        #$result["inputDataContent"],所接收的參數陣列.
                        #$result["inputDataContent"]["變數名稱"],所接收變數的內容.
                        #$result["inputDataCount"],從表單總共接收到幾個元素.
                        #$result["HTTP_REFERER"],前一頁的網址,null代表不存在.
                        #必填的參數:
                        #$conf["method"],字串,傳送過來的資料是用"post/POST"還是"get/GET"?
                        $conf["form::responseMultiInputDataSecurityEnhance"]["method"]="POST";
                        #可省略的參數:
                        #$conf["allowGet"],字串,是否要允許 get 傳值,"true",代表允許;"false" ,代表不允許,預設爲不允許.
                        #$conf["form::responseMultiInputDataSecurityEnhance"]["allowGet"]="true";
                        #$conf["limitPrePage"],字串陣列,是否要限定前一頁的網址為哪些,才能接收內容,不符合則轉址.
                        #$conf["limitPrePage"]=array("");
                        #$conf["transferLocation"],字串,遇到get傳值,或前一個頁面不符合要求時要轉址到的頁面,預設爲資安素養網"https://isafe.moe.edu.tw/"
                        #$conf["transferLocation"]="";
                        #$conf["ignore"]=字串陣列,如果要接收的變數名稱與該陣列其一元素一樣,則不放進要回傳的變數裏面.
                        #$conf["ignore"]=array();
                        #$conf["correctCharacter"]=,字串,如果爲"false",則不處理可能導致網頁出問題的字串,預設爲要進行處理.
                        #$conf["correctCharacter"]="false";
                        #$conf["checkedVarName"],字串陣列,為檢查是否有接收到哪些變數.
                        $conf["form::responseMultiInputDataSecurityEnhance"]["checkedVarName"]=array($conf["inputVar"],"access_token","token_type","expires_in","scope");
                        #$conf["canBeEmptyString"],字串,用$conf["checkedVarName"]指定接收的變數名稱陣列,若接收到的內容為空字串是否算有接收到內容,預設為"false","true"代表接收到的內容可以為空字串,"false"代表接收到的內容不可以為空字串.
                        $conf["form::responseMultiInputDataSecurityEnhance"]["canBeEmptyString"]="true";
                        #$conf["sessionNameArray"],陣列,若存在則代表若沒有從表單取得變數,則從session變數中取得內容,每個元素代表每個表單變數對應的session名稱,若不是要改用session方式取得變數內容的變數,請輸入null,數量請跟$conf["checkedVarName"]參數一致.
                        #$conf["sessionNameArray"]=array();
                        #$conf["unsetSessionArray"],陣列,與$conf["sessionNameArray"]對應的元素,是否要接收到變數後就卸除,"true"代表要卸除,"false"代表不要卸除.
                        #$conf["unsetSessionArray"]=array();
                        #參考資料來源:
                        #foreach 的用法 -> http://php.net/manual/en/control-structures.foreach.php
                        #伺服器端的變數 -> http://php.net/manual/en/reserved.variables.server.php
                        #備註:
                        #表單變數的名稱若含有「.」,則會變成「-」。
                        $responseMultiInputDataSecurityEnhance=form::responseMultiInputDataSecurityEnhance($conf["form::responseMultiInputDataSecurityEnhance"]);
                        unset($conf["form::responseMultiInputDataSecurityEnhance"]);

                        #如果接收變數失敗
                        if($responseMultiInputDataSecurityEnhance["status"]==="false"){

                                #設置執行不正常
                                $result["status"]="false";

                                #設置執行錯誤
                                $result["error"]=$responseMultiInputDataSecurityEnhance;

                                #回傳結果
                                return $result;

                                }#if end

                        #如果沒有接收到一定要的變數
                        if($responseMultiInputDataSecurityEnhance["passed"]==="false"){

                                #嘗試取得 session 變數 amazon::parseToken
                                #函式說明:
                                #取得session變數裡面的數值,然後卸除該session變數
                                #回傳的結果:
                                #$result["status"],執行是否正常,"true"代表正常,"false"代表有誤.
                                #$result["error"],錯誤訊息.
                                #$result["founded"],是否找到session變數,"true"代表找到,"false"代表沒找到.
                                #$result["content"],取得的變數內容.
                                #$result["function"],當前執行的函數名稱.
                                #必填的參數:
                                #$conf["sessionVarName"],字串,要取得內容的session變數名稱
                                $conf["session::getSessionValue"]["sessionVarName"]=$conf["restTokenSessionName"];
                                #可省略的參數:
                                #$conf["unsetSessionVar"],字串,代表要卸除session變數,預設為"false"不卸除,"true"代表要卸除.
                                #$conf["session::getSessionValue"]["unsetSessionVar"]="true";
                                #參考資料:
                                #call-time-pass-by-reference-easy-fix-available=>http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
                                #可變變數=>http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
                                #卸除參考的原始變數=>http://stackoverflow.com/questions/6654538/php-function-to-unset-variables-passed-by-reference
                                $getSessionValue=session::getSessionValue($conf["session::getSessionValue"]);
                                unset($conf["session::getSessionValue"]);

                                #如果嘗試取得session變數失敗
                                if($getSessionValue["status"]==="false"){

                                        #設置執行不正常
                                        $result["status"]="false";

                                        #設置執行錯誤
                                        $result["error"]=$getSessionValue;

                                        #回傳結果
                                        return $result;

                                        }#if end

                                #如果取得到session變數
                                if($getSessionValue["founded"]==="true"){

                                        #取得 session 變數值
                                        $result["content"]=$getSessionValue["content"];

                                        #設置執行正常
                                        $result["status"]="true";

                                        #設置有取得到token
                                        $result["founded"]="true";

                                        #不是json
                                        $result["isJson"]="false";

                                        #不是js語法
                                        $result["isJs"]="false";

                                        #回傳結果
                                        return $result;

                                        }#if end

                                #反之
                                else{

                                        #設置執行正常
                                        $result["status"]="true";

                                        #設置沒有取得到token
                                        $result["founded"]="false";

                                        #印出 json
                                        echo json_encode($result);

                                        #設置是json
                                        $result["isJson"]="true";

                                        #不是js語法
                                        $result["isJs"]="false";

                                        #結束程式
                                        return true;

                                        }#else end

                                }#if end

                        #反之接收到一定要的變數
                        else{

                                #取得接收到的變數
                                $recVar=$responseMultiInputDataSecurityEnhance["inputDataContent"];

                                #卸除多餘的變數
                                unset($recVar["is_ajax"]);
                                unset($recVar[$conf["inputVar"]]);

                                #儲存解析好的token資訊
                                $_SESSION[$conf["restTokenSessionName"]]=$recVar;

                                #設置取得的token資訊
                                $result["content"]=$_SESSION[$conf["restTokenSessionName"]];

                                #設置token資訊儲存在哪個session變數裡面
                                $result["sessionName"]=$conf["restTokenSessionName"];

                                #設置執行正常
                                $result["status"]="true";

                                #印出 json
                                echo json_encode($result);

                                #設置是json
                                $result["isJson"]="true";

                                #不是ajax語法
                                $result["isJs"]="false";

                                #結束程式
                                return true;

                                }#else

                        }#else end

                }#function parseRestToken end

        /*
        #函式說明:
        #從表單接收解析從 amazon REST API 認證過後的 code 與相關資訊,並將結果儲存到$_SESSION變數裡面.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息
        #$result["content"],解析後的結果
        #$result["function"],當前執行的函數名稱.
        #$result["founded"],是否有找到必備的code.
        #必填參數:
        #無.
        #可省略參數:
        #$conf["restCodeSessionName"],字串陣列,儲存token資訊的session變數名稱,預設為array("amazon::parseRestCode").
        #$conf["restCodeSessionName"]=array("amazon::parseRestCode");
        #$conf["re_url"],字串,成功取得token資訊後要轉位到哪邊,預設為$_SERVER["PHP_SELF"].
        #$conf["re_url"]=$_SERVER["PHP_SELF"];
        #參考資料:
        #無.
        #備註:
        #無.
        */
        public static function parseRestCode(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf==null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。
                #必填參數:
                #$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?
                $conf["variableCheck::checkSkipableVarType"]["checkedVar"]=$conf;
                #$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.
                $conf["variableCheck::checkSkipableVarType"]["sikpableVarNameArray"]=array("restCodeSessionName","re_url");
                #$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).
                $argu=&$conf;
                #可省略參數:
                #$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何,null代表不指定變數形態.
                $conf["variableCheck::checkSkipableVarType"]["skipableVarTypeArray"]=array("string","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的變數要初始化為什麼,null代表不指定.
                $conf["variableCheck::checkSkipableVarType"]["skipableVarDefaultValue"]=array("amazon::parseRestCode",$_SERVER["PHP_SELF"]);
                $checkSkipableVarType=variableCheck::checkSkipableVarType($conf["variableCheck::checkSkipableVarType"],$argu);
                unset($conf["variableCheck::checkSkipableVarType"]);

                #如果檢查可省略參數失敗
                if($checkSkipableVarType["status"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]=$checkSkipableVarType;

                        #回傳結果
                        return $result;

                        }#if end

                #取得變動後的參數
                $conf=$argu;

                #接收變數
                #涵式說明:
                #可以處理多個透過GET、POST而來的資訊,儲存成變數,同時限定傳送的方法、來源,來增加安全性,檢查有沒有皆收到必須要接收到的變數,沒有接收到的變數可以指定從session變數中取得.
                #回傳的結果:
                #$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$resutl["function"],當前執行的涵式名稱.
                #$result["warning"],警告訊息陣列.
                #$result["passed"],是否有皆收到全部該接收到的變數,若有設定$conf["checkedVarName"]的話,執行正常後會回傳該結果。
                #$result["lostVarName"],沒有皆收到的變數名稱陣列
                #$result["inputDataContent"],所接收的參數陣列.
                #$result["inputDataContent"]["變數名稱"],所接收變數的內容.
                #$result["inputDataCount"],從表單總共接收到幾個元素.
                #$result["HTTP_REFERER"],前一頁的網址,null代表不存在.
                #必填的參數:
                #$conf["method"],字串,傳送過來的資料是用"post/POST"還是"get/GET"?
                $conf["form::responseMultiInputDataSecurityEnhance"]["method"]="GET";
                #可省略的參數:
                #$conf["allowGet"],字串,是否要允許 get 傳值,"true",代表允許;"false" ,代表不允許,預設爲不允許.
                $conf["form::responseMultiInputDataSecurityEnhance"]["allowGet"]="true";
                #$conf["limitPrePage"],字串陣列,是否要限定前一頁的網址為哪些,才能接收內容,不符合則轉址.
                #$conf["limitPrePage"]=array("");
                #$conf["transferLocation"],字串,遇到get傳值,或前一個頁面不符合要求時要轉址到的頁面,預設爲資安素養網"https://isafe.moe.edu.tw/"
                #$conf["transferLocation"]="";
                #$conf["ignore"]=字串陣列,如果要接收的變數名稱與該陣列其一元素一樣,則不放進要回傳的變數裏面.
                #$conf["ignore"]=array();
                #$conf["correctCharacter"]=,字串,如果爲"false",則不處理可能導致網頁出問題的字串,預設爲要進行處理.
                #$conf["correctCharacter"]="false";
                #$conf["checkedVarName"],字串陣列,為檢查是否有接收到哪些變數.
                $conf["form::responseMultiInputDataSecurityEnhance"]["checkedVarName"]=array("code","scope");
                #$conf["canBeEmptyString"],字串,用$conf["checkedVarName"]指定接收的變數名稱陣列,若接收到的內容為空字串是否算有接收到內容,預設為"false","true"代表接收到的內容可以為空字串,"false"代表接收到的內容不可以為空字串.
                #$conf["form::responseMultiInputDataSecurityEnhance"]["canBeEmptyString"]="true";
                #$conf["sessionNameArray"],陣列,若存在則代表若沒有從表單取得變數,則從session變數中取得內容,每個元素代表每個表單變數對應的session名稱,若不是要改用session方式取得變數內容的變數,請輸入null,數量請跟$conf["checkedVarName"]參數一致.
                #$conf["sessionNameArray"]=array();
                #$conf["unsetSessionArray"],陣列,與$conf["sessionNameArray"]對應的元素,是否要接收到變數後就卸除,"true"代表要卸除,"false"代表不要卸除.
                #$conf["unsetSessionArray"]=array();
                #參考資料來源:
                #foreach 的用法 -> http://php.net/manual/en/control-structures.foreach.php
                #伺服器端的變數 -> http://php.net/manual/en/reserved.variables.server.php
                #備註:
                #表單變數的名稱若含有「.」,則會變成「-」。
                $responseMultiInputDataSecurityEnhance=form::responseMultiInputDataSecurityEnhance($conf["form::responseMultiInputDataSecurityEnhance"]);
                unset($conf["form::responseMultiInputDataSecurityEnhance"]);

                #如果接收變數失敗
                if($responseMultiInputDataSecurityEnhance["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$responseMultiInputDataSecurityEnhance;

                        #回傳結果
                        return $result;

                        }#if end

                #如果沒有接收到一定要的變數
                if($responseMultiInputDataSecurityEnhance["passed"]==="false"){

                        #嘗試取得 session 變數 amazon::parseToken
                        #函式說明:
                        #取得session變數裡面的數值,然後卸除該session變數
                        #回傳的結果:
                        #$result["status"],執行是否正常,"true"代表正常,"false"代表有誤.
                        #$result["error"],錯誤訊息.
                        #$result["founded"],是否找到session變數,"true"代表找到,"false"代表沒找到.
                        #$result["content"],取得的變數內容.
                        #$result["function"],當前執行的函數名稱.
                        #必填的參數:
                        #$conf["sessionVarName"],字串,要取得內容的session變數名稱
                        $conf["session::getSessionValue"]["sessionVarName"]=$conf["restCodeSessionName"];
                        #可省略的參數:
                        #$conf["unsetSessionVar"],字串,代表要卸除session變數,預設為"false"不卸除,"true"代表要卸除.
                        #$conf["session::getSessionValue"]["unsetSessionVar"]="true";
                        #參考資料:
                        #call-time-pass-by-reference-easy-fix-available=>http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
                        #可變變數=>http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
                        #卸除參考的原始變數=>http://stackoverflow.com/questions/6654538/php-function-to-unset-variables-passed-by-reference
                        $getSessionValue=session::getSessionValue($conf["session::getSessionValue"]);
                        unset($conf["session::getSessionValue"]);

                        #如果嘗試取得session變數失敗
                        if($getSessionValue["status"]==="false"){

                                #設置執行不正常
                                $result["status"]="false";

                                #設置執行錯誤
                                $result["error"]=$getSessionValue;

                                #回傳結果
                                return $result;

                                }#if end

                        #如果取得到session變數
                        if($getSessionValue["founded"]==="true"){

                                #取得 session 變數值
                                $result["content"]=$getSessionValue["content"];

                                #設置執行正常
                                $result["status"]="true";

                                #設置有取得到code
                                $result["founded"]="true";

                                #回傳結果
                                return $result;

                                }#if end

                        #反之
                        else{

                                #設置執行正常
                                $result["status"]="true";

                                #設置沒有取得到code
                                $result["founded"]="false";

                                #結束程式
                                return $result;

                                }#else end

                        }#if end

                #反之接收到一定要的變數
                else{

                        #取得接收到的變數
                        $recVar=$responseMultiInputDataSecurityEnhance["inputDataContent"];

                        #儲存解析好的token資訊
                        $_SESSION[$conf["restCodeSessionName"]]=$recVar;

                        #函式說明:
                        #設定session變數後,立即轉址.
                        #回傳的結果:
                        #$result["status"],執行是否成功,"true"代表成功,"false"代表不成功.
                        #$result["function"],當前執行的函數名稱.
                        #$result["error"],錯誤訊息陣列.
                        #必填的參數:
                        #$conf["headerLocation"],為要轉址到的地方,若爲 $_SERVER["PHP_SELF"],則爲回到目前頁面,全民資安素養網爲 https://isafe.moe.edu.tw/.
                        $conf["header::redirectionNow"]["headerLocation"]=$conf["re_url"];
                        #可省略的參數:
                        #$conf["sessionName"],字串陣列,可以指派session變數的名稱.
                        #$conf["sessionName"]=array("");
                        #$conf["sessionValue"]字串陣列,可以指派session變數的內容.
                        #$conf["sessionValue"]=array("");
                        #參靠資料來源:
                        #http://php.net/manual/en/reserved.variables.server.php
                        $redirectionNow=header::redirectionNow($conf["header::redirectionNow"]);
                        unset($conf["header::redirectionNow"]);

                        }#else

                }#function parseRestCode end

        /*
        #函式說明:
        #用 RESTful API 來跟 Amazon cloud 互動的要求連結,識別的方式為token.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息
        #$result["content"],語法
        #$result["function"],當前執行的函數名稱
        #必填參數:
        #$conf["clientId"],字串,用戶端id,亦即app的clientId.
        $conf["clientId"]="";
        #$conf["scope"],字串,要求的權限,例如:clouddrive:read_all clouddrive:write就是代表擁有全部內容的讀寫權限.
        $conf["scope"]="";
        #可省略參數:
        #$conf["redirect_uri"],字串,認證完要轉址到哪哩,預設為當前網址.
        #$conf["redirect_uri"]="";
        #參考資料:
        #amazon cloud drive scrope=>https://developer.amazon.com/public/apis/experience/cloud-drive/content/getting-started
        #amazon restful api=>https://developer.amazon.com/appsandservices/apis/experience/cloud-drive/content/restful-api-getting-started
        #備註:
        #導頁後的網址格式=>https://127.0.0.1/#access_token=Atza%7CIwEBIA-3AFM0FETM_DFFpBQmyztJKN0TYp4AT7CBWy4k8InyFzTA-t1cMPJg05jaRFFjppk4S3VCu3FlBl4MwJj3Uh_A_15abg4SARxfgAv7-vRZ-1UbhYhFmbhjEdziWg4YyoYZvJn5ihZXI2o7mYxy-8r4d4TnwpIspJ3X9tLc6JYzJCU3VRPVCajwV3-WWGwyeQL-DiLgrwIm7iK8Y8W87HoqoXaomPpzsnuef0tQe2Fcquzo3_AVAIB0RYjyH97JtZgL95lQrCagjbr6HNL0mPvjD3GpHxhTjViZjvhMlj8zYAlHc0PYs6zMZ_gElFUOlH448woxtjJtDf4U-l8YZTYq25CBXYeN86l6YuNmi8ZuqozYwHGUDccWR2qbr8jsNdNvErSroeU30sKcPfPEdzbhi7VTOR4WtQS8oYdZHYZTwKWCPPKV1NXRfgQKA9LOUaH85KPWdTsseh-QeDKjk9dkP9j_noNre47mtQWbqojaIhSZfDmADwVQBqBUsQ1DFhaT0r5cF6vjC_LZmHfFZmY067G2JeMijpXfxCvlbwQweA&token_type=bearer&expires_in=3600&scope=clouddrive%3Aread_all
        */
        public static function authenticateToACbyToken(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #如果沒有參數
                if(func_num_args()==0){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]="函數".$result["function"]."需要參數";

                        #回傳結果
                        return $result;

                        }#if end

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!=="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf===null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("clientId","scope");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                #$conf["skipableVariableCanNotBeEmpty"]=array();
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["skipableVariableName"]=array("redirect_uri");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                $conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($_SERVER["REQUEST_URI"]);
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果參數檢查失敗
                if($checkArguments["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #如果參數檢查不通過
                if($checkArguments["passed"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.b91a4d2fd2f641f2a15ea469&scope=clouddrive%3Aread_all%20clouddrive%3Awrite&response_type=token&redirect_uri=http://localhost

                #初始化用 amazon RESTful 認證的 url
                $url="https://www.amazon.com/ap/oa";

                #加密 $conf["clientId"]
                $conf["clientId"]=urlencode($conf["clientId"]);

                #加密 $conf["scope"]
                $conf["scope"]=urlencode($conf["scope"]);

                #加密 $response_type
                $response_type=urlencode("token");

                #加密 $conf["redirect_uri"]
                $conf["redirect_uri"]=urlencode($conf["redirect_uri"]);

                #組合成完整的url
                $url=$url."?client_id=".$conf["clientId"]."&scope=".$conf["scope"]."&response_type=".$response_type."&redirect_uri=".$conf["redirect_uri"];

                #涵式說明:
                #放置超鏈結
                #回傳的結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息
                #$result["content"],語法
                #$result["function"],當前執行的函數名稱
                #必填的參數:
                #$conf["position"],字串,爲要連結到的位置,若留空,將回自動變成"#",則可以搭配ajax傳值.
                $conf["link::show_link"]["position"]=$url;
                #$conf["linkName",字串,爲連結的顯示名稱
                $conf["link::show_link"]["linkName"]="RESTful Authenticate";
                #可省略的參數:
                #$conf["method"],字串,爲點選連結後,新畫面要如何呈現,可省略預設爲"_self",可用的選項有 _top(覆蓋目前的視窗來顯現新內容) _parent _self _blank(跳新視窗)
                #$conf["method"]="";
                #$conf["class"],字串,爲要套用的css超連節樣式,可省略.
                #$conf["class"]="";
                #$conf["id"],字串,超連結的id.
                #$conf["id"]="";
                #$conf["no_outline"],字串,是否要取消連結的框線,"false為不取消,"true"代表要取消,預設為"false".
                #$conf["no_outline"]="";
                $show_link=link::show_link($conf["link::show_link"]);
                unset($conf["link::show_link"]);

                #如果建立超連結的語法失敗
                if($show_link["status"]==="false"){

                        #取得當前執行的函式
                        $result["function"]=__FUNCTION__;

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$show_link;

                        #回傳結果
                        return $result;

                        }#if end

                #取得語法
                $result["content"]=$show_link["content"];

                #設置執行正常
                $result["status"]="true";

                #回傳結果
                return $result;

                }#function demoAuthenticateToACbyToken end

        /*
        #函式說明:
        #用 RESTful API 來跟 Amazon cloud 互動的要求連結,識別的方式為code.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息
        #$result["content"],語法
        #$result["function"],當前執行的函數名稱
        #必填參數:
        #$conf["clientId"],字串,用戶端id,亦即app的clientId.
        $conf["clientId"]="";
        #$conf["scope"],字串,要求的權限,例如:clouddrive:read_all clouddrive:write就是代表擁有全部內容的讀寫權限.
        $conf["scope"]="";
        #可省略參數:
        #$conf["redirect_uri"],字串,認證完要轉址到哪哩,預設為當前網址.
        #$conf["redirect_uri"]="";
        #參考資料:
        #amazon cloud drive scrope=>https://developer.amazon.com/public/apis/experience/cloud-drive/content/getting-started
        #amazon restful api=>https://developer.amazon.com/appsandservices/apis/experience/cloud-drive/content/restful-api-getting-started
        #Amazon-Cloud-Drive-Python-SDK=>https://github.com/cnbeining/Amazon-Cloud-Drive-Python-SDK/blob/master/acd.py
        #備註:
        #導頁後的網址格式=>https://127.0.0.1/#access_token=Atza%7CIwEBIA-3AFM0FETM_DFFpBQmyztJKN0TYp4AT7CBWy4k8InyFzTA-t1cMPJg05jaRFFjppk4S3VCu3FlBl4MwJj3Uh_A_15abg4SARxfgAv7-vRZ-1UbhYhFmbhjEdziWg4YyoYZvJn5ihZXI2o7mYxy-8r4d4TnwpIspJ3X9tLc6JYzJCU3VRPVCajwV3-WWGwyeQL-DiLgrwIm7iK8Y8W87HoqoXaomPpzsnuef0tQe2Fcquzo3_AVAIB0RYjyH97JtZgL95lQrCagjbr6HNL0mPvjD3GpHxhTjViZjvhMlj8zYAlHc0PYs6zMZ_gElFUOlH448woxtjJtDf4U-l8YZTYq25CBXYeN86l6YuNmi8ZuqozYwHGUDccWR2qbr8jsNdNvErSroeU30sKcPfPEdzbhi7VTOR4WtQS8oYdZHYZTwKWCPPKV1NXRfgQKA9LOUaH85KPWdTsseh-QeDKjk9dkP9j_noNre47mtQWbqojaIhSZfDmADwVQBqBUsQ1DFhaT0r5cF6vjC_LZmHfFZmY067G2JeMijpXfxCvlbwQweA&token_type=bearer&expires_in=3600&scope=clouddrive%3Aread_all
        */
        public static function authenticateToACbyCode(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #如果沒有參數
                if(func_num_args()==0){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]="函數".$result["function"]."需要參數";

                        #回傳結果
                        return $result;

                        }#if end

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!=="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf===null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("clientId","scope");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                #$conf["skipableVariableCanNotBeEmpty"]=array();
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["skipableVariableName"]=array("redirect_uri");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                $conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果參數檢查失敗
                if($checkArguments["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #如果參數檢查不通過
                if($checkArguments["passed"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.b91a4d2fd2f641f2a15ea469&scope=clouddrive%3Aread_all%20clouddrive%3Awrite&response_type=token&redirect_uri=http://localhost

                #初始化用 amazon RESTful 認證的 url
                $url="https://www.amazon.com/ap/oa";

                #加密 $conf["clientId"]
                $conf["clientId"]=urlencode($conf["clientId"]);

                #加密 $conf["scope"]
                $conf["scope"]=urlencode($conf["scope"]);

                #加密 $response_type
                $response_type=urlencode("code");

                #加密 $conf["redirect_uri"]
                if(!isset($conf["redirect_uri"])){

                        #涵式說明:
                        #取得用戶端的資訊,並依據需要寫入到資料表裡面
                        #回傳的結果:
                        #$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
                        #$result["error"],錯誤訊息.
                        #$result["function"],檔前執行的函數名稱.
                        #$result["mode"],當前的模式是"cmd"還是"web".
                        #$result["userBrowserType"],爲使用者的瀏覽器資訊
                        #$result["userIp"],爲使用者的IP
                        #$result["serverIp"],為伺服器的IP
                        #$result["scheme"],通訊協定
                        #$result["serverPort"],伺服器給對外下載網頁的port
                        #$result["requestUri"],爲使用者要求的網址
                        #$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功
                        #$result["phpUser"],運行該php的使用者帳戶.
                        #必填的參數:
                        $conf["csInformation::getConnectionInfo"]["getAccount"]="false";#是否要取得帳號
                        #可省略的參數:
                        #$conf["accountVar"]=$_SESSION["username"];#帳號儲存在哪個變數裏面,預設爲$_SESSION["username"]
                        #$conf["saveToDb"]="true";#是否要除儲存到資料庫,"true"為要儲存",預設為不儲存
                        #$conf["dbAddress"]=$dbAddress;;#爲mysql-Server的位置,若#$conf["saveToDb"]設為"true",則該參數為必填。
                        #$conf["dbAccount"]=$dbAccount;#爲用於連入mysql-Server時要使用的帳號,若#$conf["saveToDb"]設為"true",則該參數為必填。
                        #$conf["dbName"]=$dbName;#要選取的資料庫名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。
                        #$conf["tableName"]="visitorInfo";#爲要插入資料的資料表名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。
                        #$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");#爲資料表的項目名稱,
                                #例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);
                                #寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間
                                #$conf["saveToDb"]設為"true",則該參數為必填。
                        #$conf["dbPassword"]=$dbPassword;#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼
                        #參考資料:
                        #$_SERVER=>http://php.net/manual/zh/reserved.variables.server.php
                        #取得伺服器名稱與IP=>http://php.net/manual/en/function.gethostname.php
                        $getConnectionInfo=csInformation::getConnectionInfo($conf["csInformation::getConnectionInfo"]);
                        unset($conf["csInformation::getConnectionInfo"]);

                        #如果取得使用者資訊失敗
                        if($getConnectionInfo["status"]==="false"){

                                #設置執行不正常
                                $result["status"]="false";

                                #設置執行錯誤
                                $result["error"]=$getConnectionInfo;

                                #回傳結果
                                return $result;

                                }#if end

                        #預設的callback url
                        $conf["redirect_uri"]=$getConnectionInfo["scheme"]."://".$getConnectionInfo["serverIp"].":".$getConnectionInfo["serverPort"].$getConnectionInfo["requestUri"];

                        }#if end

                #組合成完整的url
                $url=$url."?client_id=".$conf["clientId"]."&scope=".$conf["scope"]."&response_type=".$response_type."&redirect_uri=".$conf["redirect_uri"];

                #涵式說明:
                #放置超鏈結
                #回傳的結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息
                #$result["content"],語法
                #$result["function"],當前執行的函數名稱
                #必填的參數:
                #$conf["position"],字串,爲要連結到的位置,若留空,將回自動變成"#",則可以搭配ajax傳值.
                $conf["link::show_link"]["position"]=$url;
                #$conf["linkName",字串,爲連結的顯示名稱
                $conf["link::show_link"]["linkName"]="RESTful Authenticate";
                #可省略的參數:
                #$conf["method"],字串,爲點選連結後,新畫面要如何呈現,可省略預設爲"_self",可用的選項有 _top(覆蓋目前的視窗來顯現新內容) _parent _self _blank(跳新視窗)
                #$conf["method"]="";
                #$conf["class"],字串,爲要套用的css超連節樣式,可省略.
                #$conf["class"]="";
                #$conf["id"],字串,超連結的id.
                #$conf["id"]="";
                #$conf["no_outline"],字串,是否要取消連結的框線,"false為不取消,"true"代表要取消,預設為"false".
                #$conf["no_outline"]="";
                $show_link=link::show_link($conf["link::show_link"]);
                unset($conf["link::show_link"]);

                #如果建立超連結的語法失敗
                if($show_link["status"]==="false"){

                        #取得當前執行的函式
                        $result["function"]=__FUNCTION__;

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$show_link;

                        #回傳結果
                        return $result;

                        }#if end

                #取得語法
                $result["content"]=$show_link["content"];

                #設置執行正常
                $result["status"]="true";

                #回傳結果
                return $result;

                }#function demoAuthenticateToACbyCode end

        /*
        #函式說明:
        #讀取Amazon cloud drive的檔案清單
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #$result["content"],取得的回應內容.
        #必填參數:
        #$conf["fileArgu"],字串,變數__FILE__的內容.
        $conf["fileArgu"]=__FILE__;
        #$conf["authToken"],字串,使用者登入後取得的token.
        $conf["authToken"]="";
        #可省略參數:
        #無.
        #參考資料:
        #無.
        #備註:
        #建構中
        */
        public static function readAD(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #如果沒有參數
                if(func_num_args()==0){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]="函數".$result["function"]."需要參數";

                        #回傳結果
                        return $result;

                        }#if end

                #涵式說明:
                #判斷當前環境為web還是cmd
                #回傳結果:
                #$result,"web"或"cmd"
                if(csInformation::getEnv()==="web"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";

                        #回傳結果
                        return $result;

                        }#if end

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!=="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf===null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
                #必填寫的參數:
                #$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("authToken","fileArgu");
                #$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
                #$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                #$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("header","allowAnySSLcertificate","postVar");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","string","array");
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,array());
                #$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
                $checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查參數失敗
                if($checkResult["status"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #如果檢查參數不通過
                if($checkResult["passed"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #函式說明:
                #運行curl cmd
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["content"],取得的回應內容.
                #$result["cmd"],執行的command
                #必填參數:
                #$conf["url"],字串,目標url.
                $url="https://drive.amazonaws.com/drive/v1/account/endpoint";
                #$url="https://cdws.us-east-1.amazonaws.com/drive/v1/changes";
                #$url="https://drive.amazonaws.com/drive/v1/";
                $conf["catchWebContent::curlCmd"]["url"]=$url;
                #$conf["fileArgu"],字串,變數__FILE__的內容.
                $conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;
                #可省略參數:
                #$conf["header"],字串陣列,要傳送的header.
                $conf["header"][]="Authorization: Bearer ".$conf["authToken"];
                #$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
                #$conf["allowAnySSLcertificate"]="";
                #$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
                #$conf["postVar"]=array();
                #備註:
                #僅能在命令列下執行.
                $curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);
                unset($conf["catchWebContent::curlCmd"]);

                #如果運行curl失敗
                if($curlCmd["status"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]=$curlCmd;

                        #回傳結果
                        return $result;

                        }#if end

                var_dump($curlCmd);

                }#function readAD end

        /*
        #函式說明:
        #用parseRestCode函數取得的code來取得token
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #$result["content"],取得的回應內容.
        #$result["cmd"],執行的command
        #必填參數:
        #$conf["fileArgu"],字串,變數__FILE__的內容.
        $conf["fileArgu"]=__FILE__;
        #$conf["code"],字串,從parseRestCode函數取得的code.
        $conf["code"]="";
        #$conf["clientId"],字串,用戶端id,亦即app的clientId.
        $conf["clientId"]="";
        #$conf["clientSecret"],字串,用戶端的 client secret.
        $conf["clientSecret"]="";
        #可省略參數:
        #無
        #參考資料:
        #php的amazon cloud drive api應用=>https://github.com/alex-phillips/clouddrive-php
        #備註:
        #僅能在命令列下執行.
        #似乎因為沒有被 Amazon 列到 white list 裡面所以目前無法取得token
        */
        public static function getACtokenByCode(&$conf){

                #初始化要回傳的結果
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #如果沒有參數
                if(func_num_args()==0){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]="函數".$result["function"]."需要參數";

                        #回傳結果
                        return $result;

                        }#if end

                #涵式說明:
                #判斷當前環境為web還是cmd
                #回傳結果:
                #$result,"web"或"cmd"
                if(csInformation::getEnv()==="web"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";

                        #回傳結果
                        return $result;

                        }#if end

                #取得參數
                $result["argu"]=$conf;

                #如果 $conf 不為陣列
                if(gettype($conf)!=="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf===null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("clientId","code","fileArgu","clientSecret");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string","string");
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                #$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                #$conf["skipableVariableCanNotBeEmpty"]=array();
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                #$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("redirect_uri");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果參數檢查失敗
                if($checkArguments["status"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #如果參數檢查不通過
                if($checkArguments["passed"]==="false"){

                        #設置執行不正常
                        $result["status"]="false";

                        #設置執行錯誤
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #函式說明:
                #運行curl cmd
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["content"],取得的回應內容.
                #$result["cmd"],執行的command
                #必填參數:
                #$conf["url"],字串,目標url.
                $conf["catchWebContent::curlCmd"]["url"]="https://api.amazon.com/auth/o2/token";
                #$conf["catchWebContent::curlCmd"]["url"]="https://127.0.0.1/~qbpwcf/samplePage/phplib/qbpwcf/testCase/amazonT/showRequest.php";
                #$conf["fileArgu"],字串,變數__FILE__的內容.
                $conf["catchWebContent::curlCmd"]["fileArgu"]=$conf["fileArgu"];
                #可省略參數:
                #$conf["header"],字串陣列,要傳送的header.
                $conf["catchWebContent::curlCmd"]["header"][]="HTTP/1.1";
                $conf["catchWebContent::curlCmd"]["header"][]="Content-Type: application/x-www-form-urlencoded";
                $conf["catchWebContent::curlCmd"]["header"][]="Cache-Control: no-cache";
                #$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
                #$conf["allowAnySSLcertificate"]="";
                #$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
                $conf["catchWebContent::curlCmd"]["postVar"]["grant_type"]="authorization_code";
                $conf["catchWebContent::curlCmd"]["postVar"]["code"]=$conf["code"];
                $conf["catchWebContent::curlCmd"]["postVar"]["client_id"]=$conf["clientId"];
                $conf["catchWebContent::curlCmd"]["postVar"]["client_secret"]=$conf["clientSecret"];
                $conf["catchWebContent::curlCmd"]["postVar"]["redirect_uri"]="https://localhost";
                #$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.
                $conf["catchWebContent::curlCmd"]["urlEncode"]="true";
                #備註:
                #僅能在命令列下執行.
                $curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);
                unset($conf["catchWebContent::curlCmd"]);

                #如果執行curl cmd失敗
                if($curlCmd["status"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"]=$curlCmd;

                        #回傳結果
                        return $result;

                        }#if end

                #取得回應
                $result["content"]=$curlCmd["content"];

                #取得執行的culr命令
                $result["cmd"]=$curlCmd["cmd"];

                #設置正常執行
                $result["status"]="true";

                #回傳結果
                return $result;

                }#functino getACtokenByCode end

        }#class amazon end

?>