小程序开发已经是家常便饭了,当然获取手机号也是需要经常用到,今天做个记录
获取流程是,先通过前端传递过来的code,获取openid和session_key,然后拿着session_key和前端传递过来的加密信息来获取手机号信息
$appid = '';
$secret = '';
$code = ''; //前端传递过来的
$data = file_get_contents('https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $code . '&grant_type=authorization_code');
if (!empty($data)) {
$data = json_decode($data, true);
$openid = $data['errcode'] == 0 ? $data['openid'] : '';
//$session_key = $data['session_key'];
return $openid;
}
有了这些信息后,可以通过解密方法来获取手机号
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;
}
上面方法需要传递四个参数,分别是,appid,session_key,前端的加密数据,前端的IV值,还有一个引入式变量data,方法返回一个状态码,如果状态码等于0的时候,那就是成功了,$data的数据就是手机号json,下面是一个例子:
$appid = '';
$session_key = ''; //拿上门获取的session_key
$encryptedData = ''; //前端传递
$iv = ''; //前端传递
$data = ''; //默认声明
$errCode = $this->decryptData($appid,$session_key,$encryptedData,$iv,$data);
$this->logs('phoneinfo:' . json_encode($data));
if ($errCode == 0) {
$phone = $data->phoneNumber;
return $phone;
}