⼩程序开发之获取⽤户⼿机号码(php接⼝解密)
后边要做⼀个⼩程序,并要能获取⽤户绑定的⼿机号码。⽽⼩程序开发⽂档上边提供的获取⼿机号码的接⼝(getPhoneNumber())返回的是密⽂,需要服务器端进⾏解密,但是官⽅提供的开发⽂档⼀如既往的乱,如果没有对⼩程序开发⽂档有⼀个整体的了解,搞懂解密流程还是有点难的。这⾥把⼩程序从请求⽤户授权获取⼿机号码直⾄获取到⼿机号码明⽂的整个流程串了起来,⽅便迅速了解,如下:
⼀. 前端相关操作:
1. 请求⽤户授权获取⼿机号码:
因为需要⽤户主动触发才能发起获取⼿机号接⼝,所以该功能不由 API 来调⽤,需⽤<button>组件的点击来触发,如下:
wxml:
<button wx:if="{{!phone}}" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> 获取⼿机号码</button>
js:
Page({
getPhoneNumber: function(e) {   
if(Msg == "getPhoneNumber:fail user deny") return;  //⽤户允许授权 
console.log("lv", e.detail.iv); //包括敏感数据在内的完整⽤户信息的加密数据,需要解密 
console.log(ptedData); //加密算法的初始向量,解密需要⽤到 
......
}
})
2. 访问⼩程序登录接⼝:
⼩程序调⽤wx.login()获取临时登录凭证code,并传到开发者服务器。
Page({
getPhoneNumber: function(e) {
console.log(Msg)
console.log(e.detail.iv) //包括敏感数据在内的完整⽤户信息的加密数据,需要解密
console.log(ptedData) //加密算法的初始向量,解密需要⽤到
wx.login({
success: res => {
de){
console.de)
}
}
})
}
})
3. 访问腾讯服务器的登录凭证校验接⼝:
注:官⽅推荐放到服务器端进⾏,这⾥为了⽅便,就放在前端请求了。
这⾥要注意传⼊参数:
appid⼩程序唯⼀标识
secret⼩程序的 app secret
js_code登录时获取的 code
grant_type填写为 authorization_code
//2. 访问登录凭证校验接⼝获取session_key
url: "api.weixin.qq/sns/jscode2session",
data: {
'appid': "xxxxxxxx",
'secret': "xxxxxxxx",
'js_code': de,
'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);
}php手机版下载
})
4. ⾃⼰的服务器端进⾏解密
注:解密接⼝可以使⽤腾讯官⽅的demo进⾏改造,具体改造会在后⾯说明。//3. 解密
url: 'xxxxx/demo/demo.php',//腾讯官⽅demo改造的接⼝页⾯
data: {
'encryptedData': encodeURIComponent(ptedData),//需要进⾏编码
'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 (Msg == "getPhoneNumber:fail user deny") return;
//⽤户允许授权
console.log("lv", e.detail.iv);
console.log(ptedData);
wx.showLoading()
var self=this
//1. 调⽤登录接⼝获取临时登录code
wx.login({
success: res => {
de){
/
/2. 访问登录凭证校验接⼝获取session_key、openid
url: "api.weixin.qq/sns/jscode2session",
data: {
'appid': "wxcc41e47562b08129",
'secret': "50e4379d67a6860d18157c53dc6ac3c2",
'js_code': de,
'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. 解密
url: 'ip4/demo/demo.php',
data: {
'encryptedData': ptedData,
'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
include_once "wxBizDataCrypt.php";
/**
* sessionKey/encryptedData/iv参数均从url中获取,并赋给相应变量
*/
$appid = 'xxxxxxxx';
$sessionKey = $_REQUEST['session_key'];
$encryptedData=$_REQUEST['encryptedData'];
$iv = $_REQUEST['iv'];
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
>
将php的三个demo⽂件上传虚拟主机:
然后就可以直接访问demo.php⽂件作为接⼝了。
三. 容易出现的异常:
1. 访问的登录凭证校验接⼝获取session_key时,如果报出如下错误,则需清除全部缓存,重新编译(应该是更改过appid,开发⼯具的坑,不清除全部缓存,会出现这个错误):
invalid code, hints: [ req_id: CPAsWa0325ha57 ]
2.解密接⼝返回-41003,则检查接⼝参数:
到此这篇关于⼩程序开发之获取⽤户⼿机号码(php接⼝解密)的⽂章就介绍到这了,更多相关⼩程序获取⽤户⼿机号码内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!