再次搞定 Ali 云函数计算 FC

简介: 原本早就该写完了微信 SDK 授权服务上云计划由于对 Ali 云函数计算 FC 的不熟悉遇到了很多的坑,再前面的文章中还吐槽了一通。在服务顺利跑通后,这回实打实的来总结一下顺利上云的保守指南~

1. 前言

大家好,我是小鑫同学。一位从事过Android开发混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师。所以我开始在社区持续输出我所了解到、学习到、工作中遇到的各种编程知识,欢迎有想法、有同感的伙伴加我fe-xiaoxin微信交流~


原本早就该写完了微信 SDK 授权服务上云计划由于对 Ali 云函数计算 FC 的不熟悉遇到了很多的坑,再前面的文章中还吐槽了一通。在服务顺利跑通后,这回实打实的来总结一下顺利上云的保守指南~

2. 创建函数计算应用/服务/函数

项目基于 Node.js 技术栈的 egg.js 服务端项目模板搭建授权服务

2.1 选择服务模板:

登陆Ali云函数计算 FC 应用控制台,选择【通过模板创建应用】,在下面的选项选中Web开发框架后搜索 Egg.js 官方模板。

2.2 立即创建:

由于在线 IDE 在简单尝试后感觉还是不太利于调试,尤其是对 egg.js 和函数计算 FC 都还不是很熟悉的伙伴不建议直接在在线 IDE 中开发。

2.2.1 部署类型:

我们选择经常使用的一个代码托管平台来【通过代码仓库部署】 ,【仓库用户/组织】在第一次使用的时候需要跳转到托管平台进行一次授权~

2.2.2 触发方式:

【触发方式】可以选择当代码推送至 master 分之后拉取并构建,也可以选择发布 Release 后构建,我认为选择默认的代码推送 master 后构建是符合学习阶段的~

2.2.3 服务名&函数名:

【服务名】和【函数名】在每次创建的时候提供的默认名称都是一样的,这里我们必须要重新命名切记要重新命名,否则会覆盖掉之前已经从在的服务和函数,重名在创建时未能触发校验的问题技术已经在工单回复会做评估了~

2.2.4 等待创建:

创建应用包括了同步模板代码到你所选的托管仓库,在 Ali 函数计算 FC 开辟空间来创建应用,完成创建后开始执行部署工作~

部署完成后在当前应用的详情页面或应用列表页面可以通过提供的域名访问Eggjs 提供的默认首页~

2.3 必要的配置修改:

2.3.1 自定义域名:

如果你有阿里云的域名的话可以在【高级功能】-【域名管理】-【添加自定义域名】,在域名解析的时候通常解析二级域名而不是直接解析到主域名下,我的主域名是 it200.cn,待解析的二级域名使用了 wx.it200.cn

路由配置选择刚创建的应用时填写的服务名和函数名,版本使用最新的LATSET版本~

域名解析简要说一下:当要使用一个自己的域名(自定义域名)去代替另一个域名(默认提供域名)时,记录类型需要选择 CNAME主记录只需要填写二级部分,解析线路不需要修改,记录值就是被代理的域名,配置解析后你就可以稍等片刻去尝试访问了~

2.3.2 环境变量配置及函数中读取:

在对接微信 SDK 授权的时候需要使用到微信提供的安全秘钥和凭证信息,这些信息在部署服务的时候必须使用环境变量来配置,这样的信息是不适合放置到代码中的~

增加一个获取环境变量名为 APPID 的控制器并注册到名为 env 的路由对象中~

// 控制器

async getEnv() {

 const { ctx } = this;

 ctx.body = process.env.APPID;

}


// 路由配置

router.get('/env', controller.home.getEnv);

推送代码并等待重新部署后配置如下环境变量,环境变量在【服务列表】-【服务 xxx 详情】-【函数管理】-【函数详情】-【函数配置】中,正常通过访问获取 ENV接口将会在浏览器中输出了配置的 APPID 对应的值~

