基础库

基础库更新

为了避免新版本的基础库给线上微信小程序带来未知的影响,微信客户端都是携带 上一个稳定版 的基础库发布的。

在新版本客户端发布后,再通过后台灰度新版本基础库,灰度时长一般为 12 ~ 24 小时,在灰度结束后,用户设备上才会有新版本的基础库。

以微信 6.5.8 为例,客户端在发布时携带的是 1.1.1 基础库(6.5.7 上已全量的稳定版)发布,在 6.5.8 发布后,我们再通过后台灰度 1.2.0 基础库。

查看基础库版本分布

基础库与客户端之间的关系

微信小程序的能力需要微信客户端来支撑,每一个基础库都只能在对应的客户端版本上运行,高版本的基础库无法兼容低版本的微信客户端。通常:

  • 第 1(major)、2(minor)位版本号更新通常需要依赖新版本的客户端,如:基础库 v2.1.3 运行在 v6.6.7 客户端,基础库 v2.2.0 需要 v6.7.0 客户端。
  • 第 3(patch) 位版本号的更新一般不需要依赖客户端更新,如:基础库v2.1.0 ~ v2.1.3 都运行在 v6.6.7 客户端,新版本发布会覆盖旧版本。

关于基础库的兼容方法,可以查看「兼容处理」章节。

命令注入

命令注入漏洞是指 Web 应用没有对用户可控的参数进行有效过滤,攻击者可以构造恶意参数拼接到命令中,从而执行任意命令。

开发建议:

  • 对用户输入的数据(如 ;、|、&等)进行过滤或转义。

SQL 注入

SQL 注入是指 Web 程序代码中对于用户提交的参数没有进行有效过滤,就直接拼接到 SQL 语句中执行,导致参数中的特殊字符打破了 SQL 语句原有的逻辑,黑客可以利用这个漏洞执行任意的 SQL 语句。

开发建议:

  1. 使用数据库提供的参数化查询来进行数据库操作,不允许直接通过拼接字符串的方式来合成 SQL 语句。
  2. 如果存在部分情况需要通过拼接的方式来合成 SQL,拼接的变量必须要经过处理:
    • 对于整数,需要判断变量是否为整数类型。
    • 对于字符串,需要对单引号、双引号等做转义处理。
  3. 避免 Web 应用显示 SQL 的报错信息。
  4. 保证 Web 应用里每一数据层的编码统一。

微信小程序

信息泄露

敏感信息是指一旦泄露,可能会给开发者的业务、合作伙伴和用户带来利益损害的数据,包括但不限于账号 Appsecret、特权账号信息、后台加密密钥、登录账户密码、用户身份证号、手机号、银行卡号等

开发建议:

  1. 敏感信息不应以明文、注释、可逆的编码方式(如 base64)、不安全散列函数(如 MD5、 SHA1)等形式出现在微信小程序文件内。
  2. 部分敏感信息如用户的银行卡号、手机号等需要用于展示的,需要进行脱敏处理。常用脱敏规范如下:
敏感信息类型 展示样例
姓名
名字只有两个字,对第一个字打码,如:*三。 多于两个字,只保留第一个和最后一个,其余都打码,如:王*四、欧**五
身份证
只显示第一位和最后一位,如:3*******************1
手机号
除去手机国际码后,手机号位数不少于10位时,只显示前三位和最后两位,如:156******77。手机号位数少于10位时,只显示前两位和后两位,如:12*****89。国家码可以完全显示。
银行卡
只显示最后4位,如:************1234
  1. 如果微信小程序存在敏感信息泄露的问题,微信开放平台将有可能下架该微信小程序,并暂停该微信小程序的相关服务。

授权用户信息变更

  1. 授权用户资料变更:当部分用户的资料存在风险时,平台会对用户资料进行清理,并通过消息推送服务器通知最近30天授权过的微信小程序开发者,我们建议开发者留意响应该事件,及时主动更新或清理用户的头像及昵称,降低风险。
  2. 授权用户资料撤回:当用户撤回授权信息时,平台会通过消息推送服务器通知给微信小程序开发者,请开发者注意及时删除用户信息。
  3. 授权用户完成注销:当授权用户完成注销后,平台会通过消息推送服务器通知给微信小程序开发者,请依法依规及时履行相应个人信息保护义务,保护用户权益。

