重庆互联网,19年企业互联网解决经验,专业网站开发、移动端开发、微信端开发、小程序开发!
重庆网络推广公司

微信云托管教程(四十三):开放接口服务(一)

作者:重庆互联网小徐 发布时间:2023-11-28 浏览:29343 赞(3851 收藏 评论(0)

「开放接口服务」是微信云托管推出的云调用彻底免鉴权解决方案服务。

通过「开放接口服务」,就不需在容器内维护 cloudbase_access_token 等鉴权信息,即可轻松接入微信体系访问后台接口。

获取微信用户信息

问:可以用云调用通过auth.code2Session接口获取用户openid吗?

答:无需借助云调用,小程序或公众号(需要是登录状态)向云托管服务发起callcontainer调用时,你的服务请求header中会自动带有用户信息,包括openid、unionid、ip地址、可信来源等等,无需再通过小程序wx.login登录,然后调接口置换,大幅简化了流程。公众号的登录也都自己闭环了,不需要再用code转换成对应用户信息。 公众号处于未登录状态时,header中不包含微信用户信息。

功能介绍

「开放接口服务」以旁加载形式部署到服务中,占用资源和内存极小,与业务服务共用资源。开放接口服务中转 api.weixin.qq.com 的请求,并自动处理 token 和鉴权问题。

「开放接口服务」使用方式如下:

  1. 将需要调用的接口,配置在云调用-微信令牌权限配置中。

  2. 查看服务端接口的文档。容器内云调用形式与原有接口文档相同,但不需要携带接口调用凭证(access_token 和 cloudbase_access_token)。

  3. 打开控制台-云调用中开放接口服务的开关。

  4. 在打开开关的状态下,创建服务版本。服务项目应用代码中使用 HTTP 协议,向 api.weixin.qq.com 发起请求即可。如果云调用请求正常,会在返回的 Header 中附带云调用唯一的 x-openapi-seqid,代表该请求正在使用云调用链路。

资源复用情况下,参考此文档指引

注意:如果你在开启「开放接口服务」前,已经存在服务版本,需要在开启「开放接口服务」后重新构建版本才会生效。

开启「开放接口服务」后,使用形式与传统方式相同,只是不需携带access_token,下面拿nodejs举例子,举一反三理解:

const fs = require('fs')const request = require('request')return new Promise((resolve, reject) => {
  request({
    method: 'POST',
    // url: 'http://api.weixin.qq.com/wxa/msg_sec_check?access_token=TOKEN',
    url: 'http://api.weixin.qq.com/wxa/msg_sec_check', // 这里就是少了一个token
    body: JSON.stringify({
      openid: '用户的openid', // 可以从请求的header中直接获取 req.headers['x-wx-openid']
      version: 2,
      scene: 2,
      content: '安全检测文本'
    })
  },function (error, response) {
    console.log('接口返回内容', response.body)
    resolve(JSON.parse(response.body))
  })})

「开放接口服务」还集成了「微信支付」「对象存储」等接口集合,代替了业务侧必须的鉴权步骤。以下是对比图: 1.png

资源复用情况下的使用【重点】

如果你的环境共享给其他小程序/公众号使用时,需要注意云调用归属问题。

当你直接调用接口,不带任何参数的情况下,归属为云托管环境所属的「小程序/公众号」。

如果你想指定其他「小程序/公众号」身份,需要在地址后加 from_appid 参数

# 原接口形式,权限归属为云托管环境所属的小程序/公众号http://api.weixin.qq.com/wxa/getwxadevinfo# 资源复用的形式,APPID为你要指定的小程序/公众号appidhttp://api.weixin.qq.com/wxa/getwxadevinfo?from_appid=APPID

比如,你的小程序 wxaaaa 有一个云托管环境,共享给小程序 wxbbbb 和 公众号 wxcccc

则下面的接口调用身份是

# 调用时,创建小程序 `wxaaaa` 的小程序码https://api.weixin.qq.com/wxa/getwxacode# 调用时,创建小程序 `wxbbbb` 的小程序码https://api.weixin.qq.com/wxa/getwxacode?from_appid=wxbbbb# 调用时,报无权限,因为公众号不能生成小程序码https://api.weixin.qq.com/wxa/getwxacode?from_appid=wxcccc

再比如,你的公众号 wxcccc 有一个云托管环境,共享给小程序 wxbbbb 和 小程序 wxaaaa

# 调用时,报无权限,因为公众号不能生成小程序码https://api.weixin.qq.com/wxa/getwxacode# 调用时,创建小程序 `wxbbbb` 的小程序码https://api.weixin.qq.com/wxa/getwxacode?from_appid=wxbbbb# 调用时,创建小程序 `wxaaaa` 的小程序码https://api.weixin.qq.com/wxa/getwxacode?from_appid=wxaaaa

使用注意事项

1. 证书与 HTTPS

使用云调用时建议使用 HTTP 协议以获得更好的性能,如确有需求使用 HTTPS 协议,请参考以下说明。官方模板的Dockerfile中,也都加入了安装命令,可直接参考。

为了允许用户使用 HTTPS 协议访问容器云调用,云调用会在用户容器内安装 api.weixin.qq.com 的自签名证书,该证书在容器内一次性生成使用,仅容器内有效,仅容器云调用内使用该证书进行认证,与用户容器完全隔离。

由于容器系统版本、服务框架不一,在容器启动过程中,会调用 update-ca-certificate 信任证书。如需使用 HTTPS,需提前确认容器中包含 update-ca-certificate

# debian/ubuntuRUN apt install ca-certificates -y# alpineRUN apk add ca-certificates# centos/fedora/rhelRUN yum install ca-certificates

若容器安装证书不生效,或使用部分自带根证书的运行时(如 Node.JS),需手动信任以下目录的根证书:

/app/cert/certificate.crt

针对不同的语言和框架,可以将以下命令添加到 Dockerfile 中从而信任根证书:

# Java 手动导入根证书RUN keytool -importcert -file /app/cert/certificate.crt -alias apiweixin -keystore $JAVA_HOME/jre/lib/security/cacerts# Node 指定根证书环境变量ENV NODE_EXTRA_CA_CERTS=/app/cert/certificate.crt# Python requests 指定环境变量ENV REQUESTS_CA_BUNDLE=/app/cert/certificate.crt

信任后,即可使用 HTTPS 协议进行容器云调用。

2. HTTP Header 区别

根据标准,以下的 HTTP Header 将不会被传递(包括请求/回包)。

  • connection

  • proxy-connection

  • keep-alive

  • proxy-authenticate

  • proxy-authorization

  • te*

  • trailer

  • transfer-encoding

  • upgrade

  • expect

容器内云调用会增加的 Header,用于区分请求和排查问题:

  • x-openapi-seqid

容器内云调用会修改的 Header,用于标记请求来源:

  • x-forwarded-for

服务使用java spring框架时,如果header中找不到“x-forwarded-for”,请在 “application.properties” 中设置 “server.use-forward-headers=true”.

3. 请求包体大小限制

请求包体最大限制:32 MiB

请求回包最大限制:32 MiB

4. 请求时间超时

云调用最大超时时间为 30s。

5. 存在时机

「开放接口服务」开关在关闭状态期间,产生的任何服务的版本,其下运行的实例都不会存在「开放接口服务」。

「开放接口服务」开关在开启状态期间,产生的任何服务的版本,其下运行的实例都会存在「开放接口服务」。

也就是说,环境中可以同时存在具有「开放接口服务」的版本和不具有「开放接口服务」的版本。

实例扩缩容时,不会遵照当前的「开放接口服务」开关的状态,而是遵循版本创建时的开关状态。

一个版本下的实例,要么全有「开放接口服务」,要么全都没有,没有其他第三种状态。

6. 其他注意事项

  1. 开启「开放接口服务」,请求中如果仍然附带access_token,不会覆盖掉,这类操作通常用于环境共享场景下。

  2. 使用 secret 置换的 access_token,经过开放服务不需要配置白名单,原因如第1条,不覆盖。但如果使用「开放接口服务」鉴权,则必须使用白名单,因为其仍然使用 cloudbase_access_token

  3. 通过请求头返回 x-openapi-seqid 和解析地址为 Docker 内部地址判断是否使用了开放接口服务。

  4. 部分自带根证书的运行时,需要手动设置证书,证书目录为: /app/cert/certificate.crt

  5. 开放接口服务集成的其他能力(如微信支付对象存储),应按照微信云托管提供的文档指引使用。

  6. 开放接口服务依赖 shell, 如镜像内无 sh/bash 将无法正常部署容器(如 scratch 作为基础镜像时)。

—————————————————————————————————————————————————————

        重庆互联网项目从2004年开始为各行各业提供互联网发展解决方案,专业从事网站、小程序、微信公众号、APP、电商平台、系统等互联网平台开发,帮助企业实现从传统行业到互联网的完美转型。截止目前,重庆互联网合作的企业遍布全国各地,19年的开发经验和完善的售后服务体系获得合作客户的高度认可!

关注重庆互联网官方公众号,即可获取粉丝专享福利!

重庆互联网公众号二维码.jpg

网友留言评论
我要评论
评论

欢迎广大用户为此页面进行评价,评价成功将获得积分奖励!

  • 赞(0
    踩(0
重庆网站定制建设
  • 重庆网站建设平台
  • 重庆网站优化公司
  • 重庆网络推广公司哪家好
  • 重庆APP制作公司
版权所有 ©2004-2024 重庆市渝中区圣灵科技信息有限公司 渝ICP备16004600号-14 渝公网安备50010802001420号 电子营业执照
重庆公众号制作哪家好
二维码
联系客服 重庆商城网站建设