2.3.3 函数触发器支持 POST:

使用过 Egg.js搭建服务的伙伴会知道 Egg.js 默认开启的 CSRF 安全策略,当我们发起 POST 请求后会肯快在控制台收到 403 拒绝访问的状态码,但当我去关闭 CSRF 策略后依然收到了 403 的状态码,一度我怀疑这个配置不允许修改,在咨询 ali 技术后知道要想使用 POST 方式来触发接口需要做单独的配置~

3. 移植WxSDK 授权代码:

授权代码本地版本:git clonne git@github.com:OSpoon/wechat4node.git

3.1 必要依赖安装:

3.1.1 crypto-js:

npm i crypto-js

我们会使用到提供的 SHA1 算法来验证腾讯服务器发来的数据签名和计算签名提供给腾讯服务器来验证我们的数据可靠,代码见 service 文件夹~

3.1.2 egg-cors:

npm i egg-cors

安装后开启插件:

// plugin.ts

const plugin: EggPlugin = {

 cors: {

   enable: true,

   package: 'egg-cors',

 },

};

安装后配置插件,放开CORS限制:

// config.default.ts

config.cors = {

 origin: '*',

 allowMethods: 'GET, PUT, POST,DELETE, PATCH',

};

3.2 关闭 CSRF 安全策略:

CSRF 安全策略在前后端不分离的应用场景使用广泛,在前后端分离后通常使用 JWT 来实现授权过程,所以这里我们也不采用 CSRF 策略,我们通过配置来关闭~

// config.default.ts

config.security = {

 csrf: {

   enable: false, // 关闭csrf

 },

};

3.3 移植路由配置:

  1. checkOrigin:在微信公众平台主动发起的服务验证时使用;
  2. token:公众号相关 API 授权信息获取接口;
  3. ticket:公众号相关 API 票据数据获取接口;
  4. signature:公众号 JS-SDK 在初始化使用的授权信息获取接口;

router.get('/checkOrigin', controller.home.checkOrigin);

router.get('/token', controller.home.token);

router.get('/ticket', controller.home.ticket);

router.post('/signature', controller.home.signature);

3.4 移植控制器:

在控制器中只需要保留的入参、出参和执行逻辑的调用代码,其他它的具体业务逻辑均 service 层编写,异常处理和统一响应暂时不需要考虑~

async checkOrigin() {

 const { ctx } = this;

 const { signature, timestamp, nonce, echostr } = ctx.query;

 const result = await ctx.service.weChat.checkSignature(

   signature,

   timestamp,

   nonce,

 );

 ctx.body = result ? echostr : '';

}


async token() {

 const { ctx } = this;

 ctx.body = await ctx.service.weChat.getToken();

}


async ticket() {

 const { ctx } = this;

 ctx.body = await ctx.service.weChat.getTicket();

}


async signature() {

 const { ctx } = this;

 const { url } = ctx.request.body;

 ctx.body = await ctx.service.weChat.genSignature(url);

}

3.5 移植服务层:

在 app 目录下新建 service/WeChat.js并移植对应代码~

3.5.1 常量 APPID 和 APPSECRET 改为使用环境变量读取:

  1. const APPID = process.env.APPID;
  2. const APPSECRET = process.env.APPSECRET;

3.5.1 对象缓存应用:

微信提供的 access_tokenticket都有频率限制,不适合每次都直接调用微信所提供的接口,我们在没有 Redis 等这种数据存储的情况下可以考虑使用对象缓存来实现access_tokenticket的缓存,实现接口的降频处理~

const cache = {

 token: {

   access_token: undefined,

   expires_in: 0,

   last_time: 0,

 },

 ticket: {

   ticket: undefined,

   expires_in: 0,

   last_time: 0,

 },

};


export default class WeChat extends Service {}

4. 验证云函数执行情况:

4.1 创建 Vue 项目:

  1. 执行yarn create vite 创建;
  2. 添加 js-sdk 脚本到 index.html:

