收藏
评论

第三方平台(服务商)云开发鉴权之路

文章较长,不想看过程的同学可以直接看最后的“总结”。

我是 2021 年 6 月开始接触服务商,当时只有一种方式去生成 token,通过 url。

1、url

对于云开发用户来讲,这个方式特别麻烦,不仅要服务器还要域名,还要搭建服务器环境,乱七八糟一堆事情。

因为只是调试,所以暂时把代码放在我个人博客的服务器上,硬着头皮学了点 php。大约捣鼓了一星期,跑通了生成 token 的流程,但是还没来得及做存储。由于项目优先级的原因,暂停折腾服务商,跑去做小程序业务。


过了半年,到 12 月再回来时,发现一切看上去都变简单了。

我重新去看一遍文档,想看看半年时间是不是有新东东。还真有,一个是微信令牌,还一个是可以通过云函数来接收授权事件和消息,url 不再是唯一方式。

2、微信令牌

我先体验了微信令牌。

刚开始我就觉得,这功能上线后似乎没什么服务商使用(我猜的),因为我使用时,第一步就走不通,开启不了。

在云开发官方群里反馈了这个问题,跟进的同学很负责,折腾了两天,可以开启功能了。

但是开启后发现获取不了 token,也设置不了接口白名单。

又反馈到云开发群里,还是上次那位同学跟进。又等了两天,bug 修复,可以获取到 token,也可以设置接口白名单了,只是又发现一个问题,这个 token 会过期,但是文档里并没有说怎么用接口去获取这个 token。我心想,这功能怕只是用来做开发调试的吧。

我决定看一下云函数的方式。

3、云函数

这个方式的开发流程和 url 方式差不多,只是不需要外部服务器和域名了,但是仍然需要自己维护 token。

我写了个云函数来调试,并不能接收到 ticket 推送。

翻了文档和社区,都没找到这方面的资料,不知道这个云函数和普通的小程序云函数在写法上有什么不一样,也不知道对云环境的主体有什么要求(我用的是同主体的小程序创建的云环境)。

这些疑问在页面上全没有说明。从这点上看,云函数模式的技术支持并不友好。

在社区上发帖求助,感谢 @老张 同学的解答。

这才知道,这个模式需要服务商自己云服务的云环境,是在腾讯云后台创建和维护云函数,不像小程序的云函数,是在开发者工具里开发和调试。瞬间好感度降了一半。

与此同时,我也在对比另一种模式,微信云托管。

4、微信云托管(真.免鉴权)

这看上去像是第二种和第三种方式的升级,是微信官方重点推荐的模式。可以看到,在服务商的开发资料中,如果启用云服务模式,不仅有“云函数”,还增加了“云托管”选项,后者大概是 2022 年 1 月初刚刚增加的,也可能是 2021 年 12 月底。

虽然以前有接触过 Docker,但是对于云托管的这套玩法并不太懂,要不是官方给拉了个服务商专项支持的小群,靠我自己折腾是玩不下去的。

以下是体验过程。

初体验

第一个遇到的问题是部署。一键部署没有问题,用代码包手动部署时出现问题,第 8 步卡了 5 分钟,最后部署失败。

尝试了四次都是部署失败,可以说基本没法玩。

原本觉得浅尝一下就可以了,但是初步对比下来,云托管似乎要比云函数省事很多,所以打算继续磕。

反馈给开发人员,回复说是境外网络问题导致的构建超时,要换成国内源。

等了一上午,可以重新测试了,但是仍然部署失败。回复说是“业务没起来”。

然后群里拉进来一位业务负责同学,在这位同学的帮助下,不到一小时,顺利解决了部署问题。这里总结一下。

官方模版提供了各种类型的模版,我部署的是 express 和 云调用 模板。

先下载模板代码包,然后在云托管后台新建服务,重点在新建版本这一步。

部署云调用模板需要注意:这个模板用的端口是 3000(文件在 bin/www),所以新建服务版本时,要把默认的 80 监听端口改成 3000。

部署 express 模板需要注意:新建版本时,展开“高级配置”,添加三个环境变量:MYSQL_ADDRESS、MYSQL_PASSWORD、MYSQL_USERNAME

推荐使用代码库的方式来部署,好处是可以结合流水线来实现自动化发布。

折腾了两天半,终于可以进行下一步了。

接口调试

先是发现一个问题,小程序端直接通过 wx.cloud.callContainer 请求云托管的接口,会报错,但是用小程序的云函数通过外网的方式去请求则可以正常走通。

这一点在云托管后台的云端调试也是一样的结果。

小程序访问的调试结果报错:

公网访问的调试结果正常:

