- 2024年微信小程序优化神器:Donut-产品体验分析
写在前面 自古深情留不住,唯有套路得人心! 小程序We分析大家肯定都很熟悉,里边有很多指标,今天只讲其中的两个指标,用户留存率,用户使用时长。要想留住用户,首先需要站在用户的角度去思考,理解他们的痛点和需求。只有深入了解用户的需求,才能为他们提供贴合实际、解决问题的产品和服务。 除非跟用户有很好的互动和良好的反馈(比如开放社区),很多情况我们并不能真正站在用户的角度去考虑,基本是根据以往经验来想象用户的需求。 之前做H5开发,为了统计了解用户的操作情况,都需要自己做一些数据埋点,例如百X统计。这种方式不仅繁琐,且不够直观。 Donut开发平台:产品体验分析 微信Donut开发平台有4大模块:多端框架、安全网关、多端身份登录、产品体验分析。之前对Donut的印象一直停留在前两个模块上面(这里要甩个锅给官方,因为官方一直大力推广这两个模块,看看多端框架和安全网关有多少文章 -.-) 前阵子才发现产品体验分析这个模块,花费5分钟了解,接入功能后3分钟就能看到详细数据分析,感觉相见恨晚。目前这个模块还是公测期间,基本免费使用!不需要一行代码,就能快速发现产品优化的方向! 重点功能推荐 可视化日志 可视化日志可以精准还原用户在小程序内的全部操作过程,就像上帝视角一样。 可视化日志是单个用户完整的一次体验为一条记录,可以通过几十个维度种条件筛选日志。 举个例子:筛选活跃时长小于10S的用户,查看此类用户操作过程来分析用户是对首页功能的不了解还是页面太繁杂找不到自己想要的功能,着重优化首页布局或增加新手引导等设计,优化用户体验时长以及提升留存率! [图片] [图片] 热力图 热力图功能可以非常直观的看到用户高频点击的页面元素和页面滚动的深度,也可以多维度筛选某些条件下的热力图情景,一目了然。 我们可以根据热力详情优化页面的功能、布局等 [图片] 自动生成体验分析报告 用户体验数据有了,自己懒得分析或者刚开始用不知道如何下手,可以看体验分析报告。 体验分析报告会从8个大的维度进行总结分析结果。 例如记录出未访问过的页面,页面最低访问时长 首屏加载速度处于同行业什么水平、什么场景加载速度最慢 用户在什么页面或者什么操作下容易流失 单个页面加载、浏览等数据详情、访问时长分布 重点数据分析: 浏览不足3s的访问、异常事件的出现次数,无效点击的次数 等等等等… [图片] 总结 通过近期对产品体验功能的体验,还是非常推荐这个功能,奇怪的是这么好用的功能平台竟然没有大力推广 不懂技术无所谓,项目所有角色成员基本都能看懂! 目前产品还是在公测中,功能页面可能有一些小BUG,主要功能模块是不影响使用的,目前基本处于免费状态,不需要代码就能体验热力图可视化日志功能,非常赞!希望这个产品继续丰富完善下去。 相关链接 产品体验分析 · 官方文档 功能控制台
08-22 - 无需一行代码,轻松分析微信小程序产品体验
前言 最近一直在优化产品指标,主要围绕提升小程序提升拉新、留存、付费转化率三个方面。主要方法是使用 We 分析数据平台做数据埋点,然后做漏洞分析和事件分析,针对性去调整优化,但是对于我来说数据颗粒度还是不够细(无法复现客户操作路径)和不够灵活(每次都需要植入埋点代码提交审核才能生效)。 最近我发现微信官方出品的 Dount 开发平台,它包含四大模块(多端框架、身份管理、安全网关、产品体验分析),本篇文章重点聊聊我体验过的产品数据分析模块。 它的数据分析拥有极细的颗粒度和超高的灵活度,支持无需一行代码,自动全埋点上报,并且还支持交互回放、热力图、转化分析。 解析来我们就来看下如何使用以及使用效果! 使用 首先从 Dount 官网登录成功后,看到上方有多个模块选择「产品体验分析」模块点击「创建项目」。 [图片] 输入你的项目名称和选择小程序默认配置即可创建 [图片] 创建完成后进入项目详情页可以看到数据总览 [图片] We 分析页面分析数据主要是分析次数/人数,Dount 主要是看页面停留时长。 回放 那么用户停留这么长时间,到底在做啥呢?接下来我们切换到「回放」模块看看 [图片] 这里可以直接查看用户操作回放,同时也支持多种筛选条件,点击右边的操作按钮可以直接播放交互回放。 [图片] 在什么时间点击了那个按钮弹出了什么提示进入了那个页面,每一步操作记录都非常详细。通过回放,还原真实用户在小程序中的操作行为,无论是开发者排查问题还是产品运营人员分析用户交互意图都让其更准确的发现问题。 热力图 以上是从单个用户维度来看整体的交互过程,那么从如何分析单个页面用户交互重点呢?那就需要切换到「热力图」来看看。 以我的群打卡小程序来看,通过页面元素热度可以看到那个功能最受欢迎以及还可以切换到滚动视角热力图,查看各个页面的滚动深度,从而针对性优化。 [图片] 转化分析 多个页面之间的路径分析是分析转化率必不可少的环节,新增分析选择事件类型为路由时间页面跳转,指定一个目标页面即可。 [图片] 以发起打卡活动为例,分析进入应用到创建打卡有多少用户,选择创建打卡页即可 创建成功后可以看到用户流失比例以及查看用户交互回放。 [图片] 事件定义 事件定义可以查看具体功能被点击的次数以及还可以用于转化分析做目标事件。 以发起打卡活动为例,分析创建打卡活动用户有多少添加图片/视频 新增事件:选择页面(创建打卡)-锁定具体元素(添加图片/视频按钮)-命名-保存 [图片] 保存后可以看到近 7 天的点击数据 [图片] 事件定义完成后还可以用于「转化分析」,创建分析选择事件类型为「点击」就可以选择之前定义好的事件了,这样对比分析页面跳转更为精准。 [图片] 总结 Dount 开发平台让我用低成本(无需植入代码)的方式对产品体验(回放、热力图、转化、时间)有了更深入的分析。 我整体使用感觉很棒,并且目前还是 Bate 版本,很期待后续的迭代升级。
2023-06-15 - Taro团队携手云开发搭建电商后台服务
原创: 京东凹凸实验室 本文从Taro及小程序·云开发的简介开始,介绍了如何通过小程序·云开发搭建电商后台服务,最后再深入地阐述购物车页,订单页的小程序·云开发端处理逻辑,由浅入深地剖析了使用小程序·云开发开发电商后台服务的整个过程。 Taro简介 Taro是由凹凸实验室开源、遵循 React 语法规范的多端开发解决方案,截止目前 star 数已经突破16.9k,受到了前端开发者的广泛关注,成为了当前最受欢迎的小程序多端开发框架之一。 Taro 目前已支持微信小程序、H5、RN、支付宝小程序、百度小程序以及字节跳动小程序,持续迭代中的 Taro,也正在努力兼容更多的端,并增加支持一些新特性。 小程序·云开发简介 先看官方文档的说法: 小程序·云开发是微信团队联合腾讯云团队推出的一套小程序开发解决方案。小程序·云开发为开发者提供完整的云端流程,弱化后端和运维概念,开发者无需购买和管理底层计算资源,包括服务器、数据库、静态存储,只需使用平台提供的简易 API 进行核心业务等开发,实现快速上线和迭代,把握业务发展的黄金时期。 其实翻译过来就是,一个在小程序中使用的,不用购买服务器,不用运维的简易后端体系,主要是为了突出快和简便。所以小程序·云开发,就非常适合那些对数据本身弱依赖的,中小型的功能性小程序使用。 小程序·云开发主要有几大部分组成,分别是云控制台、数据库、云函数、云存储。以及分别在小程序端,和云端使用的 js-sdk、admin-sdk。关于这几部分的具体内容,可以在官方文档中查看。 而与传统的电商后端开发相比,小程序·云开发有以下区别: 传统电商后端开发 小程序·云开发 后端代码 自主编写、开发接口 开发接口,云函数部署 服务器 自主购买、部署 无 数据监控 自主搭建 官方提供,控制台查看 调用日志 自主搭建 官方提供,控制台查看 费用 服务器购买成本 无 项目结构 因为该项目使用了小程序·云开发进行后端开发,故项目结构会有些不同。具体结构使用的是 Taro 初始化时提供的云开发模板,大致结构如下: ├── demo 代码目录 | ├── client 小程序代码目录 | ├── … | ├── cloud 小程序·云开发相关代码目录 | ├── functions 云函数相关目录 | ├── shop shop 云函数目录 | ├── index.js 入口函数 | ├── getShop.js getShop.js | ├── package.json | ├── … | ├── project.config.json 小程序配置文件 | ├── tcb.json 小程序·云开发配置文件 └── README.md readme 文件 可以看到目录里主要分了两大块 client和 cloud: client 里和我们平常小程序的开发目录,存放的都是小程序里业务代码。 cloud 里则是放云函数相关的代码,并且是以模板进行分割,每个模块一个云函数。 基于这样的目录结构,小程序·云开发相关的代码与小程序本身的代码进行了有效分隔,极大地方便了项目的管理与开发,同时也有助于云函数的上线部署。 通过小程序通过小程序·云开发搭建电商后台服务 介绍完 Taro 及小程序·云开发,下面便开始讲解如何通过小程序·云开发搭建一个后端服务。 1.后台服务搭建思路 2.数据库建立 3.数据交互 4.【首页】【商详页】后端逻辑处理 5.【购物车】后端逻辑处理 6.【订单页】后端逻辑处理 后台服务搭建思路 首先,我们知道一个最简单的后端程序就是,开启一个 HTTP服务,连接上数据库,然后根据收到的请求进行相关操作,例如数据库的增删查改,返回 HTML,返回接口数据之类,如果要满足外网访问还要部署上线等等。 而用上了小程序·云开发之后,因为云函数这个概念,我们免去了开启服务器和部署的步骤。同时,小程序是天然前后端分离的,也不需要返回HTML。所以在这种情况下,我们所搭建的后台服务最主要为了实现两个部分的内容,分别是数据库的建立和前后端的数据交互。 1.数据库建立 数据库建立,指的是数据集合及一些初始数据的创建。在我们搭建的这个 Demo 里,主要有以下数据集合: [图片] Information - 首页的资讯数据集。主要是以一个资讯为单位的数据集合,一个资讯可能含有商店图片,商店介绍,商品介绍等,主要作导购作用,点击后引导至相关页面。 Shop - 商店页的数据集。以商店为单位,一个商店页面里主要是各种楼层数据。 Commodity - 商品的数据集。显然,一个商品数据自然就是该商品所需要的各种信息。 Cart - 购物车的数据集。以用户为单位存放购物车数据。 Order - 订单的数据集。以用户为单位存放订单数据。 User - 用户信息的数据集。存放用户信息数据。 上面所讲述的 6个数据集,基本就涵盖了一个最简单的电商所需要的各种数据,可以构成一个完整的购物流程。 同时如下图,还可以设置数据集权限。例如将 Information、 Shop、Commodity设置为所有用户可读、仅管理员可写;将 Cart、 Order、 User改成仅创建者及管理员可读写。通过权限限制,增强了数据集的可靠性。 [图片] 2.数据交互 数据集建立起来后,再往里面填充一些假数据,基本的数据就有了,那么在小程序中如何进行数据交互? 如果不是用小程序·云开发,自然是通过request拉取接口数据,进行展示。而在使用了小程序·云开发的情况下,通过官方提供的 sdk,主要有两种办法进行数据拉取: 1.直接在小程序端操作数据库,获取所需数据,并进行增删查改等操作。 2.使用云函数,把数据库的操作放到云端;然后在小程序端调用云函数,达到类似调用接口的效果。 第一种方法其实比较适合一些简单的、对数据要求不高、量也不大的小程序。不然在小程序的代码中混合着数据库操作,实践起来不太优雅,也不利于维护。 这里重点说下第二种方法。上篇文章有提到了云函数的概念,这里再回顾一下。所谓云函数,就是将一个函数放在Node.js(即服务端)环境下运行。因此,我们可以将数据库的操作放到云函数中执行,然后在小程序中调用云函数,达到一种类似调用接口的效果。回顾我们上一章节说到的云函数的目录: ├── demo 代码目录 | ├── cloud 小程序·云开发相关代码目录 | ├── functions 云函数相关目录 | ├── shop shop 云函数目录 | ├── index.js 入口函数 | ├── getShop.js getShop.js | ├── package.json | ├── … | … └── README.md readme 文件 名字叫 shop 的云函数的具体目录在cloud/functions/shop下,可以见到有一个入口文件 index.js,还有其它的子函数。下面看具体代码: [图片] [图片] 在这个例子中,笔者将一个云函数当成一个模块相关函数的入口,根据函数传入的参数来决定调用哪个函数。而被具体调用的函数,执行的是一些数据的操作,然后返回数据。也就是说,在这个 Demo 里一个云函数是一个数据模块的入口,里面引用了许多待被调用的具体函数,视入参而定。 以数据模块为单位分割云函数,是笔者觉得比较好的做法。一来云函数不必分割得太细,毕竟每个云函数都是独立部署的,省去了一些繁琐的操作;二来以数据模块为单位,就有点类似我们传统后端的 MVC 模式,易于开发者无缝接入。当然,这只是其中的一种云函数代码组织方式,并不代表就一定要遵循这样的方式,具体情况具体分析,还是要结合业务的实际情况。 而具体到小程序的调用,就更简单了,只是将请求接口的操作改为调用云函数的操作。比如: [图片] 可以看到,仅仅是将调用 wx.request改为了调用 wx.cloud.callFunction,其它的地方并不需要改变太多。返回的数据也是可以自己定义的,达到了与调用接口相同的效果。 不过云函数有一个缺点,就是每次都要上传部署后才能被小程序端调用,调试起来略显麻烦。一个比较好的调试方法是添加一个测试函数,在本地环境中使用 Node.js 进行测试。 [图片] 2.1【首页】【商详页】后端逻辑处理 经过上一段落的讲解,相信大家对于整个商城后端服务的搭建与处理逻辑已经有了基本了解。下面我们看一下首页和商详页的页面结构。 首页: [图片] 商详页: [图片] 实际上,上一段落中所举例shop云函数,便是处理首页和商详页的后端逻辑。可以看到,其逻辑只是简单的根据id拉取数据并返回,因为整体也并没有过多与用户发生交互的部分,也没有需要后端逻辑处理的部分,总的来说还是比较简单的,在这里便不作过多介绍。 2.2【购物车】后端逻辑处理 购物车页相较于首页和商详页,其逻辑必定是复杂了很多,下面结合页面结构及代码分析一下。 [图片] 上图是商城demo的购物车截图。可以看到在购物车里,小程序·云开发端需要处理的逻辑有商品的选择与反选、商品删除、商品数量的更改、商品型号的更改等等。因此,我们把购物车操作分类,得到如下一个 map: [图片] 然后,在用户执行相应的操作时,我们便会执行到对应的操作函数: [图片] 在这里,每个操作函数的入参都是 oldCartInfo(旧的购物车里的商品)、 skus(需要更改的 skus 数组)。然后返回处理后、最新的 newCartInfo (新的购物车里的商品)。具体的操作函数的逻辑我们便不再阐述了,主要就是对数组进行遍历然后根据相关操作处理数据。 接下来,根据最新 newCartInfo,来得到完整购物车数据,完整的购物车数据结构如下所示: 更新完数据库后,便会返回给前端最新的购物车数据。 总结下来,整个购物车后端逻辑的流程,可以用如下的流程图描述: 如果后续有新的购物车操作需要迭代,或者处理逻辑需要变更,我们也只需要改变小程序·云开发端执行函数 这一部分里面的内容即可。 2.3【订单页】后端逻辑处理 同样的,我们先看一下订单页的结构。 订单详情页: [图片] 订单页这块主要处理的是生成订单的逻辑。每个用户的购物车中,已勾选的商品数据都是存放在数据库中的,所以当用户点击了去结算按钮,触发了结算请求时,后端会直接从用户数据库中的购物车数据,生成一份订单。详细的流程可以用如下的流程图描述: [图片] 下面我们来看具体代码: [图片] 从代码中可以看到,先是遍历当前购物车中的商品,然后把已经勾选的商品存放到 payInfo中。接着根据 payInfo 生成订单数据,同时除移购物车中已被结算的商品,并更新购物车数据库。 整体来说,并没有太复杂的操作,不过需要注意的是,因为存在很多异步的操作,所以会有使用很多 await 命令来进行同步书写。 除了生成订单之外,还有取消订单、删除订单等操作。相较于生成订单,这些就只是读取订单、更改状态而已,便不赘叙。 总结 笔者作为开发者,使用小程序·云开发后,深感其便利性。私以为有以下几点优势: **便捷。**略去了后端部署、运维等步骤,可以快速地构建所需要的后端应用,非常适合灵活轻便的小程序开发。 免费。目前小程序·云开发提供了免费 2GB 的数据库存储和 免费 5 GB 的文件存储,虽然存储量并不是很大,但对于个人开发者来说,这些存储量绰绰有余。 开发简单。小程序·云开发的使用,云函数的开发都是非常简单的,官方提供的API可以让我们便捷地进行操作。只需掌握 JavaScript 和一些异步处理相关的知识,便可以快速上手。 一致性。小程序·云开发是小程序官方推出的一种解决方案,与正常的小程序开发无缝连接,而且不用担心是否会继续维护、升级迭代等的问题。 最后希望这篇文章对于看完的你有所帮助!
2019-04-22 - 云开发支付的代码,有需要的进。
真机测试已通过。你照抄就行,保证可通过。 最新完美版本可供参考: https://developers.weixin.qq.com/community/develop/article/doc/0004c4a50a03107eaa79f03cc56c13 小程序端: wx.cloud.callFunction({ name: 'getPay' , data: { total_fee: parseFloat(0.01).toFixed(2) * 100, attach: 'anything', body: 'whatever' } }) .then( res => { wx.requestPayment({ appId: res.result.appid, timeStamp: res.result.timeStamp, nonceStr: res.result.nonce_str, package: 'prepay_id=' + res.result.prepay_id, signType: 'MD5', paySign: res.result.paySign, success: res => { console.log(res) } }) }) 云函数:getPay getPay目录下共两个文件: 1、index.js 2、package.json index.js代码如下: const key = "YOURKEY1234YOURKEY1234YOURKEY123"//这是商户的key,不是小程序的密钥,32位。 const mch_id = "1413090000" //你的商户号 //将以上的两个参数换成你的,然后以下可以不用改一个字照抄 const rp = require('request-promise') const crypto = require('crypto') function paysign({ ...args }) { let sa = [] for (let k in args) sa.push( k + '=' + args[k]) sa.push( 'key=' + key) return crypto.createHash('md5').update(sa.join('&'), 'utf8').digest('hex').toUpperCase() } exports.main = async (event, context) => { const appid = event.userInfo.appId const openid = event.userInfo.openId const attach = event.attach const body = event.body const total_fee = event.total_fee const notify_url = "https://whatever.com/notify" const spbill_create_ip = "118.89.40.200" const nonce_str = Math.random().toString(36).substr(2, 15) const timeStamp = parseInt(Date.now() / 1000) + '' const out_trade_no = "otn" + nonce_str + timeStamp let formData = "<xml>" formData += "<appid>" + appid + "</appid>" formData += "<attach>" + attach + "</attach>" formData += "<body>" + body + "</body>" formData += "<mch_id>" + mch_id + "</mch_id>" formData += "<nonce_str>" + nonce_str + "</nonce_str>" formData += "<notify_url>" + notify_url + "</notify_url>" formData += "<openid>" + openid + "</openid>" formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>" formData += "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" formData += "<total_fee>" + total_fee + "</total_fee>" formData += "<trade_type>JSAPI</trade_type>" formData += "<sign>" + paysign({ appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type: 'JSAPI' }) + "</sign>" formData += "</xml>" let res = await rp({ url: "https://api.mch.weixin.qq.com/pay/unifiedorder", method: 'POST',body: formData}) let xml = res.toString("utf-8") if (xml.indexOf('prepay_id')<0) return xml let prepay_id = xml.split("<prepay_id>")[1].split("</prepay_id>")[0].split('[')[2].split(']')[0] let paySign = paysign({ appId: appid, nonceStr: nonce_str, package: ('prepay_id=' + prepay_id), signType: 'MD5', timeStamp: timeStamp }) return { appid, nonce_str, timeStamp, prepay_id, paySign } } package.json 代码如下: { "name": "getPay", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "youself", "license": "ISC", "dependencies": { "crypto": "^1.0.1", "request-promise": "^4.2.2" } } 最后选择:上传和部署:云端安装依赖。
2019-12-14 - 云开发,你想知道的都在这
对小程序有关注开发者,应该都会记得,在去年开发者工具推出 1.0 版本的时候,和腾讯云一起同步推出了一个云的解决方案,通过授权的方式可以便捷的进行小程序的服务端开发。经过一年的实践和思考,我们觉得小程序的云服务,我们可以做的更进一步,云能力应该是小程序的 基础能力,和 API、组件一样,是每个小程序都所拥有的,所以有了现在的 小程序·云开发 。一言概之:基础能力用或者不用,小程序云服务都在那里,不多不少。 云开发正式开放的这几天,从我们的数据来看,有非常非常多的开发者都参与了进来,在社区上也收到了大家发来的许多疑问、吐槽。我们整理了下,大约有以下几类 开通的问题1. 工具中没有云服务图标或新建项目的时候没有云开发 QuickStart 选项 原因可能是: 工具版本旧:点此 下载最新版工具 使用了 测试号 或游客模式:使用其他 AppID 2. 开通时候云控制台报错的问题 在开放云开发的时候没有想到大家这么热情,资源一时准备不足导致开通失败,现已恢复正常,大家重试就好。另外还有少部分一些历史帐号的问题,也基本已经解决。 3. 调试器中报错提示 fail invalid scope 这个报错是因为云服务尚未开通,需要先在工具栏上点击左侧的 “云开发” 按钮开通云服务 数据库的问题1. 导入数据失败或一直处于等待状态 之前导入有 bug 可能会造成一些失败,现已修复,可重试;还有大部分问题是导入的数据格式的不对,可以参见文档中 数据库导入 的部分,另外我们会尽快的加上数据格式的前端校验。 2. 控制台数据库报错 /wx/database?action=creatFreeDb 请求失败: 100008, Db Resource Amount Over Limit 问题已解决,重试即可 3. 云开发数据库操作失败报错 Database Authorization Not Found:l5 get route fail: not found 问题已解决,重试即可 存储管理的问题上传文件后无法下载或引用 和上面提到的开通失败的原因是一样的,CDN 资源一时准备不足,现已恢复正常,大家重试即可 配额使用的问题大家如果对资源的配额有相关疑问可以查看 文档 中关于配额的说明,对于其中一些概念也在最下方的脚注做了更详细的解释。目前提供的资源配额是基础版的配额,如果需要提升上限,可以按文档中的说明(在配额文档的表格下方)发邮件到相应邮箱申请。 QuickStart 的问题1. 小游戏云开发 QuickStart 云函数 [代码]uploadScore[代码] 报错提示找不到 [代码]wx-server-sdk[代码] 需要打开终端进入到云函数 [代码]uploadScore[代码] 的目录执行命令 [代码]npm install[代码] 安装 Node.js 依赖并上传,注意需先安装好 [代码]Node.js[代码],并保证 [代码]node[代码] 和 [代码]npm[代码] 在环境变量中 2. 调试器报错提示 fail invalid scope 在上面的云服务开通中也提到了,需要先开通云服务 其他问题1. 使用云开发是否不能使用其他云服务 不是的,云开发作为基础能力,同开发者现有的服务端能力是不冲突的,可以一起去使用。 2. 小游戏是否可以使用云开发 可以的 3. 如何快捷的调用微信的开放接口,比如发送模板消息、微信支付等等 相关功能我们已经在开发中,会尽快给到大家 4. 如何在小程序插件中使用云开发 插件相关功能和需求包括小程序插件是否有插件自己的云开发,插件是否可以调用寄主的云开发能力等等正在规划和开发中,会尽快给到大家 5. 配额套餐的问题 前面也提到我们有提供一套基础版的套餐,它的配额可以满足大部分基础小程序的需求,我们也会尽快推出更高阶的方案,满足不同的小程序开发者。 6. 云开发管理端 API 开放的问题 获取管理端统计数据、管理数据库等等管理端的 API 会尽快支持上
2018-09-13 - 小程序如何打开微信浏览器,已有例子
小程序:城市服务,中点击宜停车和深圳智慧租房会跳转到微信浏览器,请问使用哪个API调起浏览器?
2018-08-15