草庐IT

安卓微信内页面用wx-open-launch-app标签拉起app

玄尘若风 2023-06-16 原文

这里写目录标题

问题描述

公司有一款APP,原本用的是openinstall调用拉起app功能。
ios上(网页、微信、钉钉等拉起app)都正常。
安卓上网页拉起没问题,但是在微信、钉钉内等一些环境中,都是用折中的办法,就是拉起app时,提示点击右上角,在浏览器内打开当前网页,然后在浏览器内打开app。

目前,公司的UI(公司的UI权力比较大,可以提需求)提出,他们在大众点评等app上看到,分享到微信后可以直接拉起app,而不需要打开浏览器。所以要求我们这边也要可以。

总结,就是在安卓的微信内可以直接打开app

解决方案

首先调研一下

  1. 先看微信官方文档
    https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#22

    注意几点:

1.App必须接入微信OpenSDK
2.已认证的服务号(必须要是服务号,而且已认证)
3.服务号中绑定你的app

  1. 然后就可以开发了(入坑的开始)
<wx-open-launch-app
  id="launch-btn"
  appid="your-appid"
  extinfo="your-extinfo"
>
  <script type="text/wxtag-template">
    <style>.btn { padding: 12px }</style>
    <button class="btn">App内查看</button>
  </script>
</wx-open-launch-app>

官方代码一贴,打开网页一看,啥有没有,按钮没出来。(这个问题排查了一天)
这里要注意几点:

1.因为我们公司这边服务号账号是有专门的人管理的,所以绑定账号也是通过远程沟通的,我这边和他再三确认下,发现他绑错账号了,他绑定到了公众号下面。下面重让他绑定了服务号,我让他截屏给我看,确认下(大概没问题)
2.绑定安全域名,后面开发测试要用

这边再打开网页看下,还是没出来。然后面向百度找问题。
发现<wx-open-launch-app>这个标签只有在微信内环境下才能看到,浏览器内是看不到的。
为此,我下载了微信开发者工具


点开公众号网页项目,输入你的线上地址,查看。本地路径是看不到的


如果这个时候,并没有看到按钮出现。排查wx.config是否请求到了wx-open-launch-app标签的权限。


如果这里提示fail,按照对应的类型去排查错误原因。
我这里遇到过两个问题,
1.

这个是地址不对,当前的地址应该用绑定后的线上地址。

2.这里找不到图了。不过提示的是签名错误。signature有问题。这里要排查下wx.config

wx.config({
   debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
   appId: '***********', // 必填,服务号的唯一标识,服务号的appid
   timestamp: res.data.timestamp, // 必填,生成签名的时间戳
   nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
   signature: res.data.signature, // 必填,签名,见附录1
   jsApiList: [
     'updateTimelineShareData', 
     'updateAppMessageShareData',
     'onMenuShareAppMessage',
     'onMenuShareTimeline',
     'onMenuShareQQ',
   ],
   openTagList: ['wx-open-launch-app'],
 });

wx.config内的appid要是服务号的appid。不是公众号的appid。
wx-open-launch-app内的appid就是你的app的appid

最终的代码

最后放上我的最终的代码:

1.父组件

<template>
  <div id="app" class="page">
    <wxOpenApp :extinfoData="extinfoData"></wxOpenApp>
  </div>
</template>

<script>
import wxOpenApp from '@/components/wxOpenApp';

export default {
  components: {
    wxOpenApp,
  },
  data() {
    return {
      extinfoData: '携带的参数',
    };
  },
};
</script>
<style>
html,
body {
  height: 100%;
  overflow: hidden;
  box-sizing: border-box;
}
#app {
  height: 100%;
  overflow-x: hidden;
  overflow-y: auto;
}
</style>

<style lang="less" scoped>
@import './app';
</style>

2.wxOpenApp子组件

