關於微信二次分享,標題變連接的解決方法(二)----代碼部分

聲明: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&timestamp=$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;微信

相關文章
相關標籤/搜索