uniapp+php 实现微信小程序获取手机号

先开始准备工作,确保前端项目可以调用后端接口。

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换取用户手机号,此刻调转到服务端(后端)

依照微信开放文档https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html

先获取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);
    }

自此获取手机号基本完成。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值