聲明:javascript
本篇博文只是我的工做中的分享總結,僅表明我的觀點,雖然解決了很多網友的問題,但同時也引來了一些網友的不滿,因此特此聲明,當您遇到本博文解決不了的問題,能夠嘗試從新進行其餘搜索或者一塊兒交流,相信總歸能解決,而不是言語攻擊!該博文的解決方案畢竟不是萬金油,解決不了全部問題!php
上篇主要介紹了分享的文檔,下面這篇直接上代碼(代碼是用PHP來寫的),讓你們更容易理解。上篇地址:關於微信二次分享,描述變連接的解決方法(一)----文檔說明html
代碼分三部分進行,第一部分是C層(Controller),第二部分是M層(Model),第三部分是V層(View)java
1.控制器層WeixinControllerredis
$data = array( 'pic'=>'',//圖片地址 'title'=>'',//標題 'description'=>''//描述 ); $weixinmodel = new WeixinshareModel(); $weixindata = array(); $weixindata['appId'] = 'xxxxxxxxxxxxxxxxxxxx';//appid $weixindata['nonceStr'] = $weixinmodel->createNonceStr(); $weixindata['timestamp'] = time(); $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $weixindata['pic'] = $data['pic']; $weixindata['link'] = $url; $weixindata['title'] = $data['title']; $weixindata['description'] = mb_substr($data['description'], 0, 30, 'UTF-8'); $weixindata['signature'] = $weixinmodel->signature($weixindata['nonceStr'],$weixindata['timestamp'],$url); $this->assign("weixindata", $weixindata);
2.模型層WeixinModeljson
<?php class WeixinshareModel extends BaseModel { const APPID = 'xxxxxxxxxxxxxxx'; const APPSECRET = 'xxxxxxxxxxxxxxxxxxxxxxxx'; function __construct() { parent::__construct(); } //獲取access_token public function accessToken() { $access_token = $this->redis->get("weixin_access_token");//存入redis,這裏要結合本身的項目,對redis或者memcahe進行設置 if(!$access_token){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".self::APPID."&secret=".self::APPSECRET; $data = json_decode($this->httpGet($url),true); if(isset($data['access_token']) && $data['access_token'] != ''){ $access_token = $this->redis->set("weixin_access_token",$data['access_token'],7200); }else{ return false; } } return $access_token; } //用第一步拿到的access_token 採用http GET方式請求得到jsapi_ticket public function jsapiTicket() { $jsapi_ticket = $this->redis->get("weixin_jsapi_ticket"); if(!$jsapi_ticket){ $access_token = $this->accessToken(); if($access_token){ $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; $data = json_decode($this->httpGet($url),true); if(isset($data['errcode']) && $data['errcode']== 0){//請求成功 $jsapi_ticket = $this->redis->set("weixin_jsapi_ticket",$data['ticket'],7200); }else{ return false; } }else{ return false; } } return $jsapi_ticket; } //獲取signature public function signature($nonceStr,$timestamp,$url) { $jsapi_ticket = $this->jsapiTicket(); $signature = ''; if($jsapi_ticket) { $string = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string);//對string1進行sha1簽名,獲得signature }else{ return false; } return $signature; } //生成隨機字符串 public 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; } //遠程請求,能夠調用本身項目的遠程請求 public 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; } }
3.視圖層weixin.phtmlapi
<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> <meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" name="viewport"> <!--這個js必須引入--> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> </head> <body> <script type="text/javascript"> wx.config({ //debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: '<?=$weixindata['appId']?>', // 必填,公衆號的惟一標識 timestamp: <?=$weixindata['timestamp']?>, // 必填,生成簽名的時間戳 nonceStr: '<?=$weixindata['nonceStr']?>', // 必填,生成簽名的隨機串 signature: '<?=$weixindata['signature']?>',// 必填,簽名,見附錄1 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,須要使用的JS接口列表 }); wx.ready(function(){ wx.onMenuShareTimeline({//分享到朋友圈 title: '<?=$weixindata['title']?>', // 分享標題 link: '<?=$weixindata['link']?>', // 分享連接 imgUrl: '<?=$weixindata['pic']?>' // 分享圖標 }); wx.onMenuShareAppMessage({//分享給朋友 title: '<?=$weixindata['title']?>', // 分享標題 desc: '<?=$weixindata['description']?>', // 分享描述 link: '<?=$weixindata['link']?>', // 分享連接 imgUrl: '<?=$weixindata['pic']?>', // 分享圖標 type: '', // 分享類型,music、video或link,不填默認爲link dataUrl: '', // 若是type是music或video,則要提供數據連接,默認爲空 success: function () { // 用戶確認分享後執行的回調函數 }, cancel: function () { // 用戶取消分享後執行的回調函數 } }); wx.onMenuShareQQ({//分享到QQ title: '<?=$weixindata['title']?>', // 分享標題 desc: '<?=$weixindata['description']?>', // 分享描述 link: '<?=$weixindata['link']?>', // 分享連接 imgUrl: '<?=$weixindata['pic']?>' // 分享圖標 }); wx.onMenuShareWeibo({//分享到騰訊微博 title: '<?=$weixindata['title']?>', // 分享標題 desc: '<?=$weixindata['description']?>', // 分享描述 link: '<?=$weixindata['link']?>', // 分享連接 imgUrl: '<?=$weixindata['pic']?>' // 分享圖標 }); wx.onMenuShareQZone({//分享到QQ空間 title: '<?=$weixindata['title']?>', // 分享標題 desc: '<?=$weixindata['description']?>', // 分享描述 link: '<?=$weixindata['link']?>', // 分享連接 imgUrl: '<?=$weixindata['pic']?>' // 分享圖標 }); // config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。 }); </script> <div class="wrap"> </div> </body> </html>
以上就是開發過程當中的代碼部分,php部分的代碼沒有優化,不足之處還望指正,如有疑惑之處能夠QQ我:991769422;微信