网页手机号抓取程序( 一个微信小程序唯一标识小程序开发文档有一个难 )
优采云 发布时间: 2021-12-02 19:00网页手机号抓取程序(
一个微信小程序唯一标识小程序开发文档有一个难
)
微信小程序开发获取用户手机号——用一个简单的php界面demo解密加密数据
做一个微信小程序,可以拿到用户微信绑定的手机号。小程序开发文档提供的获取电话号码的接口(getPhoneNumber())返回的是密文,需要在服务器端解密,但官方开发文档一如既往的乱七八糟。如果没有小程序开发文档的全貌,理解解密过程还是有点困难的。这里把小程序从请求用户授权获取手机号码到获取手机号码明文的整个过程串在一起,方便快捷,一目了然。
以后要做微信小程序,需要获取用户微信绑定的手机号。小程序开发文档提供的获取电话号码的接口(getPhoneNumber())返回的是密文,需要在服务器端解密,但官方开发文档一如既往的乱七八糟。如果没有小程序开发文档的全貌,理解解密过程还是有点困难的。这里把小程序从请求用户授权获取手机号码到获取手机号码明文的整个过程串起来,方便快捷理解,如下:
一. 前端相关操作:
1. 请求用户授权获取手机号码:
因为用户需要主动触发手机号接口,所以这个函数不是通过API调用的,而是需要通过组件的点击来触发,如下:
wxml:
获取手机号码
js:
1 Page({
2 getPhoneNumber: function(e) {
3 if(e.detail.errMsg == "getPhoneNumber:fail user deny") return; //用户允许授权
4 console.log("lv", e.detail.iv); //包括敏感数据在内的完整用户信息的加密数据,需要解密
5 console.log(e.detail.encryptedData); //加密算法的初始向量,解密需要用到
6 ......
7 }
8 })
2. 进入小程序登录界面:
小程序调用wx.login()获取临时登录凭证码并发送给开发者服务器。
Page({
getPhoneNumber: function(e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv) //包括敏感数据在内的完整用户信息的加密数据,需要解密
console.log(e.detail.encryptedData) //加密算法的初始向量,解密需要用到
wx.login({
success: res => {
if(res.code){
console.log(res.code)
}
}
})
}
})
3. 访问腾讯服务器登录凭据验证界面:
注:官方建议是放在服务器端,这里为了方便,放在前端请求上。
注意这里传入的参数:
应用程序
小程序唯一ID
秘密
小程序的应用秘诀
js_code
登录时获取的代码
授权类型
填写为authorization_code
//2. 访问登录凭证校验接口获取session_key
wx.request({
url: "https://api.weixin.qq.com/sns/jscode2session",
data: {
'appid': "xxxxxxxx",
'secret': "xxxxxxxx",
'js_code': res.code,
'grant_type': "authorization_code"
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function(data) {
console.log("data", data.data.session_key)
},
fail: function(err) {
console.log(err);
}
})
4. 在自己的服务器上解密
注:解密界面可使用腾讯官方demo进行修改,具体修改稍后说明。
//3. 解密
wx.request({
url: 'http://xxxxx.com/demo/demo.php',//腾讯官方demo改造的接口页面
data: {
'encryptedData': encodeURIComponent(e.detail.encryptedData),//需要进行编码
'iv': e.detail.iv,
'session_key': data.data.session_key
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function(data2) {
console.log(data2.data.phoneNumber)
if(data2.statusCode == 200) {
self.setData({
phone: data2.data.phoneNumber
})
}
},
fail: function(err) {
console.log(err);
}
})
js部分整体代码如下:
getPhoneNumber: function (e) {
if (e.detail.errMsg == "getPhoneNumber:fail user deny") return;
//用户允许授权
console.log("lv", e.detail.iv);
console.log(e.detail.encryptedData);
wx.showLoading()
var self=this
//1. 调用登录接口获取临时登录code
wx.login({
success: res => {
if(res.code){
//2. 访问登录凭证校验接口获取session_key、openid
wx.request({
url: "https://api.weixin.qq.com/sns/jscode2session",
data: {
'appid': "wxcc41e47562b08129",
'secret': "50e4379d67a6860d18157c53dc6ac3c2",
'js_code': res.code,
'grant_type': "authorization_code"
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function (data) {
console.log("data", data)
if(data.statusCode==200){
//3. 解密
wx.request({
url: 'http://qdy8.gotoip4.com/demo/demo.php',
data: {
'encryptedData': e.detail.encryptedData,
'iv': e.detail.iv,
'session_key': data.data.session_key
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function (data2) {
wx.hideLoading()
console.log(data2.data.phoneNumber)
if (data2.statusCode == 200 && data2.data.phoneNumber) {
self.setData({
phone: data2.data.phoneNumber
})
}
},
fail: function (err) {
console.log(err);
}
})
}
},
fail: function (err) {
console.log(err);
}
})
}
}
})
}
二. 后端接口:
微信官方提供多种编程语言的示例代码(点击下载)。每种语言类型的接口名称相同,调用方法可参考示例。
如果只是学习研究,可以买个经济实惠的虚拟主机,一年才几十块钱,但是这种虚拟主机多为PHP,所以这里我们以PHP为例进行改造接收前端- 结束请求。
下载官方demo后,结构如下:
转换 demo.php:
将php的三个demo文件上传到虚拟主机:
然后就可以直接访问demo.php文件作为接口了。
三. 容易出现异常:
1. 访问微信的登录凭据验证接口获取session_key时,如果报如下错误,则需要清除所有缓存并重新编译(应该是appid,开发工具的坑,如果不t清除所有缓存,会出现这个错误):
无效代码,提示:[req_id: CPAsWa0325ha57]
2.解密接口返回-41003,然后查看接口参数: