当小程序需要获取用户的手机号码时,可以通过微信提供的云函数来获取。以下是具体的步骤:
1. 添加云函数
首先我们需要在小程序的开发者工具中添加云函数。具体的步骤如下:
- 在开发者工具中,点击左侧的“云开发”选项卡。
- 点击“开通云开发”按钮以开启云开发功能。
- 点击“创建新环境”按钮以创建一个新的云开发环境。
- 在左侧的“云开发”选项卡下,选择“云函数”选项卡。
- 点击“创建云函数”按钮以创建一个新的云函数。
2. 编写云函数代码
创建好云函数后,我们需要编写代码来实现获取手机号码的功能。具体的代码实现如下:
// index.js
const cloud = require('wx-server-sdk')
cloud.init()
exports.main = async (event, context) => {
const { userInfo, encryptedData, iv } = event
const { appId, openId } = userInfo
const { env } = context
const db = cloud.database({ env })
const collection = db.collection('users')
const secretData = await cloud.callFunction({
name: 'getPhoneNumber',
data: {
appId,
openId,
encryptedData,
iv,
},
})
const phoneNumber = secretData.phoneNumber
await collection.doc(openId).update({
data: {
phoneNumber,
},
})
return {
phoneNumber,
}
}
在上面的代码中,我们首先通过传入的参数 userInfo
获取到用户的 appId
和 openId
。然后我们调用另一个云函数 getPhoneNumber
来解密用户的手机号码。最后,我们将获取到的手机号码保存到云数据库中,并返回给调用者。
3. 编写 getPhoneNumber 云函数代码
下面是 getPhoneNumber 云函数的代码:
// getPhoneNumber.js
const cloud = require('wx-server-sdk')
const crypto = require('crypto')
cloud.init()
exports.main = async (event, context) => {
const { appId, encryptedData, iv } = event
const skey = await getWXSessionKey(appId, context)
const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(skey, 'base64'), Buffer.from(iv, 'base64'))
let decoded = decipher.update(Buffer.from(encryptedData, 'base64'), 'binary', 'utf8')
decoded += decipher.final('utf8')
return {
phoneNumber: JSON.parse(decoded).phoneNumber,
}
}
async function getWXSessionKey(appId, context) {
const db = cloud.database({ env: context.env })
const collection = db.collection('wxSessionKeys')
const docId = `${appId}-${context.OPENID}`
const doc = await collection.doc(docId).get()
return doc.data.skey
}
在上面的代码中,我们使用 crypto
模块中的 createDecipheriv
函数来解密用户的手机号码。具体的解密流程是:
- 首先从我们的云数据库(
wxSessionKeys
集合)中获取用户的session_key
。 - 然后使用
createDecipheriv
函数创建一个解密器,传入skey
、iv
以及需要解密的数据encryptedData
。 - 使用
update
方法传入需要解密的数据,最后调用final
方法获取解密后的数据。 - 将解密后的数据解析成 JSON 对象,取出其中的
phoneNumber
字段并返回给调用者。
4. 调用云函数获取手机号码
最后一步是在小程序中调用我们编写的云函数来获取用户的手机号码。具体的调用方式如下:
wx.cloud.callFunction({
name: 'index',
data: {
userInfo: wx.getUserInfo(),
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
},
success: (res) => {
const phoneNumber = res.result.phoneNumber
// 在这里处理逻辑
},
})
在上面的代码中,我们调用了云函数 index
,并传入了调用 wx.getUserInfo
方法获取到的用户信息,以及获取到的加密数据 encryptedData
和 iv
。当云函数执行成功后,返回的结果包含用户的手机号码,我们可以在 success
回调函数中获取到手机号码并处理逻辑。
示例1:下面是一段获取手机验证码的示例代码:
wx.cloud.callFunction({
name: 'sendSms',
data: {
phoneNumber: phoneNumber,
},
success: (res) => {
console.log('验证码发送成功')
},
})
在上面的代码中,我们调用了一个名为 sendSms
的云函数,将用户手机号码传递给云函数,云函数会向该手机号码发送短信验证码。如果短信发送成功,则会在控制台打印出“验证码发送成功”的信息。
示例2:下面是一段校验短信验证码的示例代码:
wx.cloud.callFunction({
name: 'checkSms',
data: {
phoneNumber: phoneNumber,
code: code,
},
success: (res) => {
console.log('验证码校验成功')
},
})
在上面的代码中,我们调用了一个名为 checkSms
的云函数,将用户手机号码和短信验证码传递给云函数,云函数会校验验证码是否正确。如果校验成功,则会在控制台打印出“验证码校验成功”的信息。
以上就是微信小程序利用云函数获取手机号码的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序利用云函数获取手机号码 - Python技术站