本章内容出自《15分鐘打造你自己的小程式》電子書, 點選下載下傳完整版
教你開發擷取運動步數小程式
本教程介紹如何使用小程式Serverless服務開發一個支付寶運動小程式。借助運動資料功能,小程式在獲得使用者許可的情況下,可以擷取使用者最近30天内的運動步數,步數資訊會在使用者進入小程式時更新。
說明:本場景的小程式Demo需要使用螞蟻金服開放平台企業賬号。單擊
這裡進行申請。
步驟一:簽約支付寶開放能力
參考以下步驟,在螞蟻金服開放平台簽約運動資料能力:
- 使用支付寶開發者賬号登入 螞蟻金服開放平台 開發中心。
- 在左側導航欄單擊開發管理。
教你開發擷取運動步數小程式 - 在小程式詳情開發管理頁面的能力清單中,單擊右上角添加能力按鈕,添加運動資料能力。
運動資料能力需要簽約才能生效,在小程式上線後,單擊功能清單右側立即簽約。簽約完成後,需要1個工作日左右的審批時間(審批結果會以短信和郵件形式告知),審批成功後,功能狀态會變為已生效。
步驟二:開發支付寶小程式
請參考以下步驟,開發支付寶小程式項目:
- 打開小程式開發者工具。
- 在左側導航欄選擇支付寶 > 小程式。
- 單擊模闆選取,然後單擊全部頁簽,選擇運動步數并單擊下一步。
教你開發擷取運動步數小程式 - 設定項目名稱和路徑,然後單擊完成。
- 打開手機支付寶App掃描彈出的登入二維碼。登入後,選擇已建立的支付寶小程式應用完成關聯,然後單擊确定。
- 當提示綁定阿裡雲賬号時,單擊前往綁定阿裡雲賬号,然後在打開的驗證頁面選擇一種賬号驗證方式并完成驗證。或右鍵單擊左側的server|未關聯目錄,然後選擇關聯Serverless。
說明:確定您要綁定的阿裡雲賬号已關聯支付寶賬号。如果尚未關聯,在
阿裡雲賬号頁面,單擊第三方賬号綁定綁定支付寶。
- 在項目檔案清單中找到app.js檔案,配置以下資訊,然後儲存。
- appId是小程式的ID。您可以在螞蟻金服開放平台的支付寶小程式頁面檢視App ID。
- spaceId、clientSecret和endpoint在 小程式Serverless控制台 建立服務空間後可以獲得。
教你開發擷取運動步數小程式
- 修改server/functions/stepdecryption/index.js檔案下的 aesSecret 。
- 選中server/functions/stepdecryption目錄的代碼作為雲函數進行上傳和部署 。
-
- 右鍵單擊functions目錄,選擇建立雲函數,輸入stepdecryption回車。
-
- 右鍵單擊stepdecryption,選擇部署雲函數。
-
步驟三:調試小程式
打開小程式模拟器,在彈出的服務授權框中仔細閱讀《使用者授權協定》後選擇同意。
小程式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控制台處獲得
});
-
全局使用mpserverless和授權
在調用小程式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) => {
},
});
-
調用Serverless雲函數傳入相關參數進行解密
以下代碼調用了雲函數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
}
}
}
}