微信內(nèi)部網(wǎng)頁按鈕點擊跳轉(zhuǎn)至小程序

  • 注意一定要是微信內(nèi)置瀏覽器打開的頁面,外部瀏覽器打開的頁面不能使用這種方式跳轉(zhuǎn)至小程序
配置微信公眾號的 JS 接口安全域名

配置路徑為公眾號后臺-設(shè)置與開發(fā)-公眾號設(shè)置-功能設(shè)置-JS接口安全域名

獲取需要跳轉(zhuǎn)小程序的原始ID
獲取公眾號的AppID、AppSecret

這幾個數(shù)值之后需要用到,先記錄下來
需要跳轉(zhuǎn)小程序原始ID獲取路徑:小程序后臺-設(shè)置與開發(fā)-公眾號設(shè)置-帳號詳情-原始ID(需要拉到最底端)
AppID、AppSecret獲取路徑:公眾號后臺-設(shè)置與開發(fā)-基本配置-公眾號開發(fā)信息(AppSecret沒有設(shè)置的需要先設(shè)置)

頁面開發(fā)
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/> 
    <title>測試</title>
</head>
<body>
    <div class="home">
    <wx-open-launch-weapp
      id="launch-btn"
      username="這里填需要跳轉(zhuǎn)的小程序原始ID"
    >
      <script type="text/wxtag-template">
        <style>.btn { display: flex;align-items: center; }</style>
        <button class="wx-btn">跳轉(zhuǎn)小程序</button>
      </script>
    </wx-open-launch-weapp>
  </div>
</body>
<script type="text/javascript" src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script type="text/javascript">
    var appId = "<?php echo $signPackage['appId']; ?>";
    var nonceStr = "<?php echo $signPackage['nonceStr']; ?>";
    var timestamp = "<?php echo $signPackage['timestamp']; ?>";
    var signature = "<?php echo $signPackage['signature']; ?>";
 
    wx.config({
        debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
        appId: appId, // 必填,公眾號的唯一標(biāo)識
        timestamp: timestamp, // 必填,生成簽名的時間戳
        nonceStr: nonceStr, // 必填,生成簽名的隨機串
        signature: signature,// 必填,簽名
        jsApiList: ["onMenuShareWeibo"], // 必填,需要使用的JS接口列表
        openTagList: ['wx-open-launch-weapp']
    });
    wx.ready(function(){
        // config信息驗證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
        var btn = document.getElementById('launch-btn');
        btn.addEventListener('launch', function (e) {
            console.log('success');
        });
        btn.addEventListener('error', function (e) {
            console.log('fail', e.detail);
        });
    });
    wx.error(function(res){
        // config信息驗證失敗會執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對于SPA可以在這里更新簽名。
    });
    wx.checkJsApi({
        jsApiList: [], // 需要檢測的JS接口列表,所有JS接口列表見附錄2,
        success: function(res) {
        // 以鍵值對的形式返回,可用的api值true,不可用為false
        // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
        }
    });
</script>
</html>

wx-open-launch-weapp標(biāo)簽的username屬性填上需要跳轉(zhuǎn)的小程序原始ID

php程序開發(fā)

<?php
class JSSDK {
    private $appId;
    private $appSecret;
    
    public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }
    
    public function getSignPackage() {
        $jsapiTicket = $this->getJsApiTicket();
        $url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        
        // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        
        $signature = sha1($string);
        
        $signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }
    
    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;
    }
    
    private function getJsApiTicket() {
        // jsapi_ticket 應(yīng)該全局存儲與更新,以下代碼以寫入到文件中做示例
        $data = json_decode(file_get_contents("jsapi_ticket.json"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            $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;
    }
    
    private function getAccessToken() {
        // access_token 應(yīng)該全局存儲與更新,以下代碼以寫入到文件中做示例
        $data = json_decode(file_get_contents("access_token.json"));
        if ($data->expire_time < time()) {
            $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_URL, $url);
        
        $res = curl_exec($curl);
        curl_close($curl);
        
        return $res;
    }
}
//調(diào)用
$jssdk = new JSSDK("wxe80e2bcc30d63eaf", "e24d87afe97b01f4c4c355a206f9e92e");
$signPackage = $jssdk->GetSignPackage();
?>

最后返回的signPackage是個數(shù)組,包含appId、nonceStr、timestamp、signature等信息 如果開發(fā)方式是php和html混編的形式,直接把php放到html頁面上,如果采用了php框架,則根據(jù)框架的數(shù)據(jù)渲染規(guī)則,將signPackage數(shù)據(jù)渲染到頁面上
(完結(jié))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容