頁面授權–(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教程有興趣的朋友有所協助。