先开始准备工作,确保前端项目可以调用后端接口。
1、直接开始前端部分
参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
dom
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
js
getPhoneNumber (e) {
console.log(e.detail.code) // 动态令牌
console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
console.log(e.detail.errno) // 错误码(失败时返回)
}
注:此刻获取到的 code 和wx.login获取到的不一样,切莫混用
wx.login({
success: function (r) {
console.log(r.code);
},
fail: function () {
console.log('获取用户信息失败')
}
})
}
});
注:如果获取到code 打印为 undefined,你可以尝试修改下微信的基础库版本,基础库2.21.2才可以哦,另外基础库版本过低还会导致无法调起微信获取手机号弹窗
微信开发者工具:详情——本地设置——调试基础库
微信开放平台:设置(往下滑)——版本设置——基础库最低版本,设置它
2、前端获取的code换取用户手机号,此刻调转到服务端(后端)
先获取access_token 再通过access_token和前端传入code获取用户手机号信息
// 微信授权登录
public function wxAuthLogin()
{
$param = $this->request->param();
$code = $param['code'];
$appid = '你的微信小程序appid';
$secret = '你的微信小程序secret';
$url = "https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=client_credential";
try {
$header = array('Accept: application/json',);
// 获取access_token
$wx_access_token = json_decode($this->getAccessToken($url, $header), true);
$url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" . $wx_access_token['access_token'];
$data = array('code' => $code); // 请确保$code变量已经定义
$options = array(
'http' => array(
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data)
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$result = json_decode($response, true);
if ($result['errcode'] != 0) {
return json(["code" => 1, "msg" => '登录失败']);
}
$model = new Users();
// //示例数据
// $result = [
// "errcode" => 0,
// "errmsg" => "ok",
// "phone_info" => [
// "phoneNumber" => "176XXXXXXXX",
// "purePhoneNumber" => "176XXXXXXXX",
// "countryCode" => "86",
// "watermark" => [
// "timestamp" => 时间戳,
// "appid" => "你的小程序id",
// ]
// ]
// ];
// 将获取到的手机号存库
$find = Db::name("你的表名")->where("phone",$param['phone'])->find();
if (!$find) {
$param['nickname'] = '用户' . rand(10000000, 99999999);//给个默认名字
$param['avatar'] = 'https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132';//给个默认头像
$param['create_time'] = time();
$res = Users::insertGetId($param);
if (!$res) {
return json(["code" => 0, "msg" => '登录失败']);
}
return json(["code" => 1, "msg" => '登录成功']);
} else {
$res = $find['id'];
}
} catch (Exception $exception) {
return json(["code" => 0, "msg" => $exception->getMessage()]);
}
}
// 获取access_token
private function getAccessToken($url, $header)
{
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
// 超时设置,以秒为单位
curl_setopt($curl, CURLOPT_TIMEOUT, 1);
// 超时设置,以毫秒为单位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
//执行命令
return curl_exec($curl);
}
自此获取手机号基本完成。