微信小程序开发文档 第68页

小程序订阅消息 功能介绍 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面 使用说明 步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID:登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。 步骤二:获取下发权限 详见小程序端消息订阅接口 wx.requestSubscribeMessage 步骤三:调用接口下发订阅消息 详见服务端消息发送接口 subscribeMessage.send

收藏 安卓 7.0.15 版本起支持,iOS 暂不支持 小程序菜单增加收藏功能,可收藏某个页面至收藏夹。点开小程序右上角胶囊,点击收藏按钮会触发 Page.onAddToFavorites 事件。

生物认证 小程序通过 SOTER 提供以下生物认证方式。 目前暂时只支持指纹识别认证。设备支持的生物认证方式可使用 wx.checkIsSupportSoterAuthentication 查询 调用流程 流程步骤说明 调用 wx.startSoterAuthentication,获取 resultJSON 和 resultJSONSignature (可选)签名校验。此处 resultJSONSignature 使用 SHA256withRSA/PSS 作为签名算法进行验签。此公式数学定义如下: bool 验签结果=verify(用于签名的原串,签名串,验证签名的公钥) 微信提供后台接口用于可信的密钥验签服务,微信将保证该接口返回的验签结果的正确性与可靠性,并且对于 Android root 情况下该接口具有上述特征(将返回是否保证root情况安全性)。 接口地址: POST http://api.weixin.qq.com/cgi-bin/soter/verify_signature?access_token=%access_token post 数据内容(JSON 编码): {"openid":"$openid", "json_string" : "$resultJSON", "json_signature" : "$resultJSONSignature" } 请求返回数据内容(JSON 编码): // 验证成功返回 {"is_ok":true} // 验证失败返回 {"is_ok":false} // 接口调用失败 {"errcode":"xxx,"errmsg":"xxxxx"}

UnionID 机制说明 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。 UnionID获取途径 绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID。 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。 微信开放平台绑定小程序流程 登录微信开放平台 — 管理中心 — 小程序 — 绑定小程序

小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。 登录流程时序 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。 注意: 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 临时登录凭证 code 只能使用一次

Wi-Fi 在小程序中支持搜索周边的 Wi-Fi,同时可以针对指定 Wi-Fi,传入密码发起连接。 该系列接口为系统原生能力,如需查看「微信连Wi-Fi」能力及配置跳转小程序,请参考文档。 连接指定 Wi-Fi 接口调用时序: Android:startWifi —> connectWifi —> onWifiConnected iOS(仅iOS 11及以上版本支持):startWifi —> connectWifi —> onWifiConnected 连周边 Wi-Fi 接口调用时序: Android:startWifi —> getWifiList —> onGetWifiList —> connectWifi —> onWifiConnected iOS(iOS 11.0及11.1版本因系统原因暂不支持):startWifi —> getWifiList —> onGetWifiList —> setWifiList —> onWifiConnected 注意: Wi-Fi 相关接口暂不可用 wx.canIUse 接口判断。 Android 6.0 以上版本,在没有打开定位开关的时候会导致设备不能正常获取周边的 Wi-Fi 信息。

NFC 支持 HCE(基于主机的卡模拟)模式,即将安卓手机模拟成实体智能卡。 支持 NFC 读写,即手机作为读卡器使用。 适用机型:支持 NFC 功能,且系统版本为 Android 5.0 及以上的手机 适用卡范围:符合ISO 14443-4 标准的 CPU 卡 支持 Reader/Writer(读取器/写入器)模式,即支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。 适用机型:支持 NFC 功能,且系统版本为 Android 5.0 及以上的手机 适用范围:支持NFC-A (ISO 14443-3A)/NFC-B (ISO 14443-3B)/NFC-F (JIS 6319-4)/NFC-V (ISO 15693)/ISO-DEP (ISO 14443-4)标准的读写(部分Android手机)支持MIFARE Classic/MIFARE Ultralight标签的读写支持对NDEF格式的NFC标签上的NDEF数据的读写 基本流程 以往NFC-A卡片写入apdu指令为例 调用wx.getNFCAdapter()获取NFC适配器实例 调用NFCAdapter.onDiscovered(function callback)注册贴卡监听回调 调用NFCAdapter.startDiscovery(Object object)开始监听贴卡 贴卡,onDiscovered回调根据onDiscovered回调res对象的techs字段匹配到卡片支持NFC-A标准通过NFCAdapter.getNfcA()获取NfcA实例 使用NfcA实例进行读写调用NfcA.connect()和NFC卡片建立连接调用NfcA.transceive(Object object)往NFC卡片写入apdu指令并接收卡片返回数据读写完毕,调用NfcA.close()断开连接 调用NFCAdapter.stopDiscovery(Object object)结束监听贴卡

蓝牙 iOS 微信客户端 6.5.6 版本开始支持,Android 6.5.7 版本开始支持 蓝牙适配器模块生效周期为调用 wx.openBluetoothAdapter 至调用 wx.closeBluetoothAdapter 或小程序被销毁为止。 在小程序蓝牙适配器模块生效期间,开发者才能够正常调用蓝牙相关的小程序 API,并收到蓝牙模块相关的事件回调。 注意 由于系统限制,Android 上获取到的 deviceId 为设备 MAC 地址,iOS 上则为设备 uuid。因此 deviceId 不能硬编码到代码中。 目前不支持在开发者工具上进行蓝牙功能的调试,需要使用真机才能正常调用小程序蓝牙接口。 低功耗蓝牙(BLE)注意事项 iOS 上对特征值的 read、write、notify操作,由于系统需要获取特征值实例,传入的 serviceId 与 characteristicId 必须由 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 中获取到后才能使用。建议双平台统一在建立连接后先执行 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 后再进行与蓝牙设备的数据交互。

