分类 Serverless 下的文章

从今天开始,我会文字直播开发这个驾校小程序整个流程。

1. 项目要求

  1. 小程序端
  2. WEB管理后台
  3. 时间在最短的时间内上线

    2. 项目功能
    参考驾考宝典、主栏目分为科目一、科目四、满分学习、注销恢复、资格证,包含小车、客车、摩托车等,功能包含视频讲解、章节练习、模拟考试、错题、收藏等等。 支持支付、分享、提成、提现等

    3. 项目选型
    由于要求最快时间内上线,我们小程序选择 Serverless架构。 这里使用以下技术产品

小程序端:

  1. Bmob后端云+iview
  2. VUE + Bmob后端云

Bmob后端云,自带了支付,生成二维码等接口,这里集成可以快速上线。VUE 有丰富的后台模板,可以更快的做出管理后台。

第一步:清晰了解需求
因为已经很清楚自己要做的是驾校答题小程序,这里就不做多余的介绍了。 设计部分,由于这个项目比较小,没有专门的设计师。 尽量参考行业老大:驾校一点通与驾考宝典。

第二步:数据库设计
数据库参考其他驾考类小程序,优先把核心字段建立出来,尽量考虑周全, 不够后面再补。 这里注意的是,Serverless架构,主要适合做一些中小型应用,如果应用数据量很大, 尽量提前考虑分表。

1. 数据表
目前第一阶段暂时考虑一下表

  1. 题目表
  2. 题目类别表(题形)
  3. 错题表
  4. 收藏表
  5. 成绩表
  6. 用户表

用户表,由于Bmob系统自带了,我就不建立了。

2. 数据库文档
由于使用Bmob后端云数据库,默认每条记录都带id、创建时间与更新时间,此数据表说明不带这2个字段。

题目表(question)

| 名称 | 类型 | 描述 | | --------- | ------ | ------------------------------------------------------------ | | title | string | 题目名称 | | choseList | Array | 选择列表 [{"item":"选选一"},{"item":"选选二","isChose":true}] | | type | int | 类型 1.单选 2.多选 3.判断 | | pic | string | 图片地址 | | video | string | 视频地址 | | help | string | 帮助描述 | | bSubjects | int | 所属科目 1.科目一 2.科目四 | | bModels | int | 所属车型 1.小车 2.货车 3.客车 4.摩托车 | | bType | string | 所属类别 关联类别表 |


设计好数据表之后,做准备工作

  1. 拿到小程序的 AppID填写到Bmob控制台,应用设置-》应用配置
  2. 把上面所有想好建立好的数据表添加到数据库
  3. 小程序开发工具新建一个空白项目,复制BmobSDK,到utils目录
  4. 引入SDK,初始化。

引入SDK,初始化。文档在这里

