小程序云开发时效数据刷新和存储 (access_token等)

1.问题描述

小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数据。本文以小程序云开发使用百度API接口为例,介绍access_token定时刷新和请求机制。

下面是百度调用身份证识别的一段需求,需要传的参数需要有access_token。

请求示例

HTTP 方法:POST

请求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard

URL参数:

参数
access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

access_token 是具有时效性的数据,每次请求一次接口就进行一次请求刷新,显然是对计算机资源的极大浪费,且影响效率。

2.问题解决方案

2.1.云数据库配置

新建一个云数据库名为setconfig。作为配置型信息存储数据库,类似access_token的数据都可以向其中存储。

对access_token配置下列字段:

  1. _openid (你的openid* 必填)
  2. config_name (配置名,填access_token)
  3. value (access_token的值,默认为null)

id会自动生成,配置完效果如下(这个value是已经更新后的值)

2.2 定时云函数配置

阅读access_token获取的文档,可知,我们需要请求一个地址来获取access_token的值。

获取Access_Token

请求URL数据格式

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&

实现

我们需要在云函数中模拟请求,并根据返回结果刷新云数据库中的access_token值。

想要运行通过该程序,需要开发者自己去百度创建账号并创建应用。

云函数index.js

// 云函数入口文件 index.js
const cloud = require('wx-server-sdk') cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
var request = require('request')
// 定时器
exports.main = async(event, context) => {
const appkey = '填写你的百度AppKey';
const appsecret = '填写你的百度AppSecret';
var url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + appkey + '&client_secret=' + appsecret;
return new Promise((resolve, reject) => {
request({
url: url,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
}, function(error, response, body) { if (!error && response.statusCode == 200) {
console.log('通行证为' + body.access_token)
resolve(body.access_token)
//记得修改.doc('xxx') 中的内容
db.collection('setconfig').doc('aaaf5a56-1dd9-4e50-974b-34688fa47b20').update({
data: {
value: body.access_token
} }).then(res => {
console.log('调用完成')
console.log(res)
})
}
})
})
}

docid是setconfig生成的,每个人不同注意修改

还有一种更新写法,不过更推荐使用上面的方法,效率更高,且稳定。

db.collection('setconfig').where({
config_name:'access_token'
}).update({
data: {
value: body.access_token
}
})

云函数config.json(定时触发器功能实现)

{
"triggers": [
{
"name": "myTrigger",
"type": "timer",
"config": "0 0 2 * * * *"
}
]
}

云函数整体结构为:

然后上传并部署(云端安装依赖)。

2.3 小程序端获取Access_token

在小程序进入相应界面的时候,请求云数据库,获取access_token

onLoad: function (options) {
//页面初始化
var that = this;
db.collection('setconfig').where({
config_name:'access_token'
}).get({
success(res){
that.setData({
access_token:res.data[0].value
})
//console.log(res.data[0])
},
fail(res){
wx.showToast({
title: '请求失败,无法通过扫描填充数据',
})
}
})
},

3. 参考资料

[1]百度AI鉴权认证机制

[2]微信小程序云开发数据库update函数更新不了数据的问题

[3]小程序云开发定时触发器

小程序开发相关问题欢迎联系QQ 1025584691

小程序开发技巧(三)-- 云开发时效数据刷新和存储 (access_token等)的更多相关文章

  1. 微信小程序开发技巧总结 (一)-- 数据传递和存储

    结合自己在平时的开发中遇到的各种问题,和浏览各种问题的解决方案总结出一些自己在日常开发中常用的技巧和知点,希望各位不吝斧正. 1.短生命周期数据存储 以小程序启动到彻底关闭为周期的的数据建议存储在ap ...

  2. 微信小程序入门笔记-使用云开发(4)

    1.云数据库 一.介绍 云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象.一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数 ...

  3. 使用wepy开发微信小程序商城第三篇:购物车(布局篇)

    使用wepy开发微信小程序商城 第三篇:购物车(布局篇) 前两篇如下: 使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 基于上两篇内容,开始 ...

  4. 微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)

    微信小程序仿朋友圈功能开发(发布.点赞.评论等功能) 1.项目分析 项目整体分为三个部分 发布 展示 详情页 graph LR 朋友圈发布 --内容发布--> 内容展示 内容展示 --点击展示卡 ...

  5. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  6. 微信小程序基于腾讯云对象存储的图片上传

    在使用腾讯云对象存储之前,公司一直使用的是传统的FTP的上传模式,而随着用户量的不断增加,FTP所暴露出来的问题也越来越多,1.传输效率低,上传速度慢.2.时常有上传其他文件来攻击服务器,安全上得不到 ...

  7. 微信小程序集成腾讯云 IM SDK

    微信小程序集成腾讯云 IM SDK 1.背景 因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也 ...

  8. 小程序实践(三):九宫格实现及item跳转

    效果图: 实现效果图红色线包含部分的九宫格效果,并附带item点击时间. --------------------------------------------------------------- ...

  9. 微信小程序把玩(三十三)Record API

    原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...

随机推荐

  1. MySQL导入及导出数据库

    一.数据库导入 背景:已经从A机器把SQL文件导出,现在需要将sql文件导入B机器(两台机器都是Linux系统) 将sql文件上传到B机器,然后在B机器命令行执行以下命令(不用进入到数据库) 前提是t ...

  2. 简单的使用httpclient读取网页html例子

    public void clientPost(String url) {  /* 1 生成 HttpClinet 对象并设置参数*/    HttpClient httpClient=new Http ...

  3. space sniffer

    space sniffer 一款检测本地磁盘文件占用情况的工具,高效,快速.

  4. Do jobs|permanent|secure job|Move|Look after|provide sb with sth|Move|Enjoy a good time|Learn about|Be fond of|Have a clearer idea|String quarter|Be subject to|A has little with B|Pigment

    Do jobs|work jobs Long-terms|permanent Gain jobs/secure job Move|go to |stay in |live in|settle down ...

  5. OneDrive for Business

    一.界面介绍 1.在Office 365主页 点击“OneDrive”登陆 2.进入OneDrive,可对文档进行存储.同步并共享文档. 3.点击,可对文档进行编辑.分享.重命名等操作 二.文档同步 ...

  6. python学习笔记(11)文件操作

    一.读文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...

  7. Centos防火墙开启端口

    linux系统对外开放80.8080等端口,防火墙设置 我们很多时候在liunx系统上安装了web服务应用后(如tomcat.apache等),需要让其它电脑能访问到该应用,而Linux系统(cent ...

  8. Mac下通过FFMpeg实现Android手机推流和播放

    一.Mac下搭建推流服务器(Nginx+RTMP+FFMpeg) 安装x264 git clone git://git.videolan.org/x264.git cd x264 ./configur ...

  9. Typescript - 类型断言

    原文:TypeScript基本知识点整理 零.序言 类型断言,可以用来手动指定一个值的类型. 给我的感觉,和 java 中的强制类型转换很像. 常常和联合类型配合使用,如: // 错误示例 funct ...

  10. axios统一封装

    本文代码参考了网上别人的资料,经过修改而来 /** * Created by zxf on 2017/9/6. * 封装统一的ajax请求,统一拦截请求,对不同的请求状态封装 * 通常说, ajax ...