点击查看消息推送服务器配置

事件推送示例:

XML
<xml>
    <ToUserName><![CDATA[gh_870882ca4b1]]></ToUserName>
    <FromUserName><![CDATA[owAqB1v0ahK_Xlc7GshIDdf2yf7E]]></FromUserName>
    <CreateTime>1626857200</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[user_authorization_revoke]]></Event>
    <OpenID><![CDATA[owAqB1nqaOYYWl0Ng484G2z5NIwU]]></OpenID>
    <AppID><![CDATA[wx13974bf780d3dc89]]></AppID>
    <RevokeInfo><![CDATA[1]]></RevokeInfo>
    <PluginID><![CDATA[wx13974bf780d3dc89]]></PluginID>
    < OpenPID><![CDATA[G7esq5NVzP76HIHoB95t4CVBP6to]]></OpenPID>
</xml>

JSON
{
  "ToUserName": "gh_870882ca4b1",
  "FromUserName": "oaKk346BaWE-eIn4oSRWbaM9vR7s",
  "CreateTime": 1627359464,
  "MsgType": "event",
  "Event": "user_authorization_revoke",
  "OpenID": "oaKk343WOktAaT2ygsX138BGblrg",
  "AppID": "wx13974bf780d3dc89",
  "RevokeInfo": "1",
  "PluginID": "wx13974bf780d3dc89",
  "OpenPID": " G7esq5NVzP76HIHoB95t4CVBP6to"
}

事件字段定义

属性 类型 说明
ToUserName string 微信小程序的UserName
FromUserName string 平台推送服务UserName
MsgType string 默认为:Event
Event string user_info_modified:用户资料变更,user_authorization_revoke:用户撤回,user_authorization_cancellation:用户完成注销;
CreateTime number 发送时间
OpenID string 授权用户OpenID
UnionID string 授权用户UnionID
AppID string 微信小程序的AppID
RevokeInfo string 用户撤回的授权信息,1:车牌号,2:地址,3:发票信息,4:蓝牙,5:麦克风,6:昵称和头像,7:摄像头,8:手机号,12:微信运动步数,13:位置信息,14:选中的图片或视频,15:选中的文件,16:邮箱地址,18:选择的位置信息,19:昵称输入键盘中选择的微信昵称,20:获取用户头像组件中选择的微信头像
PluginID string 插件场景用户撤回,插件的AppID
OpenPID string 插件场景用户撤回,撤回用户的OpenPID

微信小程序违规处罚信息通知

当微信小程序存在违规行为时,平台会通过消息推送服务器通知给微信小程序开发者,建议微信小程序开发者注意及时接收相关通知进行排查整改,此通知不影响已有的站内信等通知方式。 点击查看消息推送服务器配置

1. 事件字段定义

  1. 字段【Event】等于”wxa_punish_event”时,则表示这是一条关于【微信小程序违规处罚事件】的通知。
属性 类型 说明
Event string 事件名称:wxa_punish_event,即微信小程序违规处罚信息
event_type number 事件类型。1:警告;2:功能封禁;3:下架;4:账号封禁;10:页面封禁。
punish_id string 违规处罚ID,用于唯一标识每次违规
appid string 被处罚微信小程序的AppID
punish_time number 违规时间(UNIX时间戳)
illegal_reason string 违规原因
illegal_content string 违规内容
rule_name string 违反规则名称
rule_url string 违反规则链接
adjust_guide_url string 违规申诉及整改指引链接
detail string 违规处罚详情,字段内容为JSON字符串,JSON具体结构取决于event_type,请参照下方说明对该字段中包含的JSON字符串进行正确的解析
1.2违规处罚事件详情(detail详细释义)
  • event_type=1detail中的JSON字符串结构如下:
属性 类型 说明
warned_type number 警告类型。1:警告账号封禁;2:警告功能封禁;3:警告下架。
rectify_deadline number 警告的截止时间(UNIX时间戳)
warned_function_names array 警告要封禁的功能项列表,如需获取列表中每个功能项的封禁时长,可直接在warned_ban_days的对应索引处获得,warned_function_names和warned_ban_days总是一一对应。(该字段仅当warned_type=2时生效)
warned_ban_days array 警告封禁的天数列表。当warned_type=1时则该列表仅有一项,代表警告要封禁微信小程序账号的天数。当warned_type=2时列表中的每一项分别代表warned_function_names中对应索引处的功能项被警告要封禁的天数。当warned_type=3时则该列表仅有一项,代表警告要下架微信小程序的天数。注:0代表永久封禁
  • event_type=2detail中的JSON字符串结构如下:
