作者:重庆互联网小徐 发布时间:2024-01-04 浏览:16735 赞(2414) 收藏 评论(0)
微信小程序中操作微信云托管服务,使用小程序基础库中 wx.cloud
方法对象,无需引入额外的SDK。
需要注意,微信小程序基础库版本应该在 2.23.0
及以上,请务必配套在「小程序管理后台」-「设置」-「功能设置」-「基础库最低版本设置」中,将值设定为2.23.0
及以上。
不耗费任何公网流量,前后端通信走内网;
天然免疫DDoS攻击,仅授权小程序/公众号可访问后端,其他人即便拿到环境id和服务名也无法访问;
通过微信就近接入节点加速,无视后端服务地域影响,没有跨地域延迟,后端无需多地部署;
无需在小程序后台配置「服务器域名」;
后端可直接获取用户信息,无需调接口即可以获取opneid等。
因此,如果云托管服务只有微信小程序/公众号会调用,建议在服务设置中关闭公网访问。
最简单的情况,「小程序」对「直属微信云托管环境」的服务进行访问,也就是登录微信云托管控制台时选择小程序进入的环境。
以上情况我们约定为A小程序
,如果你希望另外一个 B小程序
/B公众号
也可以访问 A小程序
的云托管环境:
A小程序
和 B小程序
/B公众号
同主体:需要配置资源复用。
A小程序
和 B小程序
/B公众号
不同主体:推荐使用「微信开放平台-第三方平台」方式。
A小程序
和 B小程序
/B公众号
不同主体:将B小程序
/B公众号
视为「其他客户端」,通过公网访问。参考文档其他客户端-访问云托管服务。此方式下,B小程序
/B公众号
无法使用云调用/微信令牌,且需要配置「服务器域名」(使用云托管服务的默认公网域名/自定义域名均可)。
如果你对以上正在支持的能力有任何建议和期待,欢迎在官方交流群联系我们。
在小程序中使用如下的代码(取代原有wx.request用法):
// 确认已经在 onLaunch 中调用过 wx.cloud.init 初始化环境(任意环境均可,可以填空)const res = await wx.cloud.callContainer({ config: { env: '填入云环境ID', // 微信云托管的环境ID }, path: '/xxx', // 填入业务自定义路径和参数,根目录,就是 / method: 'POST', // 按照自己的业务开发,选择对应的方法 header: { 'X-WX-SERVICE': 'xxx', // xxx中填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称) // 其他header参数 } // dataType:'text', // 默认不填是以JSON形式解析返回结果,若不想让SDK自己解析,可以填text // 其余参数同 wx.request});console.log(res);
如上使用前,需要在小程序app.js中,执行wx.init,如下代码:
App({ async onLaunch() { // 使用callContainer前一定要init一下,全局执行一次即可 wx.cloud.init() // 下面的请求可以在页面任意一处使用 const result = await wx.cloud.callContainer({ config: { env: 'prod-01', // 微信云托管的环境ID }, path: '/', // 填入业务自定义路径和参数,根目录,就是 / method: 'GET', // 按照自己的业务开发,选择对应的方法 header: { 'X-WX-SERVICE': 'xxx', // xxx中填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称) } // dataType:'text', // 默认不填是以JSON形式解析返回结果,若不想让SDK自己解析,可以填text }) console.log(result) }})
如果资源复用情况下,需要在 wx.cloud.init
中填写环境来源的账号appid,
例如,小程序A(appid:WXAAA)的环境 prod_001
授权给 小程序B(appid:WXBBB),则应是如下:
const c1 = new wx.cloud.Cloud({ resourceAppid: 'WXAAA', // 环境所属的账号appid resourceEnv: 'prod_001', // 微信云托管的环境ID})await c1.init()await c1.callContainer({ config: { env: 'prod_001', // 微信云托管的环境ID }, path: '/xxx', // 填入业务自定义路径和参数,根目录,就是 / method: 'POST', // 按照自己的业务开发,选择对应的方法 // dataType:'text', // 如果返回的不是json格式,需要添加此项 header: { 'X-WX-SERVICE': 'xxx', // xxx中填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称) // 其他header参数 } // 其余参数同 wx.request})
如果你想深入了解 callContainer
的原理,建议阅读这篇文章
在这里我们提供了一个万能的封装方法,无论是自己的小程序还是资源复用形态,均可以正常使用。
在小程序app.js中建立一个call方法,并将appid、环境ID、服务名称填入适当的位置
App({ async onLaunch() { // 这里演示如何在app.js中使用,没有用请删掉 // const res = await this.call({ // path:'/', // method: 'POST' // }) // console.log('业务返回结果',res) }, /** * 封装的微信云托管调用方法 * @param {*} obj 业务请求信息,可按照需要扩展 * @param {*} number 请求等待,默认不用传,用于初始化等待 */ async call(obj, number=0){ const that = this if(that.cloud == null){ that.cloud = new wx.cloud.Cloud({ resourceAppid: 'WXAAA', // 微信云托管环境所属账号,服务商appid、公众号或小程序appid resourceEnv: 'prod-001', // 微信云托管的环境ID }) await that.cloud.init() // init过程是异步的,需要等待init完成才可以发起调用 } try{ const result = await that.cloud.callContainer({ path: obj.path, // 填入业务自定义路径和参数,根目录,就是 / method: obj.method||'GET', // 按照自己的业务开发,选择对应的方法 // dataType:'text', // 如果返回的不是json格式,需要添加此项 header: { 'X-WX-SERVICE': 'xxx', // xxx中填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称) // 其他header参数 } // 其余参数同 wx.request }) console.log(`微信云托管调用结果${result.errMsg} | callid:${result.callID}`) return result.data // 业务数据在data中 } catch(e){ const error = e.toString() // 如果错误信息为未初始化,则等待300ms再次尝试,因为init过程是异步的 if(error.indexOf("Cloud API isn't enabled")!=-1 && number<3){ return new Promise((resolve)=>{ setTimeout(function(){ resolve(that.call(obj,number+1)) },300) }) } else { throw new Error(`微信云托管调用失败${error}`) } } }})
在page页面js中,可以如下使用:
const app = getApp()Page({ async onLoad(){ const res = await app.call({ path:'/' }) console.log('业务返回结果',res) }})
—————————————————————————————————————————————————————
重庆互联网项目从2004年开始为各行各业提供互联网发展解决方案,专业从事网站、小程序、微信公众号、APP、电商平台、系统等互联网平台开发,帮助企业实现从传统行业到互联网的完美转型。截止目前,重庆互联网合作的企业遍布全国各地,19年的开发经验和完善的售后服务体系获得合作客户的高度认可!
关注重庆互联网官方公众号,即可获取粉丝专享福利!
欢迎广大用户为此页面进行评价,评价成功将获得积分奖励!