作者:阿dai哥
教程分享
TUTORIAL TO SHARE
使用Thinkphp框架开发接口,小程序授权获取微信用户绑定的手机号码,全网最简单的方式。
分享效果说明
SHARE THE BODY
1、授权登录提示
2、小程序授权后返回的手机号码
小程序代码
THE IMPLEMENTATION CODE
wxml代码如下:
<button class='pop_btn' plain="true" open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber">获取用户手机号</button>
js码如下:
getPhoneNumber(e) {
var ivObj = e.detail.iv
var telObj = e.detail.encryptedData
var that = this;
wx.login({
success: res => {
console.log('code转换', res.code); //用code传给服务器调换session_key
wx.request({
url: 'http://www.xxx.cc/wechat/demo/index', //接口地址
data: {
code: res.code,
encryptedData: telObj,
iv: ivObj
},
header: {
'content-type': 'application/json' // 默认值
},
success: function(res) {
console.log(res.data.data)
}
})
//-----------------是否授权,授权通过进入主页面,授权拒绝则停留在登陆界面
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') { //用户点击拒绝
console.log('用户点击拒绝')
} else { //授权通过执行跳转
console.log('授权通过执行跳转')
}
}
});
}
Thinkphp代码
THE IMPLEMENTATION CODE
首先写一个方法根据code获取用户的openId和session_key,下面这个方法是最简单也是最有效的。
/**
* 根据code 获取用户的openid
* return array
*/
public function get_openid($code)
{
$apiurl = 'https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code';
header("Content-type:text/html;charset=utf-8;");
$appid = $this->AppID;
$secret = $this->AppSecret;
$url = str_replace("JSCODE",$code,str_replace("APPID",$appid,str_replace("SECRET",$secret,$apiurl)));
$res = json_decode(file_get_contents($url), true);
return $res;
}
现在正式要进入主题啦,写一个用户点击授权请求的方法。方法也是非常简单的。
/**
* 授权.
* @return int 成功0,失败返回对应的错误码
*/
public function index()
{
$param = $this->request->param();
$crop = $this->get_openid($param['code']); //返回session_key 与 openid
$errCode = $this->decryptData($this->AppID, $crop['session_key'], $param['encryptedData'], $param['iv'], $data );
if ($errCode == 0) {
return success($data, '获取手机成功');
} else {
$ress['code'] = 301;
$ress['data'] = $errCode;
return error('获取手机成功', $ress);
}
}
最后这个方法也是非常的关键,这个decryptData 方法的作用就是把加密的信息解密出明文,在这里我想说一下,小程序开发手册有一个非常大的坑,下载demo的代码认真看了之后发现发现代码有问题,可能官方也是吃错了药,上传了一个有问题的demo代码。我这个方法是优化后的代码直接就可以使用。
/**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
private function decryptData( $appid,$sessionKey,$encryptedData, $iv, &$data )
{
if (strlen($sessionKey) != 24) {
return -41001;
}
$aesKey=base64_decode($sessionKey);
if (strlen($iv) != 24) {
return -41002;
}
$aesIV=base64_decode($iv);
$aesCipher=base64_decode($encryptedData);
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );
if( $dataObj == NULL )
{
return -41003;
}
if( $dataObj->watermark->appid != $appid )
{
return -41004;
}
$data = $dataObj;
return 0;
}
很多人看不懂这个方法,不用担心,我已经封装好了,直接拿过去就可以用了。到了这里就完成了。