要从短信或浏览器打开小程序,官方提供的路径之一是 URL Scheme。2026年11月14日(北京时间)核读的微信开放文档《获取 URL Scheme》页标「最后一次编辑于 2026-06-16」,写明加密 URL Scheme 适用于从短信、邮件、微信外网页等场景打开小程序;并写 iOS 系统支持识别 URL Scheme,可在短信等场景中直接跳转,而 Android 系统不支持直接识别,用户无法通过 Scheme 正常打开小程序,需要使用 H5 页面中转。同日核读的《获取加密scheme码》页标为 2026-07-13,《查询scheme码》页标为 2025-12-18。这三页在有效期和打开次数上限上的表述并不完全相同,下面按页分别转述,不擅自取一个数字。本文未调用接口、未做真机跳转实测,不写成生成教程。

《获取 URL Scheme》把 URL Scheme 分成明文和加密两种。明文 URL Scheme 不需要调用平台接口,在公众平台完成「明文Scheme拉起此小程序」声明后,按该页格式自行拼接。加密 URL Scheme 则通过服务端接口获取,生成形态是带票据的业务链接,适用于从短信、邮件、微信外网页等场景打开小程序。该页还写:微信内的网页如需打开小程序,请使用微信开放标签中的小程序跳转按钮;只能生成已发布的小程序的 URL Scheme;开放范围是针对非个人主体小程序开放。《获取加密scheme码》也写:该接口目前仅针对国内非个人主体的小程序开放,适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。
本文讨论的,是从短信或浏览器等微信外场景打开小程序时,官方对 URL Scheme 的有效期、打开次数和系统识别方式怎么写。明文和加密的获取方式不同,但打开时都可能遇到有效期、次数上限或系统不识别的问题,需要分开看。该页还提到,通过 URL Scheme 跳转到微信时,可能会触发系统弹框询问,若用户选择不跳转,则无法打开小程序;部分浏览器会限制打开网页直接跳转。这些是打开过程中的限制,不等于这条 Scheme 已经到期或次数用尽。
《获取加密scheme码》在请求参数里写:到期失效的 scheme 码,失效时间用 Unix 时间戳表示,最长有效期为 30 天;也可以按失效间隔天数来设置,最长间隔天数为 30 天。这两项分别在「到期失效」且对应失效类型时必填。错误码说明里也写:时间间隔须大于 1 分钟且小于 30 天。也就是说,按该页对到期失效 Scheme 的规定,有效期上限是 30 天,不能把任意更长的时间写成已经支持的规则。
《查询scheme码》的返回说明写:到期失效时间 expire_time 为 Unix 时间戳,「0 表示永久生效」。该页页标是 2025-12-18,早于生成接口页的 2026-07-13。两页都是现行仍可访问的官方文档,但对「能不能永久生效」的表述并不落在同一处:生成页详细写的是到期失效最长 30 天,查询页在返回字段里出现了「永久生效」。本文不加总成一个结论,只如实保留两页的页标日期和原文差异。若要判断某一条已生成的 Scheme 现在是否还有效,应按查询结果里的失效时间来核对,而不是只看生成时的意图。
还需要分开的是:有效期到期,和打开次数用尽,不是同一件事。前者看这条 Scheme 自己的失效时间,后者看当天累计打开是否达到平台上限。查询接口可以查询 Scheme 码信息,也可以查询每天剩余访问次数,但该页没有把剩余次数的上限数字写在字段说明里。示例里的数字只是示例,不能当成上限。
《获取 URL Scheme》页标 2026-06-16,文首写:「每个小程序每天 URL Scheme 和 URL Link 总打开次数上限为600万。」同页「频率限制」一节又写:生成端,每天生成加密 URL Scheme 和 URL Link 的总数量上限为 50 万;打开端,每天通过 URL Scheme(加密+明文)和 URL Link 打开小程序的总次数上限为 600 万。
《获取加密scheme码》页标 2026-07-13,在「调用上限」中写:生成端,每天生成 URL Scheme(加密+明文)和 URL Link 的总数量上限为 50 万;打开端,每天通过 URL Scheme(加密+明文)和 URL Link 打开小程序的总次数上限为 300 万。该页还提到,自 2023 年 12 月 19 日起取消「一人一链」限制,同一条连接可被多名用户访问。
两相对照:打开次数上限,2026-06-16 的指南页写的是 600 万,2026-07-13 的接口页写的是 300 万,二者不一致。生成数量上限都写 50 万,但指南页写的是「加密 URL Scheme 和 URL Link」,接口页写的是「URL Scheme(加密+明文)和 URL Link」,统计口径也不完全相同。本文不擅自取其中某一个数字作为唯一上限,只标明页标日期和原文差异。若打开失败,不能在未核对该条 Scheme 的有效期、系统识别方式和用户是否同意跳转之前,就断定一定是次数用尽;若要核剩余次数,应依据当时查询结果,并注明所依据的是哪一页的上限表述。
《获取 URL Scheme》写得很直接:「iOS系统支持识别 URL Scheme,可在短信等应用场景中直接通过Scheme跳转小程序。」「Android系统不支持直接识别 URL Scheme,用户无法通过 Scheme 正常打开小程序,开发者需要使用 H5 页面中转,再跳转到 Scheme 实现打开小程序。」该跳转可以在用户打开 H5 时立即调用,也可以在用户触发事件后调用。该页还提醒:部分浏览器会限制打开网页直接跳转,可设置跳转按钮。
因此,在安卓设备上,把 Scheme 直接放进短信或浏览器地址栏却打不开,首先要核的是:这条打开路径有没有经过网页中转。这是系统是否识别 Scheme 的问题,不是有效期到了,也不是当天次数已经用完。同一条 Scheme,在 iOS 的短信里可能可以直接跳转,在安卓上却仍需要先打开一个网页,再由网页跳到 Scheme。若网页被浏览器拦截了自动跳转,还要再看是不是需要用户点击后再跳,而不能直接写成链接失效。
另外,跳转到微信时可能出现系统弹框,用户如果选择不跳转,小程序也不会打开。这是用户当次选择的结果,应和有效期、打开次数分开记录。微信内的网页若要打开小程序,该页要求使用开放标签,而不是把 URL Scheme 当作微信内的首选方式。
可以按下面的层次记录:
- 当前使用的是明文还是加密 URL Scheme,以及打开场景是不是短信、邮件或微信外网页;微信内网页应按该页改用开放标签
- 小程序是否为非个人主体、是否已经发布;官方写明仅针对符合开放范围、已发布的小程序生成
- 若已生成,查询结果里的失效时间是多少;查询页把 0 记为永久生效,生成页对到期失效写的最长是 30 天,两页差异须一并记下,以当时查询结果为准
- 打开失败发生在哪一步:系统不识别、浏览器限制自动跳转、用户在弹框中选择不跳转,还是已经进入微信但仍未到达小程序
- 若在安卓上直接打开 Scheme 失败,是否已经按该页使用 H5 中转,而不是先把原因写成链接失效
- 若要核当天次数,注明所依据的是指南页的 600 万还是接口页的 300 万,并以当时查询到的剩余次数为准,不把文档示例数字当成上限
用 URL Scheme 从短信或浏览器打开小程序,先不要把「打不开」收成一个原因。有效期、打开次数和安卓需要网页中转,是三层不同的限制;其中打开次数上限在两份官方页上目前并不一致,只能按页标日期如实对照。以上均为本轮核读文档的转述,未做真机实测,最终以当时查询结果和实际打开过程为准。
[1] 微信开放文档:获取 URL Scheme https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html,页标「最后一次编辑于 2026-06-16」,访问日期 2026-11-14(北京时间)。引用范围:文首每天总打开次数上限 600 万;明文与加密 URL Scheme 的适用场景;iOS 可直接识别、Android 不支持直接识别、须用 H5 中转;频率限制中生成端 50 万(加密 URL Scheme 和 URL Link)、打开端 600 万(URL Scheme 加密+明文,以及 URL Link);开放范围、已发布限制、系统弹框、浏览器限制自动跳转,以及微信内网页应使用开放标签。
[2] 微信开放文档:获取加密scheme码 https://developers.weixin.qq.com/miniprogram/dev/server/API/qrcode-link/url-scheme/api_generatescheme.html,页标「最后一次编辑于 2026-07-13」,访问日期 2026-11-14(北京时间)。引用范围:适用于短信、邮件、外部网页、微信内等场景;国内非个人主体;到期失效最长 30 天;生成端每天 50 万(URL Scheme 加密+明文,以及 URL Link);打开端每天 300 万;取消一人一链的说明。未展开链接后拼接参数的规则。
[3] 微信开放文档:查询scheme码 https://developers.weixin.qq.com/miniprogram/dev/server/API/qrcode-link/url-scheme/api_queryscheme.html,页标「最后一次编辑于 2025-12-18」,访问日期 2026-11-14(北京时间)。引用范围:可查询加密或明文 Scheme 信息,以及每天剩余访问次数;expire_time 为 0 表示永久生效。不把该页示例中的剩余次数数字当成上限。
