开发者社区> CodeSample> 正文

获取运动步数快速示例

简介: 本文将介绍如何使用小程序Serverless服务开发一个支付宝运动小程序,借助运动数据功能,小程序在获得用户许可的情况下,可以获取用户最近30天内的运动步数,步数信息会在用户进入小程序时更新。

准备工作

在开始前,确保您已经完成以下准备工作:
  • 注册支付宝企业开发者账号。

    如果您尚未注册支付宝小程序账号,使用支付宝账号登录蚂蚁金服开放平台,并完成企业开发者身份注册。详细信息,请参见开发者入驻说明

  • 下载并安装支付宝小程序开发者工具。

    详细信息,请参见下载说明

  • 已安装 nodejs开发环境。

步骤一:开通小程序云服务

  1. 登录小程序云控制台
  2. 云产品开通页面,单击《小程序云服务协议》链接。小程序云服务开通
  3. 在阅读后,勾选我已阅读并同意《小程序云服务协议》复选框,然后单击立即开通

步骤二:创建服务空间

小程序开发中创建的云资源会和服务空间进行关联。每个服务空间都有一个全局唯一的space ID。在使用云资源时,都通过这个space ID进行关联。参考以下步骤,创建服务空间并设置数据库权限:

  1. 小程序云控制台的左侧导航栏,单击小程序Serverless > 服务空间管理
  2. 单击创建服务空间,输入服务空间名称,然后单击确定
  3. 创建成功后,单击详情查看space ID、secret和endpoint信息。

步骤三:创建支付宝小程序应用

参考以下步骤,在蚂蚁金服开放平台创建支付宝小程序:

  1. 使用支付宝账号登录蚂蚁金服开放平台进入开发者中心。
  2. 选择小程序应用,然后单击创建应用并根据引导创建一个小程序应用。
  3. 在左侧导航栏单击设置
  4. 单击开发设置,在开发信息下的接口加签方式区域配置支付宝公钥。

    您可以通过RSA密钥生成工具一键生成小程序密钥。接口加签方式有普通公钥和证书公钥两种,主要用于签名和验证。其中私钥由开发者保存,公钥可对外公开,私钥用于签名,公钥用于验证签名。开发者需要保存自己的私钥,通过支付宝提供的公钥进行通信来保证信息传输的完整性以及发送者身份的真实性。详细信息,请参见生成支付宝RSA密钥

  5. 在小程序详情开发管理页面的功能列表中,单击右上角添加功能按钮,添加小程序支付
    运动数据功能需要签约才能生效,在小程序上线后,单击功能列表右侧 立即签约。签约完成后,需要1个工作日左右的审批时间(审批结果会以短信和邮件形式告知),审批成功后,功能状态会变为 已生效(如下图所示)。

步骤四:添加支付宝小程序

在开发前,您需要将支付宝小程序信息添加到阿里云小程序Serverless控制台。

完成以下操作,添加支付宝小程序信息:

  1. 登录小程序云控制台
  2. 左侧导航栏,单击小程序Serverless > 设置
  3. 单击支付宝页签,然后单击添加
  4. 输入您的私钥,即步骤四中生成的小程序RSA私钥。
  5. 输入支付宝公钥,支付宝公钥从蚂蚁金服开放平台->开发中心->设置->开发设置->开发信息中的接口加签方式中查看获取。

步骤五:获取模板代码

  1. 打开小程序开发者工具,在首页小程序模板的开放能力分类中选择运动步数模板。
  2. 单击下一步,设置项目名称和项目路径,完成项目创建。

步骤六:快速体验

  1. 在小程序开发者工具中登录支付宝开发者账号,然后关联对应的小程序。
  2. client/pages/app.js中对应的如下小程序配置项改为用户自己的参数。
    appId: '2021*********', // 小程序应用标识
    spaceId: 'ca8eb10f-26c1-4bee-**********', // 服务空间标识
    clientSecret: 'Xckz2************', // 服务空间 secret key
    endpoint: 'https://api.************' // 服务空间地址,从小程序Serverless控制台处获得 					
    appId即在小程序Serverless中设置的AppId,spaceId、clientSecret、endpoint参数请查看小程序云服务空间详情,请参见步骤二。
  3. 修改server/functions/stepdecryption/index.js文件下的 aesSecret
  4. 选中server/functions/stepdecryption目录的代码作为云函数进行上传和部署 。
    1. 右键单击functions目录,选择新建云函数,输入stepdecryption回车。
    2. 右键单击stepdecryption,选择部署云函数部署成功相当于完成云函数的代码发布,部署前注意区分测试环境和生产环境。
保存文件后,打开IDE的模拟器,就可以预览运动小程序了,在小程序中可以实时获取并展示用户的运动步数。至此,我们已经完成了一个简单的小程序的搭建,并将最核心的能力使用小程序 Serverless开发完成。

小程序Serverless代码详解

  1. 初始化

    在使用小程序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控制台处获得
    });
  2. 全局使用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'
        })
      },
    });
  3. 获取步数的加密数据

    以下代码调用了my.getRunData支付宝开放能力API,获取用户最近30天内的运动步数,更多信息请参见my.getRunData

    await my.getRunData({
      countDate: `${date.getFullYear()}-${month}-${day}`,
      success: (res) => {
        console.log(res.response)
      },
      fail: (res) => {
      },
      complete: (res) => {
      },
    });
  4. 调用Serverless云函数传入相关参数进行解密

    以下代码调用了云函数stepdecryption将my.getRunData接口的返回结果进行解密。

    mpserverless.function.invoke('stepdecryption', {
      "step": res.response,
    })
  5. nodejs云函数解密代码

    以下为云函数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
          }
        }
      }
    }
分享:
若有任何问题或疑惑,请反馈给我们 立即提问