首页 > 编程语言 >腾讯云TCB云函数生成小程序码

腾讯云TCB云函数生成小程序码

时间:2022-11-10 20:31:55浏览次数:80  
标签:函数 tokenInfoNew expires access token let time 腾讯 TCB


本文记录如何使用腾讯云云函数生成小程序码



  • ​​前言​​
  • ​​程序思路​​
  • ​​核心代码​​
  • ​​访问示例地址​​
  • ​​参考资料​​


​​#​​ 前言

之前写过一篇​​小程序云函数生成小程序码​​的文章,里面介绍了通过云调用wxacode.get 来生成小程序码的方法,因为采用的是小程序云开发,云调用是免服务端鉴权的,在云函数中使用云调用调用服务端接口无需换取 access_token,只要是在从小程序端触发的云函数中发起的云调用都经过微信自动鉴权,可以在登记权限后直接调用如发送模板消息等开放接口,所以比较方便,但是如果使用腾讯云云开发的话情况就变成了服务端调用了,需要自己在服务端进行小程序全局 access_token 获取,上一篇文章我们介绍了​​腾讯云云函数实现小程序全局 access_token 刷新​​ ,这就意味着我们拿到了接口调用凭证,接下来的操作就方便了。

​​#​​ 程序思路

在云函数内获取接口调用凭证,根据传入参数(如页面路径、scene 值等)直接请求生成小程序码的接口返回图片 buffer 即可。

​​#​​ 核心代码

请求小程序全局 access_token 并使用云数据库进行缓存,调用 ​​wxacode.getUnlimited​​ 来生成永久小程序码并返回至前端,具体代码如下。

  • 信息已脱敏处理,放入了环境变量
'use strict';
const cloudbase = require("@cloudbase/node-sdk");
const rp = require('request-promise')
const app = cloudbase.init({
env: process.env.env
});
const db = app.database();
const appId = process.env.appId
const appSecrect = process.env.appSecrect
const tokenForUrl =
'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appId + '&secret=' + appSecrect
const qrcodeUrl =
'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='
exports.main = async (event, context) => {
let param = {}
if (event.queryStringParameters) {
param = { ...event.queryStringParameters }
} else {
param = { ...event }
}
let tokens = await db
.collection('access_tokens')
.get()
let codeToken = ''
if (tokens.data.length > 0) {
let expires_time = tokens.data[0].expires_time
if (parseInt(Date.now() / 1000) > expires_time + 3600) {
let tokenInfoNew = await rp({ url: tokenForUrl })
tokenInfoNew = JSON.parse(tokenInfoNew)
let expires_time = parseInt(Date.now() / 1000)
await db
.collection('access_tokens')
.doc(tokens.data[0]._id)
.update({
access_token: tokenInfoNew.access_token,
expires_time: expires_time
})
codeToken = tokenInfoNew.access_token
} else {
codeToken = tokens.data[0].access_token
}
} else {
let tokenInfoNew = await rp({ url: tokenForUrl })
tokenInfoNew = JSON.parse(tokenInfoNew)
let expires_time = parseInt(Date.now() / 1000)
await db.collection('access_tokens').add({
access_token: tokenInfoNew.access_token,
expires_time: expires_time
})
codeToken = tokenInfoNew.access_token
}
const codeOptions = {
method: 'POST',
url: qrcodeUrl + codeToken,
body: {
page: param.page || 'pages/index/main',
width: 280,
scene: param.scene || 'a=1',
},
json: true,
encoding: null,
}
let buffer = await rp(codeOptions)
return {
isBase64Encoded: true,
statusCode: 200,
headers: {
"content-type": "image/png"
},
body: buffer.toString('base64')
}
};

​​#​​ 参考资料

标签:函数,tokenInfoNew,expires,access,token,let,time,腾讯,TCB
From: https://blog.51cto.com/xuedingmaojun/5842023

相关文章

  • 云函数扫盲
    记录一些云函数的基础知识,混个脸熟不少同学总是问关于云函数的问题,所以这里发个扫盲的文章吧。​​#​​云函数是啥?云函数作为无服务模式的一种实现(FaaS)已经有很多公司......
  • Java8新特性—四大内置函数式接口
    ......
  • C语言 函数02 自定义函数的参数
    实际参数(实参):真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。形......
  • [JavaScript-09]闭包函数
    1.闭包函数//闭包函数vara=123;functionf1(){console.log(a);varb=234;functionf2(){console.log(b);}returnf2;}......
  • 腾讯蓝鲸智云版本再迎新升级,正式推出容器化部署版本V7.0
    蓝鲸版本再迎新升级,面向社区用户推出蓝鲸智云V7,全平台支持容器化部署(基于kubernetes),带来全新的“桌面”(PaaS平台),支持AIX操作系统管控(节点管理,管控平台),支持高危语句拦截(作业......
  • C语言 函数01 函数的定义与分类
    函数定义:维基百科对函数的定义:是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返......
  • 腾讯蓝鲸智云版本再迎新升级,正式推出容器化部署版本V7.0
    蓝鲸版本再迎新升级,面向社区用户推出蓝鲸智云V7,全平台支持容器化部署(基于kubernetes),带来全新的“桌面”(PaaS平台),支持AIX操作系统管控(节点管理,管控平台),支持高危语句拦截(作......
  • C语言函数指针示例
      1#include<stdio.h>23doubleadd(doublea,doubleb)4{5returna+b;6}78doublesub(doublea,doubleb)9{10returna-......
  • 结构体函数
    结构体函数可以说是一个可以自己创建函数,看需求,比如说数组只能存放同类型的数据,那么结构体就是可以定义不同类型的变量存放数据。structStudent类型struct关......
  • C语言里的几个拷贝函数memcpy、memset、strcpy、strncpy
    #include<string.h>1. src和dest所指内存区域不能重叠,函数返回指向dest的指针。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度void*memc......