[https://bmob.github.io/hydrogen-js-sdk//?id\=初始化](https://bmob.github.io/hydrogen-js-sdk//?id\=初始化)

看最终效果如下。

效果一:所写代码➕预览

效果二:数据表变化

这样我们就实现了,整个小程序开发的第一步,自动注册登陆,获取openid。 第一节就到这里,下一步就是操作业务表。

由于知乎对md支持不太好,大家如果觉得格式差,可以点击浏览器阅读模式。

公众号邀请返利开发,通过Faas,一个函数即可实现微信授权返回昵称头像。

APP里有个注册页面,希望互相转发微信,邀请返利。 为了方便传播,注册页面单独用H5页面实现。 为了提高邀请用户质量,提高邀请用户的有效性,我们强制要求微信里面打开才能注册。所以基于公众号开发。 为了快速开发,这里使用Bmob云Serverless 里的Faas服务与文件CDN存储服务。

1.准备材料

  1. 公众号
  2. Bmob云Serverless
  3. 支持自己域名(需备案)

    2.设置公众号
    一、设置AppSecret值
    开发者ID(AppID)

开发者密码(AppSecret)

二、设置白名单
IP白名单

image.png

三、设置授权域名
接口权限,登陆,找到网页授权域名

四、设置调试微信开发者
开发者工具-》web开发者工具 【这个跟小程序一样的工具】,添加微信到开发者,最多可以绑定50个

image.png

3.开发过程
一、注册Bmob账号
二、创建一个应用

image.png

三、点击进入云函数
编写微信获取用户昵称代码

image.png

四、新建云函数
云函数getOpenId 获取用户openid,拿到openid调用getUserInfo获取用户信息云函数

function onRequest (request, response, modules) {

  var code = request.body.code ? request.body.code : '011jOWiN0vmFa42ynziN0B6bjN0jOWir'

  //获取数据库对象
  var db = modules.oData;
  var functions = modules.oFunctions;

  //http请求方式: GET
  var appid = '';
  var secret = '';
  var url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' + appid + '&secret=' + secret + '&code=' + code + '&grant_type=authorization_code';
  //获取Http模块
  var http = modules.oHttp;

  //发起Get请求
  http(url, function (error, res, body) {
    if (!error && res.statusCode == 200) {
      //写入数据库
      var resultObject = JSON.parse(body);
      //如果返回错误则打印
      if (resultObject.errcode) {
        response.send(resultObject);
      }

      functions.run({
        "name": "getUserInfo",
        "data": { "openid": resultObject.openid, "access_token": resultObject.access_token }
      }, function (err, data) {
        //回调函数
        
     
        response.send(data);
      });

    }
  });

}

getUserInfo云函数

function onRequest (request, response, modules) {
  var db = modules.oData;
  var openid = request.body.openid || 'ol2Ey0tePs0fdFdVRZKqzu50_83c';
  var access_token = request.body.access_token || 'xxxx';

  getUserInfoMp(openid, access_token);

  function getUserInfoMp (openid, access_token) {
    var http = modules.oHttp;
    http('https://api.weixin.qq.com/sns/userinfo?access_token=' + access_token + '&openid=' + openid + '&lang=zh_CN', function (error, res, body) {
      if (!error && res.statusCode == 200) {
        var at = JSON.parse(body);
        response.send(body);

      }
      response.send(body);
    
  });
}
}

获取头像昵称开发完成
五.运行流程介绍

image.png

用户打开一个url,这个url打开后会提示用户是否授权,同意后跳转到自己的网址,并带上code。

(URL地址)[https://open.weixin.qq.com/connect/oauth2/authorize?appid\=wxbafdda995607cc\&redirect\_uri\=https://goldenage.xxxxx.com/\&response\_type\=code\&scope\=snsapi\_userinfo\&state\=STATEwechat\_redirect](https://open.weixin.qq.com/connect/oauth2/authorize?appid\=wxbafdda995607cc\&redirect\_uri\=https://goldenage.xxxxx.com/\&response\_type\=code\&scope\=snsapi\_userinfo\&state\=STATEwechat\_redirect)

redirect\_uri参数关键:指定统一授权后打开的网址,接下来就1步,通过code拿到openid。上面函数getOpenId就可以拿到openid,如果需要昵称头像,可以调用第二个云函数getUserInfo

[https://mp.weixin.qq.com/wiki?action\=doc\&id\=mp1421140842\&t\=0.356007856098852443](https://mp.weixin.qq.com/wiki?action\=doc\&id\=mp1421140842\&t\=0.356007856098852443))

六.如何调用

image.png

https://cloud.bmob.cn/19b475f87c366db2/getOpenId
方法:post
参数:code: 微信code
返回:
{"openid":"ol2Ey0tePs0fdFdVRZKqzu50_83c","nickname":"magic","sex":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/DYAIOgq83epySXbnQqg4MialjffKNKbxj42prvL2aIaIFbs3pj7svlT4gbQeQPbricZNBGYWfv1zcOo86fjwc99Q\/132","privilege":[]}}

总结:
相比自己服务器开发优势,成本低,速度快。 基于Serverless,的Faas 只需要一个函数,即可实现用户openid功能。如果熟悉,整个微信开发不需要10分钟。这里有个用户点击授权的页面是HTML的,这个HTML我们可以用CDN云存储,把静态html页面保存到文件里面,支持绑定自己域名,让用户访问。 整个开发,不需要购买服务器,ip,环境,微信设置好,一个函数,暴露接口就可以实现。

前端网页调用效果截图:

image.png

Serverless代表无服务器计算技术崛起,是微服务的一种表现形式。传统paas喜欢把FaaS(Function as a service) 就称之为Serverless,其实是不对的。单纯的Faas 能做的事是很有限的,一个微服务的应用没法完全依靠FaaS 运行起来, 必须得配合一些其他的服务,例如应用常见的文件、数据库、推送等服务。

作者更认为 Faas+Baas\=Serverless ,Serverless架构是BaaS实现的进一步升级,让应用适用于更多的场景。

目前国内推动Serverless 主要是阿里云、腾讯云、华为云等云厂商,大家看到国外 AWS Lamdba 做的比较成功,纷纷推出对应产品。

虽然大家对Serverless 技术看法不一样,但大家对他的优点认同是一样的。免运维、低成本、弹性应对流量。最大的缺点与厂商平台绑定,这个是所有Serverless都没法避免的。即使厂商平台想不绑定也不行,所以选择信誉好、企业成立时间长的平台尤为重要。

到今天(2018-05-23)为止我们看国内阿里云、腾讯云、华为云三大云厂商Serverless 已经逐渐成熟,但是还是没什么人用。什么原因?

我觉得是应用开发配套不够,要开发一个应用不是缺这个就是那个服务。目前这三家做的最好是阿里,他们的服务在不断完善中。

这里我就拿阿里举例,其他2个厂商也差不多是这样。看下图

Faas 支持多功能

  1. 首先推出Faas ,把他定位为 Serverless 解决应用开发中的问题。
  2. Faas 推出来后,不能只是输出个hello world! 或者说我这函数计算能力有多强吧
  3. 这时推出函数图像处理服务,像裁剪、压缩、分发等文件处理, 这个是因为阿里本身有文件服务,带API,所以云函数整合API即可调用。
  4. 顺便把公司内其他带API服务的产品,也整合,所以你看像敏感语音检测、对象存储(OSS)、转码、API网关等带API 调用服务也整合进来,这样Faas 就有了他的一些价值
  5. 这样Faas 写的代码,可以操作一些服务。这些API服务,曾经我们都需要在自己应用或者自己服务端操作,如果能写到Faas ,可以一定程度减少工作量。

大家可以看出,阿里这种他是从Faas发展出一些能力,慢慢增加,例如文件服务、网关服务、短信服务、云数据库服务、支付服务等等

文件服务、网关服务、短信服务、云数据库服务、支付服务等等这些是什么?
这就是Baas 是为APP提供整个配套的Baas , 最终不管是否叫Baas平台,但从Faas 的发展,逐渐完成了把这些服务整合为一个Baas服务。

目前函数FaaS(Function as a service)服务大家都有了,Serverless是否实用,就看大家把应用后端开发相关服务,需要的BaaS(后端即服务:Backend as a Service)相关功能,整合的是否易用,如果做到了,那Serverless就达到了厂家所宣称的低成本开发 , 否则按照目前这三家企业Faas的技术使用成本,是超过我自己购买云主机用后端语言写我需要的业务的成本。

这里我们看下Baas厂商是怎么做的

BaaS(后端即服务:Backend as a Service)+Faas(函数即服务 Function as a service)+SDK 形成一套应用服务。 有Baas+faas为什么还要一套SDK,没有SDK,一样是可以调用后端服务。

这里举个例子。在小程序里面,同样是需要给一个客户发送一条验证码短信。

不用SDK的代码:

wx.request({
url: '[http://api.bmob.cn/sms](http://api.bmob.cn/sms)', //仅为示例,并非真实的接口地址
data: {
phone: '1388888888' ,
},
header: {
'content-type': 'application/json' // 默认值
'appid':'1'
},
success: function(res) {
console.log("短信发送成功")
}
fail:function(res){
console.log("短信发送失败")
}
})

使用SDK的代码

Bmob.requestSmsCode(1388888888).then(function (res) {
console.log('短信发送成功');
})
.catch(function (error) {
console.log('短信发送失败');
});

下面代码明显简单易读一些,更麻烦的是小程序是这样发起请求的,快应用是另外的,H5又是ajax的,他们虽然传的参数一样,但请求写法完全不一样。这时如果你是用SDK, 微信小程序、H5、支付宝小程序、快应用、游戏Cocos、混合App等平台都是这一份代码调用。没SDK需要关心平台变化,代码又得重新,大量节约开发周期。这就是SDK的价值,提升开发效率。也是 Serverless 必不可少的一环。

大家都在讲Serverless效率更快,企业支付成本更低。成本我们先不谈,因为目前都是函数没运行不收费,虽然实用性还不够,前期有补贴,Faas相比docker实例暂时价格优势很明显。这个在未来还有待观察。我们讲Serverless 开发产品效率

这个链接,是阿里Serverless的一个真实例子,10分钟构建微信小程序。

[https://yq.aliyun.com/articles/435430?spm\=a2c4e.11153959.teamhomeleft.198.591748f2cvDStU](https://yq.aliyun.com/articles/435430?spm\=a2c4e.11153959.teamhomeleft.198.591748f2cvDStU)

代码开源在[https://github.com/awesome-fc/wx-demo](https://github.com/awesome-fc/wx-demo)

大家觉得可能吗,如果你能用Faas 10分钟对接好微信支付,已经是够快了。就这页代码[https://github.com/awesome-fc/wx-demo/blob/master/server/weixin/pay.py](https://github.com/awesome-fc/wx-demo/blob/master/server/weixin/pay.py) 10分钟能写出这一页代码,都是神一样的人物。何况还是构建整个微信小程序服务端。

这个例子最大的作用是告诉大家,Faas 也可以做出你之前PHP、JSP、.net 等后端语言做出一样强的功能,并且我是无需自己去部署服务端运行环境, 弹性伸缩计算。 单纯从开发的角度上来说, 使用自己熟悉PHP或其他后端语言开发效率,目前肯定比Faas 开发效率高。什么情况会比自己写后端语言效率更高,这个我前面讲过,当整合整套Baas 服务后,个别功能服务,会比自己用后端语言写更高效率。

这里我拿Bmob举个栗子:我要每小时采集一次IT之家接口数据,并且写入到数据库

[https://apiquan.ithome.com/api/post?categoryid\=0\&type\=0\&orderTime\=1526981875455\&visistCount\=\&pageLength\=](https://apiquan.ithome.com/api/post?categoryid\=0\&type\=0\&orderTime\=1526981875455\&visistCount\=\&pageLength\=)

Serverless Faas 服务代码:

function onRequest(request, response, modules) {
var http \= modules.oHttp;
var url \= '[https://apiquan.ithome.com/api/post?categoryid\=0\&type\=0\&orderTime\=1526981875455\&visistCount\=\&pageLength\=](https://apiquan.ithome.com/api/post?categoryid\=0\&type\=0\&orderTime\=1526981875455\&visistCount\=\&pageLength\=)'
http(url, function(error, res, body) {

//结果转为对象类型
var results \=JSON.parse(body);

var arr \= [];
//循环更新数据
for (var i in results) {
newdata \= {
"method": "post",
"path": "/1/classes/post",
"body":results[i]
};
arr.push(newdata)
}

//获取数组对象
var bat \= modules.oBatch;
//批量操作
bat.exec({
"data": {
"requests": arr
}
}, function (err, data) {
//回调函数
response.end(data);
return;
});

response.end(JSON.stringify(results.length));
});
}

Faas 在线写入这个代码,执行一次即可采集一次数据到数据库。当然这个方法也是支持链接访问,链接地址: curl -X GET [http://cloud.bmob.cn/8b46e79dd49843f6/caiji](http://cloud.bmob.cn/8b46e79dd49843f6/caiji) 或者SDK加密调用。定时任务也是完全没问题的

更多这篇教程,可以看这里[https://www.jianshu.com/p/e6ef296261c8](https://www.jianshu.com/p/e6ef296261c8) 。如果熟悉nodejs,几分钟写出来,绝对不成问题。

虽然阿里不会直接面对中小团队去做SDK,或者小程序、快应用的Faas功能封装,但其他后端方案,跟随着时间推移,相信阿里的Faas 会整个更多后端开发的服务功能,形成好用一套Serverless 解决方案,目前能调用的服务有限,操作有些复杂,大家可以去尝尝鲜。

【Serverless架构】小程序云实现原理分析

小程序基于最新的Serverless架构,无论官方称之为什么,特征都属于Baas或者Serverless服务。

整个小程序云服务,包含了,客户端嵌入SDK,封装云函数上传命令,服务端主要在Faas云函数内部封装了openid、文件存储请求全局系统对象,方便大家请求微信与腾讯云接口, 云函数数据库操作,沿用了客户端SDK,由于JavaScript跨平台特性,js代码可以直接放到node里面执行,云函数里的wx-server-sdk,其实就是客户端的SDK。 客户端wx.cloud, 相当于微信开发工具写入了全局变量wx.cloud\=wx-server-sdk库。

我们从客户端到服务端的顺序分析

客户端-》中间层-》数据库

1.客户端SDK
目前客户端大家是不需要自己引入的,直接写入开发工具对象,只要微信基础库版本到达 2.2.3 或以上的就可以使用

其实还有个服务端SDK,在云函数。

看不见的wx.cloud对象,cloud对象,是一个js SDK,通过jssdk赋值给全局对象, 由于云函数的数据库操作方法写法与客户端一致,我们可以猜测,客户端SDK,与云函数的wx-server-sdk库 是同一个库。

我们对比下2者的代码

  1. 客户端 (小程序开发工具)
db.collection('todos').doc('<some-todo-id>').get().then(res => {
  // res.data 包含该记录的数据
  console.log(res.data)
})
  1. 服务端 (Faas)
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
exports.main = async (event, context) => {
  try {
    return await db.collection('todos').doc('<some-todo-id>').get()
  } catch(e) {
    console.error(e)
  }
}

核心代码

客户端
db.collection('todos').doc('<some-todo-id>').get()

服务端
return await db.collection('todos').doc('<some-todo-id>').get()

可以看到2者操作是相同的,只不过服务端用了es7的await异步对象,可以return 拿到结果集合。而客户端使用了 Promise风格,如果反编译微信开发工具,在wx.cloud对象里面,一定是可以找到大量与wx-server-sdk一模一样的代码。

2. 中间层封装
当我们开发登陆的时候,第一步需要拿到openid,客户端会请求云函数,云函数请求微信接口,最终返回openid,可我们看到云函数里面并不需要我们去请求微信的接口,而是直接event.userInfo.openId返回了openid。

看代码

exports.main = (event, context) => {
  console.log(event)
  console.log(context)

  // 可执行其他自定义逻辑
  // console.log 的内容可以在云开发云函数调用日志查看

  return {
    openid: event.userInfo.openId,
  }
}

这里帮我们省略了很多代码,原本的流程是需要通过客户端code换区openid

接口地址:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

抓包看下,测试出来,只要访问这个地址,即可访问openid

https://servicewechat.com/wxa-qbase/qbasecheckresult?event_id=HKnup_IMP8wWCsHwx0UyYsJMU0YPQm7u8eERg7Ll0wGB9CMSBtppMnu4P6Ytr6DFG2Vl_EGZS3nyEBw15OPCERLEi4Ok0HWC6g

返回结果

{
    "base_resp": {
        "ret": 0
    },
    "status": 1,
    "content": "{\"openid\":\"oWPQH0WVoCkpiw3ErLYAIVnudjfA\"}",
    "service_errcode": 0,
    "service_errmsg": "",
    "func_req_id": "0f9c7a3f-b63c-11e8-b8ac-525400e8849e"
}

可以看到, 只要带一个参数event\_id,就可以拿到openid, 云函数return的内容,会在返回的content字段表现。

在请求从客户端,到达服务器之后,服务器获取到openid,记得这个openid比较特殊里有个情况是, 任何请求到服务器,都会获取openid, 第一次会从微信接口获取,写入到内存,第二次会直接从内存取。 这里用redis的情况可能性比较大。第二次请求直接取redis 值就可以了。 取到后写入event.userInfo对象。

所以在任何云函数里,只要event.userInfo.openId,你都可以拿到openid。授权后,event.userInfo还包含头像等其他信息。

其他云函数的操作,都封装在wx-server-sdk 这个代码,大家可以在每个云函数的依赖node\_modules目录找到, 大家开发时遇到错误,也不要急,这里有个看错误技巧。

以 6 开始的是由微信服务器侧产生的错误码
以 5 开始的是由腾讯云侧产生的错误码
以 4 开始的是本地 SDK 产生的错误

3.数据库
​ 文档很多地方使用了,文档,集合概念,操作数据库传入参数也是mongodb的风格,很明显的使用了非关系类型,Mongodb数据库。 每个应用一个Collection。 云数据相当于Mongodb UI控制台。连显示结构也没改。

相比之前的Wafer套件,可以说这次是一个全新的解决思路。跟Bmob一样实现一个人全栈小程序开发,唯一效率比Bmob低的是,这个人必须掌握nodejs,Bmob的服务如果做小程序,相比小程序云,大部分需求是不需要掌握nodejs。

总结:
​ 整套可以理解为mongodb+Faas的结合,封装了数据存储操作SDK。 与阿里的Serverless服务一样,以Faas为核心, Faas目前内置只封装了openid,去掉了定时任务,网关等功能,任何功能自己通过faas去实现,但只限定小程序内调用。相比阿里的Serverless 更贴地气,因为这次有了客户端SDK,再加云函数SDK,让Serverless找了到落地的可能。


最后脑洞问题:能否自己用阿里云Serverless 搭建一个小程序云?

答案是可以

mongodb+Faas目前阿里的都有,并且目前阿里Faas功能更强大,唯一差个小程序客户端操作数据库的SDK。未来有机会,可以出个教程如何使用Faas实现一套自己的小程序-云

什么是微信开发第一步?

微信公众平台开发第一步详解

如果有人问你,微信体系下,开放平台、公众号、小程序开发第一步是做什么?

我的回答是获取微信access_token。access\_token是公众号的全局唯一接口调用凭据, 没有凭据后面的其他接口,都没法调用。

公众号调用各接口时都需使用access\_token。开发者需要进行妥善保存。access\_token的存储至少要保留512个字符空间。access\_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access\_token失效。

官方文档地址:
[https://mp.weixin.qq.com/wiki?t\=resource/res\_main\&id\=mp1421140183](https://mp.weixin.qq.com/wiki?t\=resource/res\_main\&id\=mp1421140183)

接口地址

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明

参数是否必须说明grant\_type是获取access\_token填写client\_credentialappid是第三方用户唯一凭证secret是第三方用户唯一凭证密钥,即appsecret

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

调试工具
微信官方为了大家开发公众号时,提供大家的开发效率,特地给开发者上线了一套调试工具

[https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t\=index\&type\=](https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t\=index\&type\=)基础支持\&form\=获取access\_token接口%20/token

功能实现
这个功能,只需要调用这个接口,然后返回access\_token,我们就不搭建Liunx,PHP,node等环境,直接用当今流行的Serverless 相关平台的Faas(云函数)功能。 这里使用的是Bmob后端云,当然你用阿里、腾讯、华为等等厂商支持Faas(云函数) 功能的都可以,只是语法稍微有点不同,这些开发小程序、公众号都可以。 比自己搭建服务器要快很多。

前期准备
第一步:准备配置信息
登陆微信平台

[https://mp.weixin.qq.com/](https://mp.weixin.qq.com/)

进入开发-》基本配置

image.png

拿到

开发者ID(AppID)与开发者密码(AppSecret),开发请求时需要用到。

第二步:编写云函数
首先你有个Bmob后端应用,点击进入云函数。选择模板创建,当然你也可以自己变。

云函数

自己编写代码,我们有一点javascript基础,或者java基础都可以。这里介绍下Nodejs

文档地址:[http://doc.bmob.cn/cloud\_function/web/develop\_doc/http\_1](http://doc.bmob.cn/cloud\_function/web/develop\_doc/http\_1)

HTTP请求对象
oHttp对象可以模拟实现get、post、put、delete等各种HTTP请求信息,让你在云端实现诸如数据采集、OAuth授权登录等功能。Bmob的HTTP请求模块采用Nodejs提供的request模块,这里提供简单的Get和Post的操作实例。更多的功能详细参考:https://npmjs.org/package/request/**
*发起Get请求
*///获取Http模块var http = modules.oHttp;//发起Get请求http('https://www.bmob.cn', function (error, res, body) {
    response.send(body);
});

-
/**
*发起Post请求
*///获取Http模块var http = modules.oHttp;
var options = {
  "url": 'https://api.bmob.cn/1/classes/GameScore',
  "headers": {
    'X-Bmob-Application-Id': 'Your Application ID',
    'X-Bmob-REST-API-Key': 'Your REST API Key',
    'Content-Type': 'application/json'  },
  "body":JSON.stringify({"score":1337,"playerName":"Sean Plott"})
};
http.post(options, function(error, res, body) {
    response.send(body);
});

微信access\_token,这里只需要发起一个get请求,地址是这样。

[https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t\=index\&type\=](https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t\=index\&type\=)基础支持\&form\=获取access\_token接口%20/token

/**
*发起Get请求
*///获取Http模块var http = modules.oHttp;
var url ="https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=基础支持&form=获取access_token接口%20/token";//发起Get请求http(url, function (error, res, body) {
    response.send(body);
});

不到10行代码,我们就可以拿到微信开发必备的access\_tokenaccess\_token微信是有次数限制的,当然不能这么每次获取使用, 这样只要请求次数多,每月必定超出微信给的次数。 微信官方说:access\_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access\_token失效, 那我们就给这个函数的结果保存到数据库,做个定时任务2小时执行一次。然后需要时读取数据库,这样就不会担心超了。

第三步:access\_token保存数据库
我们在控制台建一个WeiXin\_access\_token表,增加access\_token字段,里面随便增加一条记录,拿到id,用来更新这条记录。当然你也可以把每次获取的access\_token插入到这个表,需要的时候获取到最新的一条。

云函数数据表操作文档:[http://doc.bmob.cn/cloud\_function/web/develop\_doc/\_9](http://doc.bmob.cn/cloud\_function/web/develop\_doc/\_9)

function onRequest (request, response, modules) {

  //获取数据库对象  var db = modules.oData;
  //这里放到表里的ID  var objectId = 'NJEi333B';

  //http请求方式: GET  var appid = 'wxd1b8c236059cd569';
  var secret = 'c18a43c67c81400980624c03c5f11a34';
  var url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + secret;
  //获取Http模块  var http = modules.oHttp;
  //发起Get请求  http(url, function (error, res, body) {
    if (!error && res.statusCode == 200) {
      //写入数据库      var resultObject = JSON.parse(body);
      //如果返回错误则打印      if (resultObject.errcode) {
        response.send(resultObject);
      }
        
    //更新到数据表      db.update({
        "table": "WeiXin_access_token",
        "objectId": objectId,
        "data": { "access_token": resultObject.access_token }
      }, function (err, data) {
        response.send("success" + data);
      });

    }
  });
  //获取微信access_token END

}

第四步:读取access\_token暴露给其他平台调用

新建个空白云函数,里面编写一下代码

function onRequest(request, response, modules) {//数据库对象    var db = modules.oData;
    //查询一条数据   db.findOne({
       "table":"WeiXin_access_token",
       "objectId":"NJEi333B"   },function(err,data){
        //JSON打印给客户端       response.send(data);
   });
}

这里是代码的执行结果,需要预览,可以打开一下链接。

http://cloud.bmob.cn/3fbee3a417249ddf/token

一样不到10行代码,即可暴露access\_token给其他平台调用。

总计不到20行代码,不需要10分钟,就可以实现微信整个access\_token的维护,与暴露给其他平台使用。最后还有一个关键问题, 2小时自动刷新access\_token

第四步:自动刷新access\_token
Bmob平台云函数支持liunx下面的crontab语法定时任务,当然国内其他公司的云函数也是支持定时任务的,具体看开发文档。

[http://doc.bmob.cn/cloud\_function/web/timing\_tasks/](http://doc.bmob.cn/cloud\_function/web/timing\_tasks/)

image.png

总结:
我们可以看到Serverless的Faas 开发微应用,开发效率比传统自己购买云主机,云数据库。高出很多倍。以至于国内这2年,阿里、腾讯、华为等云厂商都推出了自己的Faas 服务。大家都可以去体验一下,上线速度是否比自己购买的云主机更快,你只需要关系业务代码,不再需要去了解框架、运维、底层相关技术。