ITPub博客

首页 > 应用开发 > > 使用小程序Serverless开发支付宝小程序

使用小程序Serverless开发支付宝小程序

作者:u_509a2a8fdb46 时间:2019-10-15 11:34:59 0 删除 编辑

开发者干货分享 



简介: 小程序Serverless产品,提供包括云函数、数据存储、文件存储等一整套后端服务。

【作者简介】

奥沙,蚂蚁金服智能科技高级开发工程师,曾就职于飞猪,长期从事java后端开发工作,熟悉小程序云后端相关产品使用及研发流程。【Serverless简介】

阿里云小程序云产品,提供了无服务端模式Serverless和有服务端模式云应用,两种小程序后端云服务。

小程序Serverless产品,提供包括云函数、数据存储、文件存储等一整套后端服务。

开发者通过API方式即可获取云函数、数据存储、文件存储、音视频、图像处理等服务,不需要关心服务器或底层运维设施,可以更专注于代码和业务本身。

阿里云用户在开通小程序云产品之后,在支付宝小程序中增加相关配置即可使用Serverless进行DB、文件的存储和访问,以及利用云函数在服务端完成复杂的计算和操作。

【小程序开发】

1、支付宝小程序准备

支付宝小程序开发就不详细介绍了,从创建小程序,到开发、提审官网有详尽的文档和示例。

参见阿里云Serverelss关于小程序开发流程的指导文档。

生成小程序公私钥

由于Serverless需要以开发者身份访问支付宝OpenAPI,用于获取C端用户信息等,所以需要在Serverless中录入小程序的私钥和支付宝公钥。参见支付宝秘钥生成文档。

2、IDE小程序开发

开发流程Serverless官方文档已有详尽的流程指导,以下主要记录开发过程中的一些需要注意的点。

2.1 添加Serverless SDK依赖

可以修改package.json,添加依赖{"@alicloud/mpserverless-sdk": "^2.1.2"}。也可以下载Serverless官方Demo,在Demo基础上修改。

2.2 引入Serverless

在app.js中引入Serverless全局对象,即可在所有Page中直接引用,用于调用DB、File、云函数接口。

2.3 配置App页面列表

2.4 获取用户信息

小程序中关于数据和文件的读写,都需要关联到使用小程序的当前C端用户。

PS:Serverless获取的用户信息,是Serverless域所使用的userId和授权oAuthUserId等信息,不包括用户头像和昵称等,如需获取用户头像等信息,需要调用JSAPI “my.getAuthUserInfo”或者"my.getOpenUserInfo"获取。

Serverless获取用户信息示例代码如下。支付宝授权code 10分钟有效,所以需要保证在查询用户信息前通过user.authorize接口刷新授权code(支付宝颁发给开发者的)。

// 先获取用户授权(如用户未授权会弹窗唤起授权窗口)
const res = await app.serverless.user.authorize({
 authProvider: 'alipay_openapi'
}).catch(console.error);
if (res && res.success) {
 console.log('授权成功');
 const userInfo = await app.serverless.user.getInfo({
 authProvider: 'alipay_openapi',
 }).catch(console.error);
 if (userInfo.success) {
 console.log('getUserInfo res', userInfo);
 app.user = userInfo.result.user;
 this.setData({ user: userInfo.result.user });
 }
}


获取用户头像的JSAPI

my.getAuthCode({
scopes: ['auth_user'],
success: authcode => {
 console.info('getUserInfo authcode', authcode);
 my.getAuthUserInfo({
 success: res => {
 console.log('auth userinfo', res);
 that.setData({ appUser: res });
 }
 });
}
});


2.5 Serverless 数据读写操作

此处仅示例查询和insert操作,其他接口参见Serverless阿里云文档即可。

数据库查询

app.serverless.db.collection('decisions').find(
 { userId: this.data.user.userId }, // 查询条件
 { sort: { createTime: -1 } }, // 时间降序排列
).then(res => {
 console.log('loadList result', res);
 if(res.success && res.result){
 this.setData({ 
 decisionlist: res.result,
 });
 }
}).catch(console.error);
数据库插入
var insertData = {
 name: this.data.name, 
 userId: this.data.user.userId,
 oAuthUserId: this.data.user.oAuthUserId,
 items,
 createTime: new Date(),
 updateTime: new Date(),
};
console.log('add new decision', insertData);
res = await app.serverless.db.collection('decisions').insertOne(insertData);


2.6 文件上传

my.chooseImage({
 chooseImage: 1,
 success: res => {
 const path = res.apFilePaths[0];
 const options = {
 filePath: path,
 headers: {
 contentDisposition: 'attachment',
 },
 };
 app.serverless.file.uploadFile(options).then((image) => {
 console.log(image);
 this.setData({
 imageUrl: image.fileUrl,
 });
 }).catch(console.log);
 },
});


2.7 云函数

IDE内集成了云函数相关的操作。PS:由于历史原因,需要安装旧的Serverless SDK,"@ant-basement/miniprogram-sdk": "^2.2.24"。

设置云服务类型

在工程根目录下增加文件mini.project.json

{
 "cloud": {
 "type": "BASEMENT"
 }
}


编写&部署云函数

小程序开发注意事项

1、不能在首屏唤起用户授权。

需要用户了解小程序内容后,才能在业务流程中唤起用户授权,否则提审会直接不通过。

所以不能在App.onLoad中调用my.getAuthCode或者serverless.authorize接口。

2、my.navigateTo接口最多只能递归调用10次

小程序页面栈最多十层,超过后调用无反应。

所以不能让页面有循环调用navigateTo的场景。不需要【返回】的页面直接用redirectTo重定向即可。

3、JSAPI建议使用异步接口

同步调用体检会不通过。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69927062/viewspace-3144072/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-08

  • 博文量
    210
  • 访问量
    38