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区号。