0%

微信公众号获取OpenId和用户基本信息

最近开始忙一个新需求,就是给公司的电商网站接入微信第三方登录,由于之前的工作中很少接触微信公众平台这一块的开发,所以在开发之前做了比较多的准备工作,查阅微信公众平台开发者文档和相关资料,然后我也试着用PHP做后端简单实现一下这个功能,由于个人订阅号没有获取OpenId和用户基本信息的权限,所以我申请了一个公众平台测试账号来进行开发。

官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

修改OAuth2.0网页授权回调页面域名

申请好公众平台测试账号后,第一步是修改OAuth2.0网页授权回调页面域名,不然的话,在用户同意授权后获取code会报错“scope参数错误或没有scope权限”。

点击修改,然后输入回调页面的域名:

做好准备工作,然后开始开发。

用户同意授权,获取code

首先是拼装链接,提供用户在微信浏览器打开,以弹出授权页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=[你申请的公众平台测试账号的appid]&redirect_uri=https://[你的授权回调页面域名]/wechat/login.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

具体每个参数代表什么,我这里就不做解释了,微信公众平台开发者文档有详细说明。其中scope是比较重要的,由于不是采用静默授权的方式,所以它的值必须是snsapi_userinfo,另外就是要注意每个参数的顺序必须保持跟官方文档一致,不然会授权失败。在微信浏览器打开链接后,会弹出授权页面,用户点击同意后,页面会返回到redirect_uri页面,并且在链接中带上code参数,然后PHP就可以拿到code进行下一步的操作。

通过code换取网页授权access_token

用户在上一步点击同意授权后,获取OpenId以及用户基本信息的工作就交给PHp来做了,接下来示例一下PHP如何跟微信服务器交互。

    <?php
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->redirectUrl();
    
    class wechatCallbackapiTest
    {
        public function redirectUrl()
        {
            $appid = "公众平台测试账号的appid";
            $secret = "公众平台测试账号的appsecret";
            $code = $_GET["code"];
    
            $get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
            $json = file_get_contents($get_token_url);
            echo($json);
        }
    }
    
    ?>
    

上面的代码会在拿到access_token相关信息后在页面打印出来。

根据access_token获取OpenId以及用户基本信息

    <?php
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->redirectUrl();
    
    class wechatCallbackapiTest
    {
        public function redirectUrl()
        {
            $appid = "公众平台测试账号的appid";
            $secret = "公众平台测试账号的appsecret";
            $code = $_GET["code"];
    
            $get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
            $json = file_get_contents($get_token_url);
            // echo($json);
    
            $arr = json_decode($json, true);
               $access_token = $arr['access_token'];
               $openid = $arr['openid'];
    
               $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
               $userInfo = file_get_contents($url);
               $user_data = json_decode($userInfo, true);
               echo($userInfo);
        }
    }
    
    ?>
    

这样,就获取到OpenId以及用户基本信息了,并将获取到的内容打印到页面。