前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >巧用腾讯云云函数快速生成小程序码

巧用腾讯云云函数快速生成小程序码

作者头像
薛定喵君
修改2023-09-24 17:03:46
1.1K0
修改2023-09-24 17:03:46
举报
文章被收录于专栏:薛定喵君薛定喵君

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

# 前言

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

# 程序思路

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

# 核心代码

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

  • 信息已脱敏处理,放入了环境变量
代码语言:javascript
复制
'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')
    }
};

# 访问示例地址

http://tcb.xuedingmiao.com/mp_code?page=pages/blog/main&scene=tcb_mp_code.md

# 参考资料

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 前言
  • # 程序思路
  • # 核心代码
  • # 访问示例地址
  • # 参考资料
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档