微信生态应用形态多样,云端服务助力开发者接入

2024-07-15
来源:网络整理

1. 背景

从公众号、小程序、移动应用、网站应用,到现在的视频号商店,微信提供了非常多的应用形态,企业和个人开发者都可以根据自己的业务需求,以适合的形式接入微信生态。

此外,微信还提供第三方平台,为各行业解决方案服务商提供窗口,可以帮助更多商家或中小企业接入微信生态,提升客户体验。

但无论是小程序、公众号还是第三方平台,依然只是在C端提供服务,无论是服务商还是企业个人开发者,想要通过上述形态接入微信生态,依然离不开云服务。

微信团队提供了非常优秀的开发和调试工具,开发一个不连接互联网、实现一些简单功能的小程序并不难,但对于很多开发者来说,开发一个在互联网上提供完整服务的小程序就比较难了,更难的还有一个问题:如何做出稳定、安全的后端服务?

2018 年微信与腾讯云上线云开发,主要是为了解决小程序后端服务门槛高的问题,但提供的云功能对于改造传统开发模式成本过高,且灵活性不够,因此 2020 年微信上线云主机,提供通用容器服务,将服务搭建过程交给开发者。

无论是云开发还是云托管,最重要的并不是提供后端服务,而是提供对后端服务的安全访问。因此可以看出,无论是云开发还是云托管,微信应用(小程序、公众号服务)中提供的方法,本质上都是提供了一个安全的访问入口。

云开发和云主机在一定程度上承担了运维部署环节,上手非常容易,对新手开发者非常友好。但并不是所有开发者都是新手,很多成熟的开发者都有自己一套成熟的后端服务,如果为了接入微信的安全接入而直接将服务迁移到云开发或云主机上,阻力还是比较大的。

另外,云开发和云托管提供的是独立的后端云服务,有独立的数据存储,无法摆脱调用方端同一实体的限制,这也是服务提供方开发者使用起来最不舒服的一点。

那么有没有一种方案,可以让开发者使用自己熟悉的后端服务基础,并且非常灵活便捷地接入微信的安全接入呢?

这是新的安全网关!

2、什么是安全网关,其特点有哪些?

安全网关提供了安全的访问链路,从调用端(小程序、公众号H5、APP、WEB)发起的请求直接进入微信环境接入层,微信接入层通过中转域名将请求转发到后端服务网络的“网关实例”,在“网关实例”中通过路由配置将请求转发到开发者自己的上游业务服务,完成整个请求的处理。

上面是整个链路的全景,其中“网关实例”是指部署在一台服务器或容器服务上的一组网关(经过微信信息处理,采用专用证书加密)。

相比于云开发或者云托管的访问链路,安全网关的链路是完全独立的,相对更加成熟和安全。而且由于它只是转发请求,所以不受同一主体可用性的限制。也就是说,任何小程序或者公众号H5或者其他形式的应用,都可以使用安全网关的链路来实现请求。

当然,微信也提供了对链接中来源客户端的识别,开发者可以在控制台或者自己的后端服务中设置限制,防止其他未经授权的客户端调用。

但需要注意的是,安全网关并不是云开发或者云托管的替代品,安全网关能够和现在的云托管深度结合,所以最终的形态一定是对各类开发者友好的,在云服务领域还有很长的路要走!

3.开始配置安全网关

1. 登录报名平台

进入控制台,通过微信扫描二维码登录。

扫码后页面会自动跳转到控制台,首先点击右上角头像,在列表中点击实名认证。

填写姓名和证件号码后,会弹出如下二维码,使用微信客户端扫码验证。

验证完成后会自动出现如下提示,实名认证流程完成。

2. 激活安全网关

在控制台页面点击安全网关上的“立即激活”按钮。

阅读服务协议并同意,激活完成!

页面会自动刷新,点击上方菜单栏中的“安全网关”,显示如下页面,完成激活。

3. 创建新网关

在安全网关页面点击“创建网关”按钮,在弹出的对话框中填写网关名称,即可完成创建。网关一般从使用角度以应用维度来区分,一般只需要一个,可以再创建另一个用于规则测试。

这里我填写的是app,大家可以按照自己的想法去填写。

4.安装网关实例

网关实例是一个处理型网关,主要作用是接收微信的请求,并根据自身的设置进行路由分发等流量管理。因此,运行网关实例的服务器或容器服务应满足以下条件:

有公网访问:可以是有公网 IP 的服务器,也可以是任何可以从公网访问的容器服务[如 TKE、云主机等]。如果服务器没有公网 IP,可以在服务器的 VPC 网络中配置 NAT 网关,实现端口流量转发。尽量靠近业务后端服务:网关实例最重要的作用就是路由分发,分发的上行服务可以用内网 IP 或私网域名访问,不建议使用公网发出去,会增加请求时间。所以尽量和业务后端服务在同一个私网中。如果跨地域,可以考虑对等连接,或者在不同地域配置多个网关实例(使用域名解析实现就近访问)。 尽量避免与高峰服务混合:虽然资源消耗本身很小,但仍然需要注意不要与其他消耗大量资源且可能导致宕机的服务部署在一起,否则网关实例将不可用,从而影响请求的顺畅转发。

