微信JSSDK頁面授權實作類別PHP ssdb redis ssdb 命令 ssdb redis 比

來源:互聯網
上載者:User
頁面授權–(JS-SDK使用許可權簽名演算法)
使用方法:執行個體化此類,然後調用其中的getSignPackage()方法即可。
注意:其中涉及擷取access_token和jsapi_ticket需要自己緩衝,不能頻繁擷取!

/** * Author: helen * CreateTime: 2016/4/11 10:39 * description: 頁面授權--(JS-SDK使用許可權簽名演算法) */classJSSDK{private$appId;    private$appSecret;    publicfunction__construct($appId, $appSecret)    {$this->appId = $appId;        $this->appSecret = $appSecret;    }    /*     * 擷取access_token     * (需要緩衝,可利用資料庫儲存,不要頻繁重新整理擷取)     * http請求方式: GET  https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET     * 介面請求參數     *  參數       是否必須          說明        grant_type  是   擷取access_token填寫client_credential        appid       是   第三方使用者唯一憑證        secret      是   第三方使用者唯一憑證密鑰,即appsecret     * 介面返回說明     * {"access_token":"ACCESS_TOKEN","expires_in":7200}    access_token    擷取到的憑證  expires_in  憑證有效時間,單位:秒     * 介面錯誤說明     * {"errcode":40013,"errmsg":"invalid appid"}     * */privatefunctiongetAccessToken(){$appId = $this->appId;        $appSecret = $this->appSecret;        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appId.'&secret='.$appSecret;        $res = $this->api_request($url);        if(isset($res->access_token)){            returnarray(                'errcode'       =>0,                'errmsg'        =>'success',                'access_token'  =>$res->access_token,                'expires_in'    =>$res->expires_in            );        }else{            returnarray(                'errcode'       =>$res->errcode,                'errmsg'        =>$res->errmsg,                'access_token'  =>null,                'expires_in'    =>null            );        }    }    /*     * 擷取jsapi_ticket     * (有效期間7200秒,開發人員必須在自己的服務全域緩衝jsapi_ticket)     * 請求方式:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi     * 介面傳回值:JSON     * {            "errcode":0,            "errmsg":"ok",            "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",            "expires_in":7200        }     * */privatefunctiongetJsApiTicket(){$access_token_data = $this->getAccessToken();        if($access_token_data['errcode']==0){            $access_token = $access_token_data['access_token'];            $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi';            $res = $this->api_request($url);            if($res->errcode==0){                returnarray(                    'errcode'     =>$res->errcode,                    'errmsg'      =>$res->errmsg,                    'ticket'      =>$res->ticket,                    'expires_in'  =>$res->expires_in                );            }else{                returnarray(                    'errcode'     =>$res->errcode,                    'errmsg'      =>$res->errmsg,                    'ticket'      =>null,                    'expires_in'  =>null                );            }        }else{            returnarray(                'errcode'         =>$access_token_data['errcode'],                'errmsg'          =>$access_token_data['errmsg'],                'ticket'          =>null,                'expires_in'      =>null            );        }    }    /*     * 簽名演算法     * 簽名建置規則如下:參與簽名的欄位包括noncestr(隨機字串), 有效jsapi_ticket, timestamp(時間戳記), url(當前網頁的URL,不包含#及其後面部分) 。     * 1、對所有待簽名參數按照欄位名的ASCII 碼從小到大排序(字典序)後,     * 2、使用URL索引值對的格式(即key1=value1&key2=value2…)拼接成字串string1。     * 這裡需要注意的是所有參數名均為小寫字元。對string1作sha1加密,欄位名和欄位值都採用原始值,不進行URL 轉義。     * *//*     * 擷取隨機字串     * mt_rand() 使用 Mersenne Twister 演算法返回隨機整數。     * mt_rand(min,max)如果沒有提供選擇性參數 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之間的偽隨機數。     * 想要 5 到 15(包括 5 和 15)之間的隨機數,用 mt_rand(5, 15)。     * 此函數rand()快四倍     * *//*     * 1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。     * 2.簽名用的url必須是調用JS介面頁面的完整URL。     * 3.出於安全考慮,開發人員必須在伺服器端實現簽名的邏輯。     * 注意:     * 確保你擷取用來簽名的url是動態擷取的,動態網頁面可參見執行個體代碼中php的實現方式。     * 如果是html的靜態頁面在前端通過ajax將url傳到後台簽名,前端需要用js擷取當前頁面除去'#'hash部分的連結(可用location.href.split('#')[0]擷取,而且需要encodeURIComponent),     * 因為頁面一旦分享,用戶端會在你的連結末尾加入其它參數,如果不是動態擷取當前連結,將導致分享後的頁面簽名失敗。     * */publicfunctiongetSignPackage()    {$jsapiTicket_data = $this->getJsApiTicket();        $nonceStr = $this->getNonceStr();        $timestamp = time();        $url = $this->getUrl();        if($jsapiTicket_data['errcode']==0){            $jsapiTicket = $jsapiTicket_data['ticket'];            // 這裡參數的順序要按照 key 值 ASCII 碼升序排序$string = "jsapi_ticket=$jsapiTicket&n/span>;            $signature = sha1($string);            returnarray(                "appId"         => $this->appId,                "nonceStr"      => $nonceStr,                "timestamp"     => $timestamp,                "url"           => $url,                "signature"     => $signature,                "rawString"     => $string,                "errcode"       => $jsapiTicket_data['errcode'],                "errmsg"        => $jsapiTicket_data['errmsg']            );        }else{            returnarray(                "appId"         => $this->appId,                "nonceStr"      => $nonceStr,                "timestamp"     => $timestamp,                "url"           => $url,                "signature"     => null,                "rawString"     => null,                "errcode"       => $jsapiTicket_data['errcode'],                "errmsg"        => $jsapiTicket_data['errmsg']            );        }    }    /*     * 擷取nonceStr     * */privatefunctiongetNonceStr($length = 16)    {$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";        $nonceStr = "";        for ($i = 0; $i < $length; $i++) {            $nonceStr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);        }        return$nonceStr;    }    /*     * 擷取url     * url(當前網頁的URL,不包含#及其後面部分)     * */privatefunctiongetUrl(){$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";        return$url;    }    /*     * API調用方法     * */privatefunctionapi_request($url,$data=null){//初始化cURL方法$ch = curl_init();        //設定cURL參數(基本參數)$opts = array(            //在區域網路內訪問https網站時需要設定以下兩項,關閉ssl驗證!//此兩項正式上線時需要更改(不檢查和驗證認證)            CURLOPT_SSL_VERIFYPEER => false,            CURLOPT_SSL_VERIFYHOST => false,            CURLOPT_TIMEOUT => 500,            CURLOPT_RETURNTRANSFER => true,            CURLOPT_URL => $url,        );        curl_setopt_array($ch, $opts);        //post請求參數if (!empty($data)) {            curl_setopt($ch, CURLOPT_POST, true);            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);        }        //執行cURL操作$output = curl_exec($ch);        if (curl_errno($ch)) {    //cURL操作發生錯誤處理。            var_dump(curl_error($ch));            die;        }        //關閉cURL        curl_close($ch);        $res = json_decode($output);        return ($res);   //返回json資料    }}

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介紹了JSSDK頁面授權實作類別PHP,包括了php,ssd方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.