時間:2023-05-31 01:21:01 | 來源:網(wǎng)站運營
時間:2023-05-31 01:21:01 來源:網(wǎng)站運營
【微信網(wǎng)頁開發(fā)】關(guān)于微信JSSDK,如何自定義微信網(wǎng)頁的分享內(nèi)容:這個教程一直想做,但對于小白來說理解可能有些困難,但轉(zhuǎn)念一想,我TM管小白干什么? //私有屬性 private $appId; private $appSecret; private $s_url; //入口函數(shù) public function __construct($appId, $appSecret,$s_url) { $this->appId = $appId; $this->appSecret = $appSecret; $this->s_url = $s_url; }
接受來自網(wǎng)頁的公眾號參數(shù)等private function getAccessToken() { // access_token 應該全局存儲與更新,以下代碼以寫入到文件中做示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { // 如果是企業(yè)號用以下URL獲取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret"; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; }
這里注意有一個access_token.json文件,是用來存儲獲取到的access_token參數(shù)的,一般在php中,這個參數(shù)可以存儲在php的session中,也可以存在數(shù)據(jù)庫中,但我們這是個單文件,沒寫框架也沒寫整套程序,所以我就簡單的存在一個文件中了,所以你需要在你的jssdk.php同級目錄,新建一個access_token.json空白文件。private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; }
這里我們基礎(chǔ)方法也就寫完了,接下來是兩個核心方法,首先按照官方的說法我們通過剛才的access_token去微信服務器獲取jsapi_ticketprivate function getJsApiTicket() { // jsapi_ticket 應該全局存儲與更新,以下代碼以寫入到文件中做示例 $data = json_decode(file_get_contents("jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); // 如果是企業(yè)號用以下 URL 獲取 ticket // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken"; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $fp = fopen("jsapi_ticket.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; }
對,根據(jù)上面的寫法,我們需要再新建一個名為jsapi_ticket.json的空白文件,用來存儲jsapi_ticketpublic function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); // 注意 URL 一定要動態(tài)獲取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = $this->s_url; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; }
好了,是不是很懵啊,沒關(guān)系,看看官方文檔就可以了,這些字段就是我們前端頁面調(diào)用jssdk接口所需的驗簽字段了,接下來還有一個問題,這些方法都是php的,但前端網(wǎng)頁只能支持js腳本語言,通過js調(diào)用php的類好像行不通啊。$url = $_POST['url'];$jssdk = new JSSDK("你的appid", "你的appSecret",$url);$signPackage = $jssdk -> getSignPackage();echo json_encode($signPackage);
這里的appid和appSecret你也可以不寫死,讓js傳過來,都是一樣的<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> console.log(111) /**獲取配置*/ function getConfig(){ $.post("你的域名/jssdk.php", { url: window.location.href, method: "ticket"}, function(data){ console.log(data) config = eval('('+data+')'); wx.config({ debug: false, appId: config.appId, timestamp: config.timestamp, nonceStr: config.nonceStr, signature: config.signature, jsApiList: [ // 所有要調(diào)用的 API 都要加到這個列表中 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem', 'translateVoice', 'startRecord', 'stopRecord', 'onRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'closeWindow', 'scanQRCode', 'chooseWXPay', 'openProductSpecificView', 'addCard', 'chooseCard', 'openCard' ] }); wx.ready(function () { var shareData = { title: '自定義分享標題', desc: '自定義分享描述', link: '自定義分享鏈接', imgUrl: '自定義分享封面圖' }; wx.onMenuShareAppMessage({ title: '自定義分享標題!', // 分享標題 desc: '自定義分享描述', // 分享描述 link: '自定義分享鏈接', // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致 imgUrl: '自定義分享封面圖', // 分享圖標 type: '', // 分享類型,music、video或link,不填默認為link dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認為空 success: function () { // alert("成功") } }); wx.onMenuShareAppMessage(shareData);//分享給好友 wx.onMenuShareTimeline(shareData);//分享到朋友圈 wx.onMenuShareQQ(shareData);//分享給手機QQ wx.onMenuShareWeibo(shareData);//分享騰訊微博 wx.onMenuShareQZone(shareData);//分享到QQ空間 }); }); } </script>
最后上文中的這些文件我也都打包了,獲取的話可以在原文底部獲取關(guān)鍵詞:定義,內(nèi)容
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。