<template>
  <div id="openAppBox" class="openAppBox" v-if="isWeixinTag">
    <wx-open-launch-app
      id="launch-btn"
      appid="***************"
      :extinfo="extinfoData"
      @error="handleErrorFn"
      @launch="handleLaunchFn"
      style="width: 100vw"
    >
      <script type="text/wxtag-template">
        <style>.finalbtn {background:#18c984;width:100vw;display: block;height: 30rem;font-size: 0;padding:0;margin:0;border:none;text-align:center;}</style>
        <button class="finalbtn">App内查看</button>
      </script>
    </wx-open-launch-app>
  </div>
</template>

<script>
import {
  isWeixin,
  isIOS
} from '@/utils/appAssist';
import wx from 'weixin-js-sdk';
export default {
  props:{
    extinfoData:{
      type:String,
      default:''
    }
  },
  data() {
    return {
      isWeixinTag:true,
      isIOS:isIOS(),
    };
  },
  created() {
    if (isWeixin()) {
      this.authSDK()
    }
  },
  mounted(){
  },
  methods: {
    // 监听error 函数
    handleErrorFn(e) {
      console.log('跳转失败', JSON.stringify(e))
    },
    // 监听launch 函数
    handleLaunchFn(e) {
      console.log('跳转成功', JSON.stringify(e))
    },
    // 判断是否微信环境
    is_weixn() {
      let ua = navigator.userAgent.toLowerCase()
      if (ua.match(/MicroMessenger/i) == 'micromessenger') {
        return true
      } else {
        return false
      }
    },
    authSDK() {
      var doc = document,
      head = doc.head || doc.getElementsByTagName('head')[0] || doc.documentElement,
      ua = navigator.userAgent,
      wxapi = '//res2.wx.qq.com/open/js/jweixin-1.6.0.js';

      function require(url, onload) {
        var node = doc.createElement('script');
        node.onload = onload;
        node.async = true;
        node.src = url;
        head.appendChild(node);
      }

      if (ua.match(/MicroMessenger\/([\d\.]+)/)) {
        require(wxapi, function () {
          $.getJSON('/finchinaAPP/getJSSignForOpenAPP.action?url=' + encodeURIComponent(location.href), function (res) {
            console.log("res",res)
            wx.config({
              debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
              appId: 'wxf5eb231586ef036c', // 必填,服务号的唯一标识 //prod -> wxf5eb231586ef036c
              timestamp: res.data.timestamp, // 必填,生成签名的时间戳
              nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
              signature: res.data.signature, // 必填,签名,见附录1
              jsApiList: [
                'updateTimelineShareData', 
                'updateAppMessageShareData',
                'onMenuShareAppMessage',
                'onMenuShareTimeline',
                'onMenuShareQQ',
              ],
              openTagList: ['wx-open-launch-app'],
            });
          });
          wx.ready(function () {
            console.log('ready')
            wx.checkJsApi({
              jsApiList: ['wx-open-launch-app'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
              success: function (res) {
                console.log('可用', res);
              },
              fail: (err) => {
                console.log(err, '不可用')
              }
            })
          })
          wx.error(function (err) {
            console.log(err)
          })
        });
      }
    },
    
  },
};
</script>

<style lang="less" scoped>
.openAppBox {
  overflow: hidden;
}
</style>

3.isWeixin与isIOS

/**
 * 是否是微信环境
 */
export const isWeixin = () => {
  let ua = navigator.userAgent.toLowerCase();
  if (ua.match(/MicroMessenger/i) == 'micromessenger') {
    return true;
  } else {
    return false;
  }
};

/**
 * 是否为IOS机型
 */
export const isIOS = () => {
  return !!window.navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
};


最终,这一大片绿色都是可点击的范围。大小控制可以在父级div中控制大小,然后给个
overflow: hidden;
这里我隐藏了文字,用的font-size: 0;
最终要隐藏这一块,用visibility: hidden;
样式改改就行。用官方标准的方式写。
weixin-js-sdk用最新版的,目前是1.6的版本,项目里安装install一下就好。

最终测试

需要通过扫码、或分享的方式打开才有效,链接方式打开不生效。
最简单的就是,通过微信开发工具的右上角预览,用微信扫码测试

还有其他问题的话可以留言评论,大家一起和谐讨论。

有关安卓微信内页面用wx-open-launch-app标签拉起app的更多相关文章

  1. ruby - 在院子里用@param 标签警告 - 2

    我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. css - 用 watir 检查标签类? - 2

    我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

  6. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  7. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

随机推荐