大屏适配指南 目前市面上的用户设备大致可分为小屏的手机端、中屏的平板、大屏的 PC 端三类,而在这三类设备中又会有细小的尺寸差别,也称作屏幕碎片化。 随着小程序能够在越来越多的设备终端上运行,开发者也应该针对不同的屏幕尺寸进行相应的适配。 按照一般的适配原则,结合小程序特点,通常在以下三种情况中需要进行适配: 1. 同一类设备下,尺寸有细微差别 使用小程序提供的 rpx 单位,在尺寸差别不大的情况下对页面布局进行等比缩放。 2. 在允许屏幕旋转的情况下,可分为横屏与竖屏 手机端设置 “pageOrientation”: “auto” 或 iPad 上设置 “resizable”: true 时会允许屏幕旋转,此时使用 Page 的 onResize 事件或者 wx.onWindowResize 方法可对该操作进行监听,进而判断是使用横屏还是竖屏布局。 3. 不同类设备或者能够自由拖拽窗口的 PC 小程序 小程序目前是基于 Webview 实现,利用CSS 媒体查询可实时监听屏幕尺寸大小,在不同的屏幕下展现不同的 UI 布局,结合Flex 弹性布局、Grid 网格布局便能实现更加响应式的适配方案。 matchMedia – 抽象式媒体查询 小程序基础库基于 window.matchMedia API 新增了一组过程式与定义式接口 match-media 。开发者可以通过 <match-media></match-media> 和 wx.createMediaQueryObserver 来显式地使用媒体查询能力,对于多端适配来说,它有以下优势: 开发者能够更方便、显式地使用 Media Query 能力,而不是耦合在 CSS 文件中,难以复用。 能够在 WXML 中结合数据绑定动态地使用,不仅能做到组件的显示或隐藏,在过程式 API 中可塑性更高,例如能够根据尺寸变化动态地添加 class 类名,改变样式。 能够嵌套式地使用 Media Query 组件,即能够满足局部组件布局样式的改变。 组件化之后,封装性更强,能够隔离样式、模版以及绑定在模版上的交互事件,还能够提供更高的可复用性。 浏览器内置 API ,能够在所有基于 Webview 的小程序上使用,兼容性良好。 match-media 具体使用方法可参考相关 API 文档。 4. 自适应布局 为了让开发者更好的自适应大屏,小程序提供了 row/col 组件 供开发者使用。 自适应的主要特性是: 整行最多只有 24 份,对于的排列会自动向下换行 每个尺寸设置并不会影响到其它尺寸的布局 设计指引与代码示例 关于如何在设计、用户体验上实现更好的多端适配小程序。 同时我们也提供了多端适配示例小程序 ,基于 row/col 组件 简单实现了常见的适配场景,例如: 屏幕越大,布局不变,模块左右伸缩 屏幕越大,内容越多,模块内容换行排列 屏幕越大,布局改变,模块内容可折叠 / 展现 体验路径:“扩展能力” -> “多端适配(需在PC端体验)”

自定义 tabBar 基础库 2.5.0 开始支持,低版本需做兼容处理。 自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式,以满足更多个性化的场景。 在自定义 tabBar 模式下 为了保证低版本兼容以及区分哪些页面是 tab 页,tabBar 的相关配置项需完整声明,但这些字段不会作用于自定义 tabBar 的渲染。 此时需要开发者提供一个自定义组件来渲染 tabBar,所有 tabBar 的样式都由该自定义组件渲染。推荐用 fixed 在底部的 cover-view + cover-image 组件渲染样式,以保证 tabBar 层级相对较高。 与 tabBar 样式相关的接口,如 wx.setTabBarItem 等将失效。 每个 tab 页下的自定义 tabBar 组件实例是不同的,可通过自定义组件下的 getTabBar 接口,获取当前页面的自定义 tabBar 组件实例。 注意:如需实现 tab 选中态,要在当前页面下,通过 getTabBar 接口获取组件实例,并调用 setData 更新选中态。可参考底部的代码示例。 使用流程 1. 配置信息 在 app.json 中的 tabBar 项指定 custom 字段,同时其余 tabBar 相关配置也补充完整。 所有 tab 页的 json 里需声明 usingComponents 项,也可以在 app.json 全局开启。 示例: { "tabBar": { "custom": true, "color": "#000000", "selectedColor": "#000000", "backgroundColor": "#000000", "list": [{ "pagePath": "page/component/index", "text": "组件" }, { "pagePath": "page/API/index", "text": "接口" }] }, "usingComponents": {} } 2. 添加 tabBar 代码文件 在代码根目录下添加入口文件: custom-tab-bar/index.js custom-tab-bar/index.json custom-tab-bar/index.wxml custom-tab-bar/index.wxss 3. 编写 tabBar 代码 用自定义组件的方式编写即可,该自定义组件完全接管 tabBar 的渲染。另外,自定义组件新增 getTabBar 接口,可获取当前页面下的自定义 tabBar 组件实例。