(wx-open-launch-app)微信内跳转APP

748 阅读4分钟

背景

需求需要实现再微信APP内部打开链接的方式,再链接中跳转APP

方案

准备一个H5页面,再H5中进行操作

使用微信官方文档提供 开放标签进行APP跳转

用于页面中提供一个可跳转指定App的按钮。注意:Android平台通过开放标签跳转App,App必须接入微信OpenSDK,详细参见文档《Android微信OpenSDK接入指南》

补充说明:1、必须真机才能渲染该标签;2、文字链无法拉起该标签

开放对象

此功能仅开放给已认证的服务号,服务号绑定“JS接口安全域名”下的网页可使用此标签跳转满足一定条件的App。在使用该标签之前,首先需要前往微信开放平台管理中心-公众账号或小程序详情-接口信息-网页跳转移动应用-关联设置中绑定所需要跳转的App。详细配置规则参考文档《微信内网页跳转APP功能》

资料列表:

开放标签:developers.weixin.qq.com/doc/offiacc…

签名算法+js接口列表:developers.weixin.qq.com/doc/offiacc…

实现过程

实现思路:

在需要调用JS接口的页面引入如下JS文件:res.wx.qq.com/open/js/jwe… (支持https),或者npm 安装  weixin-js-sdk

页面上放置开放标签,

所有需要使用开放标签的页面必须先注入配置信息,并通过openTagList字段申请所需要的开放标签,否则将无法使用(同一个url仅需调用一次)。开放标签的申请和JS接口的申请相互独立,因此是可以同时申请的。

拿到签名后进行配置注入,在钩子方法中监听对象

注意点:  只能真机调试,且url必须是绑定在公众号中,不能本地调试,不能通过纯文本的方式跳转,只能通过卡片分享,二维码等识别后的方式进行跳转

把对应的链接用二维码工具或者啥转换一下就行。

具体实现:

html结构,因为这个样式不一定生效,建议直接外层包裹一个div,将开放标签定位再ui上,设置为透明,注:开放标签不支持rem,vw等样式属性,宽度可以100%,但是高度必须是真实数值。

<div class="ios_open_action" v-if="isWx">
              打开APP
          <wx-open-launch-app 
            style="position:absolute;top:0;left:0;right:0;bottom:0;width: 100%;"
           appid="你的APPID" extinfo="要传递给app的信息" @error="error" @launch="launch"
            @ready="ready">
            <script type="text/wxtag-template">
              <button id="btnJump" class="btn" style="width:100%;height:45px;opacity:0;">按钮</button>
            </script>
          </wx-open-launch-app>
        </div>
方法实现:

根据官网推荐使用  location.href.split('#')[0]  或者window.loaction.href 获取url链接。

由后端获取id进行加密后,返回加密后的签名字符串等

因为后端接口是异步的,所以需要等待接口返回后再去进行后续注入操作。

   async init() {
      try {
        // 即使路由是 history 模式,即没有 # 号时,也可以返回正常的地址
        // const url =location.href.split('#')[0]
        // 这里也可以对url进行加密后传递,请求后端获取签名的接口,返回小程序ID和签名等信息
        const { publicId, timestamp, nonceStr, signature } = await this.$http.post('xxxxxx', {
          url: location.href.split('#')[0],
          appId: "需要跟config对象中的公众号id一致"
        })
        // 获取到数据之后,将小程序ID等信息配置完整,我这里解构了一层直接获取到了数据,你也可以直接在getSignature方法中解构了返回
        wx.config({
          debug: true, // 开启调试模式,返回值会alert出来,正式需要关闭
          appId: publicId, // 必填,公众号的唯一标识
          timestamp: timestamp, // 必填,生成签名的时间戳,此时间戳必须是后端获取签名时的时间戳。
          nonceStr: nonceStr, // 必填,生成签名的随机串
          signature: signature,// 必填,签名
          jsApiList: [
            "openLocation",//获取的jsapi接口
          ],
          // 必填,需要使用的JS接口列表
          openTagList: [ 'wx-open-launch-app'] // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
        });
      } catch (e) {
        console.log('初始化微信SDK出现异常', e)
        return false
      }
      return new Promise((resolve, reject) => {
        wx.ready(() => {
          console.log('微信环境初始化微信SDK成功')
          resolve(true)
        })
        wx.error((e) => {
          console.log('初始化微信SDK失败', e)
          reject(false)
        })
      })
    },
    launch() {
      console.log("跳转成功");
    },
    ready() {
      console.log("准备就绪");
    },
    error() {
      alert("跳转失败,请前往浏览器打开");
    },

调试模式下,会弹出注入成功提示

9ede7b7844fb39ca3dec7aa78d9d8ad.jpg

到此就完成了这个APP的跳转

efd372141478af988ce6831d1f34c5d.jpg