php请求微信接口获取用户电话号功能示例-kb88凯时官网登录

来自:网络
时间:2023-07-25
阅读:
免费资源网,https://freexyz.cn/

前言情景剧

       业务场景是为了在用户登录的时候判断其是否已经成功注册,没有成功注册的话就将获取到的openid和session_key加密后作为token传给前端,然后让前台通过组件获得code之后连着token一起传给后端,后端拿着code再去请求微信接口获取到用户的电话号码,以此完成注册。

实现过程中的问题

         结合微信官方手册:

怪我没好好看手册,中间发生了hin多的插曲。比如报错返回:

require post method hint       errcode: 43002

一查文档告诉我:这个请求需要用post请求!可是,我明明是用的post请求啊~~~

后面通过面向百度编程,在找了5678个公共发起post请求的方法之后,终于有一个post请求没问题,但又遇到了一个问题,他返回: [0,null]

这里的原因是比较让我耗费时间的:这个接口的请求,必须在用户处于登录的条件下,并且必须在互联网能够访问到的公共网站上(也就是得在我的项目配置好的域名下去请求,才能够返回值!我在本地试了好久,气煞我也!

如果你后面写好了对返回值的判断的话会报错:

trying to access array offset on value of type null 。

就是告诉你不能尝试将 null,bool,int,float 或 resource 类型的值用作数组 ( 例如 $null[“key”] ) 会产生一个通知。

遇到的这个问题我是万万妹想到,搞了整整一下午,最后在公司大佬的帮助下半个小时帮我解决了问题。ps:第一个参数access_token那是轻轻松松(有问题可以看看和我的代码哪里不同)

废话不多say,上代码!

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);
    }
}

调用接口代码:(有空可以自己封装一下~)

/**必须先进入登录状态,然后拿到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 */

另外,thinkphp5获取微信授权用户手机号的相关实现方法,可参考前面一篇:

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图