小程序通过云函数获得用户手机号码?
思路解析,
了解了小程序的加密方式,我们就可以自己去解密我们需要的信息。如:最困住我们的用户手机号码?
官方是有案例的,想更多学习可以给与参考,但是估计要多看几遍,有node基础的就比较好理解一些。
下面是官网地址:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud
下面开始说我自己的方法;
1.首先构建云函数,需要两个云函数,一个用来解密,session_key,一个用来解密加密手机号码;
//云函数:getSession;
// 云函数入口文件
const cloud = require('wx-server-sdk')
//npm install request-promise 通过终端下载npm install wx-server-sdk ,
const rp = require('request-promise');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const _JSCODE = event.code
const AccessToken_options = {
method: 'GET',
url: 'https://api.weixin.qq.com/sns/jscode2session',
qs: {
appid: '', //你的小程序appid;
secret: '', //你的秘钥
grant_type: 'authorization_code',
js_code: _JSCODE
},
json: true
};
const resultValue = await rp(AccessToken_options);
return { resultValue }
}
下载好需要的两个包,就可以对云函数初始化,执行npm init
有个起名字的环节,用过node的都知道,默认index.js,有个选择
package name: (gettoken) index.js
version: (1.0.0)
description:
git repository:
keywords:
author:
license: (ISC)
About to write to D:\projects\zy_face_id_wxs\server\getToken\package.json:
{
"name": "index.js",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"request-promise": "^4.2.4",
"wx-server-sdk": "^0.8.1"
},
"devDependencies": {},
"description": ""
}
Is this OK? (yes) yes
这是初始化,终端的代码;
右键点击上传并部署到云端;
下面是客户端的代码;
getPhoneNumber(e) {
if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
wx.showModal({
content: '不能获取手机号码',
showCancel: false
})
return;
}
wx.showLoading({
title: '获取手机号中...',
})
console.log(e)
wx.login({
success(res) {
if (res.code) {
console.log(res.code)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
wx.cloud.callFunction({
name: 'getSession', //调用云函数获取session_key;
data: {
code: res.code,
},
success: res => {
wx.hideLoading()
// console.log(res.result.resultValue)
var data = res.result.resultValue
console.log(data)
console.log(data.session_key) //获取到了session_key的值;
},
fail: error => {
console.log(error)
}
})
}
}
})
},
2.构建第二个云函数 GetWX;
// 云函数入口文件
const cloud = require('wx-server-sdk')
// const requestpromise = require('request-promise');
var WXBizDataCrypt = require('./RdWXBizDataCrypt') // 用于手机号解密
cloud.init()
exports.main = async (event, context) => {
const session_key = event.session_key
//appid写入你自己的appid,session_key 用第一个云函数的返回值;
const pc = new WXBizDataCrypt(appid, session_key ) // -解密第一步
const data = pc.decryptData(event.encryptedData, event.iv) // 解密第二步
return {
data
}
}
这个同样执行上面的步骤,npm install wx-server-sdk 和初始化npm init;
重点来了,解密所需要的js文件。
`
这两个文件已经上传到我的网盘里面,需要的请下载;
- https://pan.baidu.com/s/1VrS1gX_Bw3dKaZkQnNzy2A
- 提取码:cxnh;
- 格式和图片的保持一致,并上传到云端。
3.开始前端调用了;
代码如下;
getPhoneNumber(e) {
if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
wx.showModal({
content: '不能获取手机号码',
showCancel: false
})
return;
}
wx.showLoading({
title: '获取手机号中...',
})
console.log(e)
wx.login({
success(res) {
if (res.code) {
console.log(res.code)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
wx.cloud.callFunction({
name: 'getSession', //调用云函数获取session_key;
data: {
code: res.code,
},
success: res => {
wx.hideLoading()
var data = res.result.resultValue
console.log(data)
console.log(data.session_key) //获取到了session_key的值;
const session_key=data.session_key
wx.cloud.callFunction({
name:'getWX', //解析秘文,获得手机号码;
data:{
session_key: session_key,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
},
success:res=>{
console.log(res)
},
fail:err=>{
console.log(err)
}
})
},
fail: error => {
console.log(error)
}
})
}
}
})
},
4.输出的结果:
遇到问题了在私信问我,一一回答。
正需要这个功能, 我试试