一般情况下,有很多种方式可以根据自己的情况进行选择,选择好实例位置后,参考控制台给出的详细步骤,根据不同的环境安装实例,目前有以下几种方式:

这里我使用一个服务器来执行安装过程,配置截图如下:

启动完之后进入root账号,执行以下命令:(最后一条是启动网关实例,不用挂机就可以运行)

网关实例安装完成后,点击控制台中的“完成”按钮进入下一步,在实例列表中可以看到已经安装好的在线实例。

注意:1. 在线时无法删除,需要先将网关下线后才能删除。2. 默认对外端口为9903,但根据自己的配置可能会有所不同,请留意打印的端口内容。

5. 发布网关配置

网关配置主要分为两部分:上游服务和路由配置,我们分别进行配置。

5.1 上游服务

上游服务是请求最终到达的服务,一般可以称为业务服务地址,可以是域名,也可以是IP地址。

在配置页面点击“新建上游服务”按钮,会弹出一个对话框,我们来填写一下。

为了保证大家测试顺利,不产生任何差异,这里就填一个mp官网的域名,后期大家根据自己的情况改就可以了。

注意:仅用于本次测试,请勿尝试在生产环境中调用或恶意攻击操作。

5.2 路由配置

配置完上行服务后会提示配置路由,点击跳转路由配置页面对话框

这里我们配置一个测试路径,后面我们会配置更多的来测试路由能力。

5.3 发布配置

在控制台中重复配置路由和上行服务不会影响实际上线的网关实例。配置完成后,我们需要在控制台中点击“发布配置”按钮,将配置上传到网关实例,网关实例才能应用我们最新的配置。

在线配置完成后,我们可以点击右侧的“在线网关配置”来查看在线生效的配置。

6. 配置接入层

接入层是微信侧的概念,网关接入层承担业务流量的接受和转发,具备分布式安全防护能力,支持弱网就近接入进行加速,集成微信安全风控能力。

通俗的说就是客户端访问网关的时候需要一个地址,这个地址就是接入层的一个节点,微信给每个接入节点都建立了一个专门的地址,用来接收客户端的流量。

接入节点一般以客户端应用区分(如A应用APP、B小程序、C网页WEB),或应用矩阵区分(A应用多端APP、小程序、WEB),这样可以随时进行流量阻断或转移。另外可以通过路由配置的接入域名,实现不同应用的差异化转发;服务商、第三方平台也可以利用该特性,实现针对普通客户的应用承载、针对VIP客户的应用承载导流。

只有一个访问节点的域名地址是没用的,我们还需要配置进入这里的请求流量要转发到哪里。

在控制台中,单击访问层中的新建访问节点按钮。

注意:1.多个接入层可以使用同一个网关实例,没有任何限制。如果一个接入层使用多个实例,则需要使用域名。2.需要配置安全规则,保证网关实例暴露的端口能被公网访问。不要使用七层负载均衡转发端口,可以使用NAT网关转发。

此处配置如下,请自行替换IP

微信重启怎样操作_微信小程序开发工具重启按钮_微信怎样重启动

如果过程顺利完成,没有弹出任何错误,则一切正常,可以在控制台中看到节点。如果有错误信息表明连接失败,请首先检查端口 IP 安全规则是否打开。注意是 TCP 协议。

7. 访问简单

上述步骤中的访问域名为:

格式大致为:${接入节点ID}-${平台}。

以下访问请全部替换为你自己的访问域名

当我们在浏览器中访问该域名的时候效果应该是这样的:

当我们访问如下地址(替换我们自己的前缀)时,效果是:

也就是说,我们之前配置的路由的访问路径,只是前缀匹配而已。

接下来我们添加一个新的配置,如下图所示,记得“发布配置”才能在线生效。

当我们访问以下地址时(替换自己的前缀)

这将是一个 404 提示。

接下来,我们将删除初始路由,只保留api路由。

再次访问的时候,会发现页面已经正常返回。

当我们再次配置回路由时,如下:

一切皆有可能!

以上是路由优先级的实验,在流量转发时会按照配置规则列表依次匹配,如果匹配到则立即转发,如果匹配不到则向后匹配,直到找到匹配或者匹配完成。所以如果是/根路径,一般会放在路径最后面,否则直接从/转发。

这里还有一个关于域名访问的实验,如果大家有兴趣我后续会补充上来。原理先写在这里:

访问域名一般填写访问域名或者自定义域名,支持*通配符;当某条路由规则配置了访问域名A,则A的流量只会匹配此条规则,其他没有填写访问域名或者访问域名不是优先级的路由规则将完全不匹配。访问域名可以按照以下格式书写:

