H5微信公众号拉起APP端软件

概述

  • H5公众号拉起APP

注意事项

  • 要在正式环境,也就是管理公众号配置的那个域名下才有效,要不然出不来
  • 微信sdk要1.6.0版本以上
  • 微信浏览器版本要7.0.12版本以上
  • 微信开发工具(版本:1.05.210390),即使是正式环境,都是能出现<wx-open-launch-app>这个标签,但是不能正确渲染,所以调试起来非常麻烦,在手机端调试

main.js文件

  • 在main.js 文件添加Vue.config.ignoredElements = ['wx-open-launch-app']这句代码,要不然vue会不识别<wx-open-launch-app>这个标签,会有个警告,可能会影响显示
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.config.ignoredElements = ['wx-open-launch-app']

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

config的配置

  • 要配置openTagList: ['wx-open-launch-app']
  • 没有配置不知道会出现什么问题,我乖乖按照微信要求配置了
wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [], // 必填,需要使用的JS接口列表
  openTagList: [] // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
});

封装的组件

  • 由于样式不好改,所以改成了弹框的形式
<template>
  <div>
    <van-dialog
      :value="value"
      @input="closeApp"
      title="提示"
      class="my-dialog"
      :showConfirmButton="false"
    >
      <p>这是描述</p>
      <!-- 权限不够,伪按钮标签 -->
      <button class="fake-btn" v-if="!isPassWeixin" @click="handleNotSatisfied">
        立即打开
      </button>
      <wx-open-launch-app
        v-else
        id="launch-btn"
        @error="handleError"
        @launch="handleLaunch"
        :extinfo="extData"
        appid="你公司的appid"
      >
        <script type="text/wxtag-template">
          <style>
            .wx-open-tag-download {
              border: 1px solid #94252A;
              background: #94252A;
              font-weight: 600;
              color: #fff;
              outline: none;

              font-size: 13px;
              border-radius: 30px;
              padding: 8px 14px;
            }
          </style>
          <button class="wx-open-tag-download">立即打开</button>
        </script>
      </wx-open-launch-app>
    </van-dialog>
  </div>
</template>

<script>
export default {
  props: {
    value: Boolean, //拉起APP组件是否显示
    extData: String //跳转App信息
  },
  data() {
    return {
      showDialog: this.value, //打开APP弹框
      isPassWeixin: false, //微信版本是否达标
      isPassIOS: false, //苹果系统是否达标
      isPassAndroid: false //安卓系统是否达标
    }
  },
  created() {
    this.judgeWeixinVersion()
  },
  methods: {
    closeApp() {
      this.$emit('input')
    },
    //处理条件不满足
    handleNotSatisfied() {
      if (!this.isPassWeixin) {
        this.$dialog.alert({
          title: '提示',
          message: '请升级微信'
        })
      }
    },
    init() {
      this.judgeWeixinVersion()
    },
    //判断微信版本是否达到最低要求 7.0.12
    judgeWeixinVersion() {
      /* eslint-disable */
      const wechatInfo = window.navigator.userAgent.match(
        /MicroMessenger\/([\d\.]+)/i
      )
      /* eslint-disable */
      if (!wechatInfo) return false
      const versionStr = wechatInfo[1]
      const result = this.versionStringCompare(versionStr, '7.0.12')
      if (result >= 0) {
        this.isPassWeixin = true
      }
    },
    //判断安卓系统版本是否达到最低要求 5.0
    judgeAndroidVersion() {
      const androidInfo = window.navigator.userAgent.match(
        /; Android ([\d\.]+);/i
      )
      const versionStr = androidInfo[1]
      const result = this.versionStringCompare(versionStr, '5.0')
      if (result >= 0) {
        this.isPassAndroid = true
      }
    },
    //判断苹果系统系统版本是否达到最低要求 10.3
    judgeIOSVersion() {
      // const iosInfo = window.navigator.userAgent.match(/cpu iphone os (\d+)\_(\d+) like/i)
      const iosInfo = window.navigator.userAgent.match(
        /CPU iPhone OS ([\d\_]+) like/i
      )
      const versionStr = iosInfo[1].split('_').join('.')
      const result = this.versionStringCompare(versionStr, '10.3')
      if (result >= 0) {
        this.isPassIOS = true
      }
    },
    /***
     * @param {string} preVersion  //版本1
     * @param {string} lastVersion  //版本2
     * @return {number} 1:版本1>版本2  0:版本1==版本2 -1:版本1<版本2
     */
    versionStringCompare(preVersion, lastVersion) {
      let sources = preVersion.split('.')
      let dests = lastVersion.split('.')
      let maxL = Math.max(sources.length, dests.length)
      let result = 0
      for (let i = 0; i < maxL; i++) {
        let preValue = sources.length > i ? sources[i] : 0
        let preNum = isNaN(Number(preValue))
          ? preValue.charCodeAt()
          : Number(preValue)
        let lastValue = dests.length > i ? dests[i] : 0
        let lastNum = isNaN(Number(lastValue))
          ? lastValue.charCodeAt()
          : Number(lastValue)
        if (preNum < lastNum) {
          result = -1
          break
        } else if (preNum > lastNum) {
          result = 1
          break
        }
      }
      return result
    },
    handleLaunch() {
      this.closeApp()
    },
    handleError(e) {
      console.log('error', e, e.detail)
      this.download()
      // dialog.alert({ message: "error:" + JSON.stringify(e.detail) });
    },
    download() {
      if (this.utils.isIOS()) {
        this.downloadIos()
      } else {
        this.downloadAndroid()
      }
    },
    async downloadAndroid() {
      //自己公司下载安卓的业务
    },
    async downloadIos() {
      //自己公司下载苹果的业务
    },
  }
}
</script>

<style lang="less" scoped>
@import '~@/assets/styles/global.less';
.fake-btn {
  border: 1px solid #ff2442;
  background: #fff;
  font-size: 0.28rem;
  font-weight: 600;
  border-radius: 0.3rem;
  padding: 0.12rem 0.18rem;
  color: #ff2442;
  outline: none;
}
.my-dialog {
  /deep/.van-dialog__content {
    text-align: center;
    padding-bottom: 0.32rem;
    p {
      margin: 0;
      padding: 0.16rem 0.48rem 0.48rem;
    }
  }
}
</style>

使用组件

<template>
  <div>
    <van-button @click="handleOpenApp">点击弹出微信标签弹框</van-button>
    <open-app v-model="showApp" :extData="'type=2&id=123'" />
  </div>
</template>

<script>
import openApp from '@/components/openApp/openApp'
export default {
  components: {
    openApp
  },
  data() {
    return {
      showApp: false
    }
  },
  methods: {
    handleOpenApp() {
      this.showApp = true
    }
  }
}
</script>

<style></style>

图片

  • 因为涉及公司隐私,所以有部分图片我不方便放出来
  • 点击微信开放标签,会有个微信的弹框,询问你是否打开APP


    18d3b4263a89174ab898b0e99098474.jpg

完成

  • 目前功能是已经做出来了,拉起对应的苹果和安卓APP,如果没有APP的就跳应用市场帮用户下载

有问题可以咨询谈论,互相学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容