PHP通过微信接口获取用户手机号功能的方法及原理代码

2023-07-24

近期在做一个微信端项目的用户注册登录时需要获取用户的手机号用于短信验证码的接收核验,具体需求是:为了在用户登录的时候判断其是否已经成功注册,没有成功注册的话就将获取到的openid和session_key加密后作为token传给前端,然后让前台通过组件获得code之后连着token一起传给后端,后端拿着code再去请求微信接口获取到用户的电话号码,以此完成注册。经过参考官方的文档和搜索网上的案例,虽有波折但也顺利的完成了这个功能。现将相关代码分享给大家,供大家参考。

PHP通过微信接口获取用户手机号功能的方法及原理代码

1、common.php文件

/**
 * 发送curl get
 * @param string $url
 * @return mixed
 */
function curl_get($url)
{
    $oCurl = curl_init();
    if (stripos($url, "https://") !== FALSE) {
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) {
        curl_setopt($oCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
        return $sContent;
    } else {
        return false;
    }
}
if (!function_exists('http_post_json')){ //这一行是判断公共方法有无这个方法,避免重名~
    /**
     * PHP发送Json对象数据
     * @param $url string
     * @param $jsonStr string
     * @param string[] $headers
     * @return array
     */
    function http_post_json(string $url, string $jsonStr, array $headers = array(
        'Content-Type: application/json; charset=utf-8',
    )): array
    {
        $headers[] =         'Content-Length: ' . strlen($jsonStr);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return array($httpCode, $response);
    }
}

2、调用接口代码:

/**必须先进入登录状态,然后拿到phone的code去请求然后拿到access_code,请求phone的接口 */
            $appid = getConfig('appid_y');   //填写自己的appid,小程序中看
            $secret = getConfig('secret_y');    //填自己的secret,公众平台看
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
            $access_token = json_decode(curl_get($url),true);    
            if(isset($access_token['errcode']))
                return ['errcode'=>$access_token['errcode'],'msg'=>'请求失败','data'=>$access_token];
            $access_token = $access_token['access_token'];   //获取到了access_token
            //请求电话号使用方法只能在公网能访问的目录下进行,本地进行没有返回值
            $url = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token='.$access_token;
            $json_code = json_encode(['code'=>$param['code']]);
            $headers = [
                'Accept: application/json',
                'User-Agent: */*',
                'Content-Type: application/json; charset=utf-8',
            ];
            $phone = http_post_json($url,$json_code,$headers);
            $phone[1] = json_decode($phone[1],true); 
            if(empty($phone[1])||$phone[1]['errcode']!=0)
                throw new Exception('系统获取手机号失败');
            $phoneNumber = $phone[1]['phone_info']['phoneNumber'];
            /**拿到电话号码end */

好了,以上内容就是今天为大家分享的关于PHP通过微信接口获取用户手机号功能的方法及代码,希望大家喜欢!