CodeSample小助手 2020-04-02
如果您尚未注册支付宝小程序账号,使用支付宝账号登录蚂蚁金服开放平台,并完成企业开发者身份注册。详细信息,请参见开发者入驻说明。
详细信息,请参见下载说明。
小程序开发中创建的云资源会和服务空间进行关联。每个服务空间都有一个全局唯一的space ID。在使用云资源时,都通过这个space ID进行关联。参考以下步骤,创建服务空间并设置数据库权限:
参考以下步骤,在蚂蚁金服开放平台创建支付宝小程序:
您可以通过RSA密钥生成工具一键生成小程序密钥。接口加签方式有普通公钥和证书公钥两种,主要用于签名和验证。其中私钥由开发者保存,公钥可对外公开,私钥用于签名,公钥用于验证签名。开发者需要保存自己的私钥,通过支付宝提供的公钥进行通信来保证信息传输的完整性以及发送者身份的真实性。详细信息,请参见生成支付宝RSA密钥。
在开发前,您需要将支付宝小程序信息添加到阿里云小程序Serverless控制台。
完成以下操作,添加支付宝小程序信息:
appId: '2021*********', // 小程序应用标识
spaceId: 'ca8eb10f-26c1-4bee-**********', // 服务空间标识
clientSecret: 'Xckz2************', // 服务空间 secret key
endpoint: 'https://api.************' // 服务空间地址,从小程序Serverless控制台处获得
在使用小程序Serverless服务前,需要您在小程序中安装小程序Serverless客户端SDK并初始化。小程序Serverless客户端SDK的更多信息请参见安装客户端SDK2.2版本。
//client/app.js
import MPServerless from '@alicloud/mpserverless-sdk';
const mpserverless = new MPServerless({
uploadFile: my.uploadFile,
request: my.request,
getAuthCode: my.getAuthCode,
}, {
appId: ' ', // 小程序应用标识
spaceId: ' ', // 服务空间标识
clientSecret: ' ', // 服务空间 secret key
endpoint: ' ' // 服务空间地址,从小程序Serverless控制台处获得
});
在调用小程序Serverless服务前,需要先调用authorize接口请求授权,支付宝小程序的授权请求参数authProvider应为alipay_openapi, 更多信息请参见authorize。
以下代码将实例化的mpserverless对象放入全局对象中以便全局使用,并在第一次打开小程序时进行服务授权。
//client/app.js
App({
mpserverless,
async onLaunch(options) {
// 第一次打开
await mpserverless.user.authorize({
authProvider: 'alipay_openapi',
// authType: 'anonymous'
})
},
});
以下代码调用了my.getRunData支付宝开放能力API,获取用户最近30天内的运动步数,更多信息请参见my.getRunData。
await my.getRunData({
countDate: `${date.getFullYear()}-${month}-${day}`,
success: (res) => {
console.log(res.response)
},
fail: (res) => {
},
complete: (res) => {
},
});
以下代码调用了云函数stepdecryption将my.getRunData接口的返回结果进行解密。
mpserverless.function.invoke('stepdecryption', {
"step": res.response,
})
以下为云函数stepdecryption代码,先将密文进行base64解码,然后使用aes-128-cbc算法解密,得到解密后的utf8明文。
'use strict';
const crypto = require('crypto');
const aesSecret = ''; // AES密钥
module.exports = async (ctx) => {
const step = ctx.args.step;
if (!step) {
return {
success: false,
error: {
code: 'InvalidParameter',
message: '待解密部署不能为空'
}
}
}
try {
ctx.logger.info('[args]', ctx.args);
const crypted = Buffer.from(step, 'base64').toString('binary');
const key = Buffer.from(aesSecret, 'base64');
const iv = Buffer.alloc(16, 0);
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
let decoded = decipher.update(crypted, 'binary', 'utf8');
decoded += decipher.final('utf8');
return {
success: true,
data: decoded
}
} catch (e) {
ctx.logger.error(e);
return {
success: false,
error: {
code: 'DecipheStepFail',
message: e.message
}
}
}
}