<script src="http://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

  1. 安装axios完成接口数据交换;

4.2 移植前端代码:

重复的就不要再写了,copy 一下~

<script setup>

import { ref } from "vue";

import axios from "axios";

const message = ref("");

const status = ref("");

axios

 .post(`http://wx.it200.cn/signature`, {

   url: location.href.split("#")[0],

 })

 .then((res) => {

   const { appId, nonceStr, signature, timestamp } = res.data;

   console.log("[ res ] >", appId, nonceStr, signature, timestamp);

   wx.config({

     debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。

     appId, // 必填,公众号的唯一标识

     timestamp, // 必填,生成签名的时间戳

     nonceStr, // 必填,生成签名的随机串

     signature, // 必填,签名

     jsApiList: ["updateAppMessageShareData"], // 必填,需要使用的 JS 接口列表

   });

   wx.error((res) => {

     message.value = res.errMsg;

   });

   wx.ready(() => {

     wx.checkJsApi({

       jsApiList: ["updateAppMessageShareData"], // 需要检测的 JS 接口列表,所有 JS 接口列表见附录2,

       success: (res) => {

         wx.updateAppMessageShareData({

           title: "我的掘金", // 分享标题

           desc: "我在掘金输出前端知识~", // 分享描述

           link: "https://juejin.cn/user/3966693685871694", // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致

           imgUrl:

             "https://p9-passport.byteacctimg.com/img/user-avatar/71ca4682501063257d8413ff726105a0~300x300.images", // 分享图标

           success: function () {

             status.value = "设置成功";

           },

         });

       },

     });

   });

 });

</script>

<template>

 <h3 v-if="message">{{ message }}</h3>

 <h3 v-else>

   点击右上角=>分享给朋友

   <h5>{{ status }}</h5>

 </h3>

</template>

4.3 重新配置环境变量和触发器:

当我们把代码每次 push 到远程等待部署成功后,上一次配置的环境变量和触发器就丢失了,问题是由于代码库里面的 s.yaml 配置文件覆盖导致的,这个文件就留给有心的小伙伴研究研究怎么样~

4.4 验证云函数执行:

在微信开发者工具中正常打开前端项目页面后,会先直接 token 获取票据获取合成验签三步,在前端拿到验签数据后正常初始化 wx.config ,并提示授权成功~

5. 总结

微信 SDK 授权服务的上云就算是暂时搞定了,前前后后折腾的时间不短,尝试了多次,这一次是最顺利的,云函数在没有服务器的情况下对于前端开发者应该还是很友好的(相比于服务器操作来说),要不要一起来踩坑呢?后面还会对接上一篇的【消息通知】来实打实的将这个服务应用起来~


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
10月前
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
825 30
|
8月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
475 0
|
10月前
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
298 0
|
消息中间件 运维 Serverless
函数计算产品使用问题之如何部署Stable Diffusion Serverless API
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
10月前
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
1838 117
|
运维 Cloud Native Serverless
Serverless Argo Workflows大规模计算工作流平台荣获信通院“云原生技术创新标杆案例”
2024年12月24日,阿里云Serverless Argo Workflows大规模计算工作流平台荣获由中国信息通信研究院颁发的「云原生技术创新案例」奖。
|
人工智能 运维 Serverless
云端问道8期方案教学-基于Serverless计算快速构建AI应用开发
本文介绍了基于Serverless计算快速构建AI应用开发的技术和实践。内容涵盖四个方面:1) Serverless技术价值,包括其发展趋势和优势;2) Serverless函数计算与AI的结合,探讨AIGC应用场景及企业面临的挑战;3) Serverless函数计算AIGC应用方案,提供一键部署、模型托管等功能;4) 业务初期如何低门槛使用,介绍新用户免费额度和优惠活动。通过这些内容,帮助企业和开发者更高效地利用Serverless架构进行AI应用开发。
285 1
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
299 1
|
运维 监控 Serverless
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
140 1

热门文章

最新文章