虚拟账号绑定的手机号并非真实手机号,对于部分需要手机号验证的小程序,优先考虑使用真实账号测试解决手机验证码问题,具体可以参考 使用真实账号测试
如果确实需要虚拟账号支持,可以通过小程序的代码中增加Mock手机号的逻辑,实现通过手机号验证的功能。
虚拟账号Mock手机号具体流程如下:
# Mock流程
- 小程序获取手机号信息
code
/encryptedData
- 解密后得到明文的手机号信息
purePhoneNumber
- 手机号属于虚拟测试号绑定手机号(12066600001, 12066600002, 12066600003, 12066600004),则替换成需要mock的手机号码
# 新版本Mock示例
从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级,以下是新版本接口的mock指南
- 通过
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
绑定的getPhoneNumber
方法获取到code
# 通过业务后台Mock手机号
- 业务后台通过服务接口phonenumber.getPhoneNumber HTTPS 调用
消费
code
获取到手机号信息phone_info
- 获取到的手机号信息
phone_info.purePhoneNumber
在[12066600001, 12066600002...]中的,替换成业务需要的手机号,如13400000001
# 通过云服务Mock手机号
- 云函数中调用
wx-server-sdk
的openapi.phonenumber.getPhoneNumber
接口,通过code
获取手机号信息phoneInfo
- 获取到的手机号信息
phoneInfo.purePhoneNumber
在[12066600001, 12066600002...]中的,替换成业务需要的手机号,如13400000001
- 代码示例
// 云函数 getPhoneNumber
// getPhoneNumber/index.js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
// 获取phoneNumber云函数入口函数
exports.main = async (event, context) => {
const res = await cloud.openapi.phonenumber.getPhoneNumber({
code: event.code
})
if (["12066600001", "12066600002"].indexOf(res.phoneInfo.purePhoneNumber) > -1) {
const mockPhoneInfo = {
countryCode: "86",
phoneNumber: "13400000001",
purePhoneNumber: "13400000001",
watermark: res.phoneInfo.watermark
}
return mockPhoneInfo
}
return res.phoneInfo
}
// 小程序
// getPhoneNumber.wxml
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
// getPhoneNumber.js
Page({
async getPhoneNumber(res) {
const result = await wx.cloud.callFunction({
name: 'getPhoneNumber',
data: {
code: res.detail.code
}
})
console.log("phone info is:", result.result)
}
})
# 旧版本Mock示例
对于基础库小于 2.21.2 的旧版本的兼容方案
- 通过
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
绑定的getPhoneNumber
方法获取到加密的手机信息encryptedData
,iv
,cloudID
# 通过业务后台Mock手机号
- 业务后台通过加密数据解密算法解密出手机号信息
phone_info
- 获取到的手机号信息
phone_info.purePhoneNumber
在[12066600001, 12066600002...]中的,替换成业务需要的手机号,如13400000001
# 通过云服务Mock手机号
- 云函数中调用
wx-server-sdk
的getOpenData
接口,通过cloudID
获取手机号信息phoneInfo
- 获取到的手机号信息
phoneInfo.purePhoneNumber
在[12066600001, 12066600002...]中的,替换成业务需要的手机号,如13400000001
- 代码示例
// 云函数 getOpenData
// getOpenData/index.js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
// 获取openId云函数入口函数
exports.main = async (event, context) => {
const res = await cloud.getOpenData({
list: event.openData.list
})
for (let item of res.list) {
if (item.data && item.data.purePhoneNumber && ["12066600001", "12066600002"].indexOf(item.data.purePhoneNumber) > -1) {
// 获取手机号的请求且是测试号
const mockPhoneInfo = {
countryCode: "86",
phoneNumber: "13400000001",
purePhoneNumber: "13400000001",
watermark: item.data.watermark
}
item.data = mockPhoneInfo
}
}
return res.list
}
// 小程序
// getPhoneNumber.wxml
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
// getPhoneNumber.js
Page({
async getPhoneNumber(res) {
const result = await wx.cloud.callFunction({
name: 'getOpenData',
data: {
openData: {
list: [res.detail.cloudID]
}
}
})
console.log("phone info is:", result.result[0].data)
}
})
若需Mock虚拟账号定位或请求Request信息,可参考 虚拟账号配置Mock信息