属性 类型 说明
banned_days array 功能项被封禁的天数列表,列表中的每一项分别代表banned_function_names中对应索引处的功能项被封禁的天数。注:0代表永久封禁
banned_function_names array 被封禁的功能项列表,如需获取列表中每个功能项的封禁时长,可直接在banned_days的对应索引处获得,banned_days和banned_function_names总是一一对应。
  • event_type=3detail中的JSON字符串结构如下:
属性 类型 说明
suspended_days number 下架天数。注:0代表永久下架
  • event_type=4detail中的JSON字符串结构如下:

banned_days number 微信小程序账号封禁天数。注意:0代表永久封禁

  • event_type=5时,detail中的JSON字符串结构如下:
属性 类型 说明
path string 微信小程序中被封禁的页面路径

2. 事件推送参数示例

  • event_type=1
  • warned_type=1
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4i5LqBbWLVTfnhf-3TZ4BNk",
    "CreateTime": 1699803867,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "649557",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699803865,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "违规内容测试"
    ],
    "detail": "{\"warned_type\":1,\"rectify_deadline\":1699796571,\"warned_function_names\":[],\"warned_ban_days\":[3]}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 1
}
  • warned_type=2
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4pIdqHZwh80SufyUuIzSenw",
    "CreateTime": 1699795665,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "649551",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699795663,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "违规内容测试"
    ],
    "detail": "{\"warned_type\":2,\"rectify_deadline\":1699796571,\"warned_function_names\":[\"分享朋友圈\",\"客服消息接口\"],\"warned_ban_days\":[1,1]}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 1
}
  • warned_type=3
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4tGxCvPcXlKeFI5tU0jV_yw",
    "CreateTime": 1699795665,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "649551",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699795663,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "违规内容测试"
    ],
    "detail": "{\"warned_type\":3,\"rectify_deadline\":1699796571,\"warned_function_names\":[],\"warned_ban_days\":[1]}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 1
}
  • event_type=2
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4gSrT2S8jG2Ll1ZS16rwqQk",
    "CreateTime": 1699791600,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "13577492",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699791599,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "违规内容测试"
    ],
    "detail": "{\"banned_days\":[1,1],\"banned_function_names\":[\"分享朋友圈\",\"客服消息接口\"]}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 2
}
  • event_type=3
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4qHkaYV-0NYupPZBTBrBNuw",
    "CreateTime": 1699801563,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "13577869",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699801560,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "违规内容测试"
    ],
    "detail": "{\"suspended_days\":1}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 3
}
  • event_type=4
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4jjAdCWq1klrk-puPMe0FC4",
    "CreateTime": 1699784111,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "9328325",
    "appid": "wx54a8eaa26606test",
    "punish_time": 1699784109,
    "illegal_reason": "存在诱导分享行为",
    "illegal_content": [
        "测试违规内容/证据"
    ],
    "detail": "{\"banned_days\":3}",
    "rule_url": "/miniprogram/product/index.html#_5-1-滥用分享行为",
    "rule_name": "《微信小程序平台运营规范》5.行为规范-5.1滥用分享行为",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 4
}
  • event_type=10
{
    "ToUserName": "gh_1d6c1222test",
    "FromUserName": "oyeHc4n0I6U3A4Fq7tfOAqmAJy8E",
    "CreateTime": 1699802583,
    "MsgType": "event",
    "Event": "wxa_punish_event",
    "punish_id": "94185814",
    "appid": "wx54a8eaa266009d6a",
    "punish_time": 1699802425,
    "illegal_reason": "发布低俗、性暗示或色情信息",
    "illegal_content": [
        "测试证据"
    ],
    "detail": "{\"path\":\"pages/fengjin/fengjin\"}",
    "rule_url": "/miniprogram/product/index.html#_6-2-色情低俗内容",
    "rule_name": "《微信小程序平台运营规范》6.信息内容规范-6.2色情低俗内容",
    "adjust_guide_url": "https://mp.weixin.qq.com/s/73rLZmwPeQ87Q89DYQcfkw",
    "event_type": 10
}