反馈这个问题后,群里再次拉进来一位业务负责同学,了解情况后回复说,我是通过第三方平台登录的,这种情况下,获取的小程序代码有问题,会尽快优化。

然后按这位同学的指引,我先做了小程序与服务商的环境绑定,接着是小程序授权。

就在两周前,微信的第三方平台管理工具发布上线,把授权流程工具化了,值得大大的点赞。

这一工具在人工对接客户的场景下可以完全替代接口方式的授权,可以看下授权流程技术说明,我只觉得自己的生命被延长了一段时间,因为不需要花时间去折腾授权了。

当小程序绑定了服务商的云托管环境,并授权给了服务商,就可以在这个小程序上做服务商自己的内部管理工具了,例如代商家注册小程序批量代云开发管理,等等,所有需要 component_access_token 的地方都可以用云调用&微信令牌 cloudbase_access_token 去解决。

在云托管服务中,微信后台周期性的将开放接口所必须要的 access_token,推送到服务的容器实例中。在使用时只需要从容器本地读取令牌,就可以包装请求去调用了。
const token = fs.readFileSync('/.tencentcloudbase/wx/cloudbase_access_token', 'utf-8')


微信云托管总结

站在服务商的角度,云托管可以帮助服务商彻底免鉴权的去调用微信接口,服务商不需要自己去生成和维护 token,在这里可以关闭 ticket 推送,避免资源浪费。

服务商开通云托管服务后,需要做三件事:

1、使用官方模板里的云调用模版部署服务。

2、把准备用于内部管理的小程序绑定到服务商的云环境

3、把这个小程序授权给服务商(在第三方平台管理工具可以快速生成授权页)。

这样就可以开始开发了,有一点需要注意,服务商云调用在容器中始终需要带 token,在官方的云调用模版里,需要改一下。

work/wxapi.js:

url: `${ssl === true ? 'https' : 'http'}://api.weixin.qq.com/${name}${token.ca == null && ssl === true ? '?cloudbase_access_token=' + token.token : ''}`,


去掉 '?cloudbase_access_token=' 前的条件判断。

如果小程序调用的是服务商专属接口(需要传第三方平台令牌 component_access_token 的接口,例如 componenttcb/createenv),则直接使用 cloudbase_access_token 即可。

如果小程序调用的是普通接口(例如 wxa/msg_sec_check),而不是服务商专属接口,则需要在 cloudbase_access_token 前用 @ 拼接这个小程序的 appid,可以看云调用&微信令牌文档(查询关键词“拼接”)

结语

这半年,见证了第三方平台(服务商)云开发鉴权方式的进化,也见证了诸多辛酸,尤其是有时在群里和社区里问的问题一时间没人回答的时候,真的有一种无助感,好在还是有那么多的热心人。

从我的经历来看,微信云托管是服务商云开发的不二之选(如果服务商走的是云开发模式的话)。作为一名前端创业者,有一种生逢其时的幸福感。

这篇文章的云托管部分是和微信云托管的开发同学一边调试一边写完的(花了五天时间),一路解决了不少问题,就在今天我准备发布这篇文章的时候,他们解决了我遇到的最后一个问题,修复了小程序端通过 callContainer 请求服务商云托管的 bug,完美赶上这文章的发布,手动点赞。

最后感谢在调试过程中帮助我解决问题的所有同学,特别感谢(按时间顺序) @玉娇华 @张斯静 @涂小敏 @老张 @冉刚伟 @毛誉陶 @rongbinzhou

也希望这篇文章可以帮助到需要的人。

最后一次编辑于  2022-01-14
收藏

4 个评论

  • 林靖云
    林靖云
    发表于移动端
    2022-01-14
    Hi
    2022-01-14
    赞同 1
    回复 1
    • 谢亚辉
      谢亚辉
      发表于移动端
      2022-01-15
      10分钟
      2022-01-15
      回复
  • 阿耐🦴
    阿耐🦴
    2023-07-22

    2、把准备用于内部管理的小程序绑定到服务商的云环境

    大哥 我想问问

    1)这个内部管理的小程序指的是开发小程序的模版小程序吗?

    2)服务商的云环境指的是服务商微管家的云托管环境吗?

    因为我现在有个问题是我的用于开发模版的开发小程序连不上服务商微管家的云托管环境

    就想问问您的具体情况 好让我判断下我的问题出在哪


    2023-07-22
    赞同
    回复
  • 谢亚辉
    谢亚辉
    发表于移动端
    2022-01-15
    听歌
    2022-01-15
    赞同
    回复
  • 姐
    发表于移动端
    2022-01-14
    可以
    2022-01-14
    赞同
    回复
登录 后发表内容