客户端
getPhoneNumber: function (e) {
var that = this;
if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
wx.showModal({
content: '不能获取手机号码',
showCancel: false
})
return;
}
wx.showLoading({
title: '获取手机号中...',
})
wx.cloud.callFunction({
name: 'getToken', // 对应云函数名
data: {
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
sessionCode: app.globalData.sessionCode // 这个通过wx.login获取,去了解一下就知道。这不多描述
},
success: res => {
wx.hideLoading()
// 成功拿到手机号,跳转首页
wx.switchTab({
url: '../index/index' // 这里是要跳转的路径
})
},
fail: err => {
console.error(err);
wx.showToast({
title: '获取手机号失败',
icon: 'none'
})
}
})
}
服务端
-
步骤1: 新建node.js云函数getToken
-
步骤2:因为需要进行网络请求,这里使用request库
右击getToken函数名,选择在终端中打开
- 步骤3.下载 request 或 request-promise 模块(request-promise模块,可以使用promise,async和await)
命令行:
npm install --save request
npm install --save request-promise
如成功下载,则可见
- 步骤4:getToken下的index.js文件中
// 云函数入口文件
const cloud = require('wx-server-sdk')
const requestpromise = require('request-promise');
var WXBizDataCrypt = require('./RdWXBizDataCrypt') // 用于手机号解密
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
// 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件)
const wxContext = cloud.getWXContext()
const appid = wxContext.APPID
const AccessToken_options = {
method: 'GET',
url: 'https://api.weixin.qq.com/sns/jscode2session',
qs: {
appid:wxContext.APPID,
secret:'xxxxxxxxxxxxxxxxxxx', // 微信开发后台可生成,唯有微信认证过的国内主体才可有
grant_type: 'authorization_code',
js_code: event.sessionCode // 小程序中获取过来的
},
json: true
};
const resultValue = await requestpromise (AccessToken_options);
const pc = new WXBizDataCrypt(appid, resultValue.session_key) // -解密第一步
const data = pc.decryptData(event.encryptedData, event.iv) // 解密第二步
return { data }
}
这里的WXBizDataCrypt文件纯js写的,非官方给出的java,node,php等后端语言的demo,js文件我放
文件网盘里了,有需要的自行下载,请点击这里 提取码:i2ve
具体放置的位置如步骤3所示
至此,小程序便可得到解密后的用户手机号,
转载请注明出处,如有不同见解,欢迎私信讨论,谢谢
这里多谢@小文鱼 简友替我指出一个小错误,appid,没在最外面定义,已加回!