客户端
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
image.png -
步骤2:因为需要进行网络请求,这里使用request库
右击getToken函数名,选择在终端中打开
image.png - 步骤3.下载 request 或 request-promise 模块(request-promise模块,可以使用promise,async和await)
命令行:
npm install --save request
npm install --save request-promise
如成功下载,则可见image.png
- 步骤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,没在最外面定义,已加回!
文章转载于:https://www.jianshu.com/p/9651cc121afe
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~