当一个域名命中多个路由访问域名时,以最长的为准。例如匹配*.,而不是*.

4. 在客户端使用安全网关

目前安全网关可以在微信小程序中使用,使用步骤如下:

1.准备环境

公测阶段小程序调用安全网关需要白名单,您可以在申请页面填写问卷并提交信息,通过申请后重新进入小程序即可在基础库列表最后看到基础库,环境准备完成。

2.获取接入节点ID

在安全网关控制台中,进入“接入层”页面,取出接入节点的默认域名,并提取ID部分,如下图所示:

在上图中,接入节点的ID为:-

此ID需要替换成您自己的ID,因为每个人的ID都不同。

3.配置请求域名

目前网关请求需要在mp后台配置域名,填写节点域名完整地址即可,协议如下:

团队正在优化这一点,以后就不需要再配置这个合法域名了!

4. 编写请求代码

这里我写了一个可以直接导入到IDE中的代码片段

调用小程序的代码片段:

导入的时候注意一定要使用第一步申请公测时填写的信息,不要填写其他或者接口测试号,否则基础库不会显示。

导入后点击右上角“详情”按钮,在本地设置中选择基础库。

然后打开app.js文件,按照下图所示替换步骤2中的访问节点ID。

保存文件后,触发重新编译,就可以在调试器中看到网关请求打印的返回数据:

请求其实就两个步骤,第一是网关的初始化,第二是调用请求,这里我只是把调用请求简单封装了一下,挂载到了app下面,大家也可以根据自己的需求进行封装。

//.js中触发请求,最开始的代码片段就是上一步访问的页面。

当GET时,数据会拼接到url参数中,除了路径,其他参数大部分都跟在wx.后面,所以没问题。

当去掉上面的data参数之后,由于接口的特性,会直接返回页面html内容,而不是JSON字符串,所以会出现下面的错误。

这是因为当请求以json形式传入时,会自动尝试将请求返回结果解析为json,如果不是json字符串,会导致解析错误,可以直接将其改为text,如下图:

5. 上传试用版

公测期间,使用基础库在IDE中进行调试开发,但是线上尚不存在此基础库,所以网关调用代码需要与您的应用代码包一并上传。

在app.json中添加以下配置:

{ "cloud": true, "cloudVersion": "alpha" }

这样,当你上传试用版本的时候,网关相关的代码就会和你的代码一起打包上传。

如果后续又有一些新的功能,需要重新执行上传步骤,这个指的是网关代码的版本,跟你引入的模块的版本管理形式是一样的,你自己可以控制。

6.降级并重试

建议您有条件的话做好降级策略,防止网关实例异常或者接入层规则出现问题,影响在线用户调用。

先使用网关调用,如果网关调用失败,再使用wx.。

异常情况下返回的内容包含,因此可以根据此来设置降级策略。

{ "data": {}, "statusCode": 404, // http状态码 "errMsg": "gateway.call:ok", // 请求正常则始终为 gateway.call:ok "errCode": -651000, // 正常时无此属性。异常时会返回负值,代表云开发网关侧异常 "header": { "date": "Wed, 19 May 2021 02:37:59 GMT", "server": "envoy", "content-length": "0" }, "callID": "1665645158626-tsmg9Dpy" }

上述代码片段中,封装的方法中有保留降级插入,大家可以根据自己的业务进行部分修改。

五、其他补充

1、网关实例9903用于向微信接入层转发请求,端口有证书验证,这里不用担心被攻击。由于默认证书可能在多个地方使用,可以在控制台生成专用证书,直接替换对应路径下的文件,然后重启实例即可。

2.网关实例还有9902端口,用于路由测试,可以直接拼成IP地址+端口9902,按照路由规则的路径测试即可。这个是纯本地测试,没有证书验证,也可以用于内网流量转发,安全性不是很好,注意内网的安全规则设置。

3.网关实例还有一个端口,就是管理控制台,任何能访问到的人都可以停止网关实例,读取你所有的配置,这个相当危险,不要暴露在外网,调试的时候尽量配置安全规则只允许自己的IP访问。

4、网关实例已经启动,但是控制台列表里没有显示?首先检查是否填写正确,重新初始化;其次检查网络安全规则是否打开。ping实例所在服务器,或者ping其80端口,如果没有打开,请打开。

5.配置多个网络实例时,个别实例的配置没有更新或者比较旧? 重启实例基本可以解决问题,或者进入控制台看信息和配置是否和描述一致,如果和控制台不一致,那么重新运行启动命令。

6.当你确认操作步骤正确,但是执行结果不如预期时,可以将启动后的日志完整复制过来,反馈给社区相关板块。启动执行日志;启动后,复制or.out内容。

7.切换基础库时,若代码片段长时间未开始进入页面,且调试器无任何输出,请耐心等待基础库下载完成并加载部分动画,若等待3分钟后仍无变化,重启IDE即可解决问题。

分享