天天看點

教你開發擷取運動步數小程式

本章内容出自《15分鐘打造你自己的小程式》電子書, 點選下載下傳完整版

教你開發擷取運動步數小程式

本教程介紹如何使用小程式Serverless服務開發一個支付寶運動小程式。借助運動資料功能,小程式在獲得使用者許可的情況下,可以擷取使用者最近30天内的運動步數,步數資訊會在使用者進入小程式時更新。

說明:本場景的小程式Demo需要使用螞蟻金服開放平台企業賬号。單擊

這裡

進行申請。

步驟一:簽約支付寶開放能力

參考以下步驟,在螞蟻金服開放平台簽約運動資料能力:

  1. 使用支付寶開發者賬号登入 螞蟻金服開放平台 開發中心。
  2. 在左側導航欄單擊開發管理。
    教你開發擷取運動步數小程式
  3. 在小程式詳情開發管理頁面的能力清單中,單擊右上角添加能力按鈕,添加運動資料能力。

運動資料能力需要簽約才能生效,在小程式上線後,單擊功能清單右側立即簽約。簽約完成後,需要1個工作日左右的審批時間(審批結果會以短信和郵件形式告知),審批成功後,功能狀态會變為已生效。

教你開發擷取運動步數小程式

步驟二:開發支付寶小程式

請參考以下步驟,開發支付寶小程式項目:

  1. 打開小程式開發者工具。
  2. 在左側導航欄選擇支付寶 > 小程式。
  3. 單擊模闆選取,然後單擊全部頁簽,選擇運動步數并單擊下一步。
    教你開發擷取運動步數小程式
  4. 設定項目名稱和路徑,然後單擊完成。
  5. 打開手機支付寶App掃描彈出的登入二維碼。登入後,選擇已建立的支付寶小程式應用完成關聯,然後單擊确定。
  6. 當提示綁定阿裡雲賬号時,單擊前往綁定阿裡雲賬号,然後在打開的驗證頁面選擇一種賬号驗證方式并完成驗證。或右鍵單擊左側的server|未關聯目錄,然後選擇關聯Serverless。

說明:確定您要綁定的阿裡雲賬号已關聯支付寶賬号。如果尚未關聯,在

阿裡雲賬号

頁面,單擊第三方賬号綁定綁定支付寶。

教你開發擷取運動步數小程式
  1. 在項目檔案清單中找到app.js檔案,配置以下資訊,然後儲存。
    • appId是小程式的ID。您可以在螞蟻金服開放平台的支付寶小程式頁面檢視App ID。
    • spaceId、clientSecret和endpoint在 小程式Serverless控制台 建立服務空間後可以獲得。
      教你開發擷取運動步數小程式
  2. 修改server/functions/stepdecryption/index.js檔案下的 aesSecret
  3. 選中server/functions/stepdecryption目錄的代碼作為雲函數進行上傳和部署 。
      1. 右鍵單擊functions目錄,選擇建立雲函數,輸入stepdecryption回車。
      1. 右鍵單擊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
      }
    }
  }
}           

繼續閱讀