美文网首页
微信内部网页按钮点击跳转至小程序

微信内部网页按钮点击跳转至小程序

作者: 量U移动广告归因 | 来源:发表于2021-06-19 22:58 被阅读0次
  • 注意一定要是微信内置浏览器打开的页面,外部浏览器打开的页面不能使用这种方式跳转至小程序
配置微信公众号的 JS 接口安全域名

配置路径为公众号后台-设置与开发-公众号设置-功能设置-JS接口安全域名

获取需要跳转小程序的原始ID
获取公众号的AppID、AppSecret

这几个数值之后需要用到,先记录下来
需要跳转小程序原始ID获取路径:小程序后台-设置与开发-公众号设置-帐号详情-原始ID(需要拉到最底端)
AppID、AppSecret获取路径:公众号后台-设置与开发-基本配置-公众号开发信息(AppSecret没有设置的需要先设置)

页面开发
<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="这里填需要跳转的小程序原始ID"
    >
      <script type="text/wxtag-template">
        <style>.btn { display: flex;align-items: center; }</style>
        <button class="wx-btn">跳转小程序</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, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: appId, // 必填,公众号的唯一标识
        timestamp: timestamp, // 必填,生成签名的时间戳
        nonceStr: nonceStr, // 必填,生成签名的随机串
        signature: signature,// 必填,签名
        jsApiList: ["onMenuShareWeibo"], // 必填,需要使用的JS接口列表
        openTagList: ['wx-open-launch-weapp']
    });
    wx.ready(function(){
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
        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信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于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标签的username属性填上需要跳转的小程序原始ID

php程序开发

<?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();
        
        // 这里参数的顺序要按照 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 应该全局存储与更新,以下代码以写入到文件中做示例
        $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 应该全局存储与更新,以下代码以写入到文件中做示例
        $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;
    }
}
//调用
$jssdk = new JSSDK("wxe80e2bcc30d63eaf", "e24d87afe97b01f4c4c355a206f9e92e");
$signPackage = $jssdk->GetSignPackage();
?>

最后返回的signPackage是个数组,包含appId、nonceStr、timestamp、signature等信息 如果开发方式是php和html混编的形式,直接把php放到html页面上,如果采用了php框架,则根据框架的数据渲染规则,将signPackage数据渲染到页面上
(完结)

相关文章

网友评论

      本文标题:微信内部网页按钮点击跳转至小程序

      本文链接:https://www.haomeiwen.com/subject/nyljeltx.html