13.7 开放能力

开通了云开发的小程序可以使用Cloud.CloudID接口返回一个 CloudID(开放数据 ID)特殊对象,将该对象传至云函数就可以获取其对应的开放数据,比如获取微信运动的步数、手机号等开放数据,而这个功能如果是使用非云开发的方式除了需要处理登录的问题,还需要进行加解密,十分繁琐。

13.7.1 获取微信步数

获取微信运动步数的小程序接口为wx.getWeRunData,可以获取用户过去三十天微信运动步数。使用可开发者工具新建一个页面页面比如openData,然后在openData.wxml里输入一个button按钮:

<button bindtap="getWeRunData">获取微信步数</button>

然后再在openData.js里输入以下代码,我们用事件处理函数getWeRunData来调用wx.getWeRunData接口,并打印结果。

getWeRunData(){ wx.getWeRunData({ success: (result) => { console.log(result) }, }) }

编译之后,点击按钮,我们可以在控制台看到返回的res对象里有encryptedData包括敏感数据在内的完整用户信息的加密数据、iv加密算法的初始向量, cloudID敏感数据对应的云 ID.

{errMsg: "getWeRunData:ok", encryptedData: "ABeBwlCHs....6PvAax", iv: "g8QPFXTLLD3N6Zn3YiuwEQ==", cloudID: "30_jVhZr_Up-8_TV...kgP8yJ8ykN0I"}

这个cloudID只有在开通了云开发的小程序才会返回,我们可以将cloudID传入云函数,通过云调用就可以直接获取开放数据。 使用开发者工具新建云函数比如opendata,再index.js里输入以下代码,并部署上线,在云函数端接收到的 event 将会包含对应开放数据的对象。

const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }) exports.main = async (event, context) => { return event }

我们再来在前面的事件处理函数getWeRunData里上传经过cloud.CloudID接口获得的cloudID对象,然后调用opendata云函数,并在success里打印返回来的对象,就可以看到包含微信运动步数的对象啦:

getWeRunData(){ wx.getWeRunData({ success: (result) => { console.log(result.cloudID) wx.cloud.callFunction({ name: 'opendata', data: { weRunData: wx.cloud.CloudID(result.cloudID), }, success:(res)=>{ console.log(res.result.weRunData.cloudID) console.log(res.result.weRunData.data.stepInfoList) } }) } }) }

13.7.2 获取用户手机号

要获取用户的手机号,需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据,如果开通了云开发,就能在回调对象了获取到cloudID。使用开发者工具在openData.wxml里输入如下代码:

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>

然后再在openData.js里输入以下代码,我们打印事件处理函数getPhoneNumber返回的结果。

getPhoneNumber (result) { console.log("result内容",result.detail) },

同样我们也会获得一个类似于微信运动步数的返回结果

{errMsg: "getPhoneNumber:ok", encryptedData: "Aw+W76TSvYAPS.....g==", iv: "9wSepi6qx...=", cloudID: "30_sSext5q.....qmLQ"}

我们仍然只需要将获取到cloudID经过cloud.CloudID()接口处理返回的对象上传并调用云函数:

getPhoneNumber (result) { wx.cloud.callFunction({ name: 'opendata', data: { getPhoneNumber: wx.cloud.CloudID(result.detail.cloudID), }, success:(res)=>{ console.log("云函数返回的对象",res.result.getPhoneNumber) } }) },

在getPhoneNumber的data对象里的phoneNumber是用户绑定的手机号(国外手机号会有区号)、purePhoneNumber是没有区号的手机号、countryCode区号。