安卓微信小程序硬件框架发布

说明

  • 仅支持 32/64 位安卓 ARM 设备。
  • 动态库有更新:此版本有新增和修改 so 文件,若 WMPF 是预装到系统内的,安装后还需要更新和替换系统路径下的 so 文件,否则启动会有 crash 问题。如对替换方式有疑问请联系设备厂商处理。
  • v2.1.0 版本开始,不支持使用 ActivateDeviceByIoT 方式激活的设备。

产物

  • Service Apk 是安卓 WMPF 的服务端,在 WMPF Cli 调用 WMPF 能力之前,需要安装到安卓设备上并保持运行。
    • 文件名带有 alpha 字样是开发版本,带有 WMPF 的测试界面(仅供点击唤醒 WMPF 进程所用,无调试入口)。
    • 文件名带有 production 字样是正式版本,没有操作界面,仅供正式上线后使用(系统把应用保活即可)。
  • 形如 wmpf-cli-*.aar 的文件是 WMPF cli 的 aar 文件,需要下载后集成在开发者自己的应用中,用来调用 WMPF 的能力。

开始

xr-frame是一套微信小程序官方提供的XR/3D应用解决方案,基于混合方案实现,性能逼近原生、效果好、易用、强扩展、渐进式、遵循微信小程序开发标准。

在这一章中,我们将会带大家从头开始,用它构建一个XR微信小程序

本文只是开始指南,更加详细的信息请见组件框架文档API文档

xr-frame在基础库v2.32.0开始基本稳定,发布为正式版,但仍有一些功能还在开发,请见限制和展望。

微信小程序码

很多场景下用户会通过扫码快速进入一个微信小程序,在微信小程序设计的初期,微信小程序平台提供的二维码的形式。我们发现用户在扫一个二维码时,他并不知道当前这次扫码会出现什么样的服务,因为二维码的背后有可能是公众号、微信小程序、网页服务、支付页面、添加好友等不同的服务。为了让用户在扫码之前就有一个明确的预期,因此微信设计了微信小程序码,如图5-3所示。

img
                                                           图5-3  “微信小程序数据助手”的微信小程序码

微信小程序码在样式上更具辨识度和视觉冲击力,相对于二维码来说,微信小程序主题的品牌形象更加清晰明显,可以帮助开发者更好地推广微信小程序。在发布微信小程序之后,微信小程序管理平台会提供对应的微信小程序码的预览和下载,开发者可以自行下载用于线上和线下的微信小程序服务推广。

发布

审核通过之后,管理员的微信中会收到微信小程序通过审核的通知,此时登录 微信小程序管理后台 – 版本管理 – 审核版本中可以看到通过审核的版本。

点击发布后,即可发布微信小程序。微信小程序提供了两种发布模式:全量发布和分阶段发布。全量发布是指当点击发布之后,所有用户访问微信小程序时都会使用当前最新的发布版本。分阶段发布是指分不同时间段来控制部分用户使用最新的发布版本,分阶段发布我们也称为灰度发布。一般来说,普通微信小程序发布时采用全量发布即可,当微信小程序承载的功能越来越多,使用的用户数越来越多时,采用分阶段发布是一个非常好的控制风险的办法。

提交审核

为了保证微信小程序的质量,以及符合相关的规范,微信小程序的发布是需要经过审核的。

在开发者工具中上传了微信小程序代码之后,登录 微信小程序管理后台 – 版本管理 – 开发版本 找到提交上传的版本。

在开发版本的列表中,点击 提交审核 按照页面提示,填写相关的信息,即可以将微信小程序提交审核。

需要注意的是,请开发者严格测试了版本之后,再提交审核, 过多的审核不通过,可能会影响后续的时间。

上传代码

与预览不同,上传代码是用于提交体验或审核使用的。

点击开发者工具顶部操作栏的上传按钮,填写版本号以及项目备注。需要注意的是,这里的版本号以及项目备注是为了方便管理员检查版本使用的,开发者可以根据自己的实际要求来填写这两个字段。

上传成功之后,登录微信小程序管理后台 – 版本管理 – 开发版本,就可以找到刚提交上传的版本了。

可以将这个版本设置为体验版,或者提交审核。