微信小程序可以使用手机号作为用户的唯一标识,可以通过微信提供的API获取用户的手机号,具体操作步骤如下:
1. 开启微信用户手机号授权
在小程序的app.json文件中,设置如下选项,表示开启用户手机号授权功能:
{
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序定位"
},
"scope.userInfo": {
"desc": "你的基本信息将用于小程序个性化体验"
},
"scope.userPhone": {
"desc": "你的手机号将用于小程序验证身份"
}
}
}
2. 获取用户手机号
小程序开发者可以通过wx.login
接口获取到用户的code,然后将code发送到开发者后台,后台通过code获取session_key和openid,在获取到session_key后,根据微信提供的文档,通过encryptedData
和iv
可以解密出用户的手机号。
具体的代码示例如下:
wx.login({
success: function (res) {
if (res.code) {
// 发送res.code到后台换取openId, session_key, unionId
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
data: {
appid: 'your appid',
secret: 'your app secret',
js_code: res.code,
grant_type: 'authorization_code'
},
success: function (response) {
if (response.statusCode === 200) {
const session_key = response.data.session_key
const encryptedData = e.detail.encryptedData
const iv = e.detail.iv
wx.request({
url: '/decryptPhoneNumber',
method: 'POST',
data: {
sessionKey: session_key,
encryptedData: encryptedData,
iv: iv
},
success: function (response) {
const phoneNumber = JSON.parse(response.data)
console.log(phoneNumber)
}
})
} else {
console.log(response.errMsg)
}
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
3. 示例说明
示例1:使用微信手机号 API 加密数据
可以使用微信提供的 wx.login()
接口获取到用户的code,然后将code发送到开发者后台,通过开发者后台的接口获得unionId和session_key,最后引用wx.createCipher
模块完成加密操作。具体代码示例如下:
const crypto = require('crypto')
function decodePhone(data, sessionKey) {
// base64 decode
const encryptedData = new Buffer(data, 'base64')
const key = new Buffer(sessionKey, 'base64')
const iv = key
try {
// 解密数据
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv)
decipher.setAutoPadding(true)
let decoded = decipher.update(encryptedData, 'binary', 'utf8')
decoded += decipher.final('utf8');
decoded = JSON.parse(decoded)
} catch (err) {
throw new Error('Illegal Buffer')
}
if (decoded.watermark.appid !== appid) {
throw new Error('Illegal Buffer')
}
return decoded
}
Page({
data: {},
getPhoneNumber: function(e) {
const detail = e.detail
wx.login({
success: (res) => {
if (res.code) {
// 发送 res.code 到后台换取 unionId, session_key
wx.request({
url: '/decodePhoneNumber',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'POST',
data: {
appid: appid,
code: res.code,
encryptedData: detail.encryptedData,
iv: detail.iv
},
success: (res) => {
const data = res.data
if (data.errcode === 0) {
const phoneNumber = decodePhone(data, data.session_key)
console.log('用户手机号为', phoneNumber)
}
},
fail: (res) => {
}
})
}
},
fail: (res) => {
}
})
}
})
示例2:手动解密数据
也可以使用手动解密的方式获取用户手机号,具体的代码示例如下:
function unescapeUnicode(data) {
return data.replace(/\\u/g, '%u')
.replace(/[^\x00-\x7F]/g, function(u) {return decodeURIComponent(unescape(unicodeEscape(u)))})
}
function unicodeEscape(str) {
let res = '';
for (let i = 0; i < str.length; i++) {
res += '\\u' + str.charCodeAt(i).toString(16).padStart(4, '0');
}
return res;
}
function decodePhone(data, sessionKey, iv) {
// base64 decode
const encryptedData = new Buffer(data, 'base64')
const key = new Buffer(sessionKey, 'base64')
iv = new Buffer(iv, 'base64')
try {
// 解密数据
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv)
decipher.setAutoPadding(true)
let decoded = decipher.update(encryptedData, 'binary', 'utf8')
decoded += decipher.final('utf8')
decoded = JSON.parse(unescapeUnicode(decoded))
} catch (err) {
console.error('解密出现异常', err)
throw err
}
if (decoded.watermark.appid !== getApp().globalData.appId) {
console.error('appId不一致', decoded)
throw new Error('appId不一致')
}
return decoded
}
Page({
data: {},
getPhoneNumber: function(e) {
const detail = e.detail
wx.login({
success: (res) => {
if (res.code) {
wx.request({
url: '/api/user/phone-number',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'POST',
data: {
code: res.code,
encryptedData: detail.encryptedData,
iv: detail.iv
},
success: (res) => {
const data = res.data
if (data.success) {
const phoneNumber = decodePhone(detail.encryptedData, data.session_key, detail.iv)
console.log('用户手机号为', phoneNumber)
// 修改页面上的手机号展示信息
} else {
console.error(data.msg)
}
},
fail: (res) => {
}
})
}
},
fail: (res) => {
}
})
}
})
在以上的代码中,我们通过wx.login()
获取到用户的code,再将其发给后台以获得session_key,最后利用得到的手机号的密文、session_key以及iv,使用crypto模块的decipher()方法解密数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序如何获取用户手机号 - Python技术站