张光学 發表於 2020-8-6 10:30:00

微信公众号开发之网页授权(获取用户信息)

<div id="cnblogs_post_body" class="blogpost-body">
<p>这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究。</p>
<p>昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇。实现本篇涉及的</p>
<p>功能,还需要完成一些基础。在写完这篇博客后,我会尽快补上。</p>
<p>&nbsp;</p>
<p>-------------------------废话不多说直入正题</p>
<p>需要的工具:</p>
<p>微信公众号(可以申请,但做开发的,可以申请测试号,申请详细不多说了)</p>
<p>服务器(可以自行购买,我使用的是新浪的sae。)</p>
<p>编辑器(随意,不做推荐)</p>
<p>微信公众号开发文档(地址)</p>
<p>&nbsp;</p>
<p>-------------------------官方文档解读(只说我读到的信息)</p>
<p>!!!!!完成基本配置后才能进行一下工作,配置信息在这。(稍后补上)</p>
<p>你要完成网页授权,并获取用户信息要完成一下3步骤。</p>
<p>-1-用户授权并获取code</p>
<p>-2-使用code换取access_token</p>
<p>-3-使用access_token获取用户信息</p>
<p>&nbsp;</p>
<p>--------------------用户授权并获取code</p>
<p>参数说明<br>appid=APPID(公众号唯一标识)<br>redirect_uri=REDIRECT_URI(授权后重定向的回调链接地址)<br>response_type=code(返回类型,无需更改)<br>scope=SCOPE(snsapi_base ,不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo 弹出授权页面,可通过openid拿到昵称、性别、所在地。)<br>state=STATE(重定向后会带上state参数,开发者可以填写任意参数值)<br>#wechat_redirect(无需更改)</p>
<p>地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。<br>https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe5809c42e6c00d22&amp;redirect_uri=http://dingcanphp.applinzi.com/getUserInfo.php&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=1#wechat_redirect</p>
<p>返回结果(code的值,不一定是显示在浏览器界面上的,具体看你的redirect_uri中的文件)<br>061h4k8Z1G7AhY0025bZ1nbh8Z1h4k8Q</p>
<p>-----------------使用code换取access_token</p>
<p>参数说明<br>appid=APPID(公众号唯一标识)<br>secret=SECRET(公众号的appsecret)<br>code=CODE(第一步获取的code参数)<br>grant_type=authorization_code(无需更改)</p>
<p><br>地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。<br>https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxe5809c42e6c00d22&amp;secret=5444ba1b31666f6052e9c703f906368b&amp;code=061h4k8Z1G7AhY0025bZ1nbh8Z1h4k8Q&amp;grant_type=authorization_code</p>
<p>返回结果(json格式数据)<br>{<br>"access_token": "e1nYJFpZuehfQH1buzHFZLb7onqs_wT1cudSdy9HRlnaMXFtFpRMNFOA0euK6UxPcItrSNbAQVcXDdthbLJYX0MdH1p7-tkZSKuGqBCxVc0",<br>"expires_in": 7200,<br>"refresh_token": "0iVsXn4O1rBCASbO7hx8VNVUVFM1RP2Q4xS0giegd4jlIsJYOjTJNZ0b4Dsh_xcoB02ZZ3bt0WH0a47LvjIEPjWUnESJCZyl6EtY_xYZdVs",<br>"openid": "o47Fa0mp9SRTf3eiKmqWm69BjG_8",<br>"scope": "snsapi_userinfo"<br>}</p>
<p>结果解释<br>access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同<br>expires_in access_token接口调用凭证超时时间,单位(秒)<br>refresh_token 用户刷新access_token<br>openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID<br>scope 用户授权的作用域,使用逗号(,)分隔</p>
<p>&nbsp;</p>
<p>-----------------使用access_token获取用户信息</p>
<p>参数说明<br>access_token=ACCESS_TOKEN(第2步获取的access_token参数,此access_token与基础支持的access_token不同)<br>openid=OPENID(第2步获取的openid参数)<br>langlang=zh_CN 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语</p>
<p>地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。<br>https://api.weixin.qq.com/sns/userinfo?access_token=e1nYJFpZuehfQH1buzHFZLb7onqs_wT1cudSdy9HRlnaMXFtFpRMNFOA0euK6UxPcItrSNbAQVcXDdthbLJYX0MdH1p7-tkZSKuGqBCxVc0&amp;openid=o47Fa0mp9SRTf3eiKmqWm69BjG_8&amp;lang=zh_CN</p>
<p>返回结果(json格式数据)<br>{<br>"openid": "o47Fa0mp9SRTf3eiKmqWm69BjG_8",<br>"nickname": "齐齐",<br>"sex": 0,<br>"language": "zh_CN",<br>"city": "Shaoxing",<br>"province": "Zhejiang",<br>"country": "CN",<br>"headimgurl": "http://wx.qlogo.cn/mmhead/Q3auHgzwzM6kqfcibzzVc8MDGBch53mIgJjWrbKSwkBnzcsWBOMOGlg/0",<br>"privilege": []<br>}</p>
<p>结果解释<br>openid 用户的唯一标识<br>nickname 用户昵称<br>sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知<br>province 用户个人资料填写的省份<br>city 普通用户个人资料填写的城市<br>country 国家,如中国为CN<br>headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空<br>privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)</p>
<p>---------------------------------代码实现</p>
<p>解读完文档,理解实现的步骤、过程,那就开始具体的代码实现。</p>
<p>接触过php,但是没系统性的学习一下,所以代码实现的时候有些困难,如果不懂phpd的可以看这</p>
<p>&nbsp;</p>
<p>直接上代码,在需要的地方我以注释的形式说明。</p>
<p>命名为login.php放在服务器根目录。</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre>&lt;?php
    $appid='wxe5809c42e6c00d2d';
    $redirect_uri = urlencode ( 'http://dingcanphp.applinzi.com/getUserInfo.php' );//将字符串以 URL 编码。
    $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&amp;redirect_uri=$redirect_uri&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=1#wechat_redirect";
    header("Location:".$url);//header() 函数向客户端发送原始的 HTTP 报头。
?&gt;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p>命名为getUserInfo.php放在服务器根目录。</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre>&lt;?php
    header("content-type:text/html;charset=utf-8");
    $code = $_GET["code"];//预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
    if (isset($_GET['code'])){//判断code是否存在
      $userinfo = getUserInfo($code);
      $xinxi = $userinfo['nickname'];//获取nickname对应的值,即用户名
      print '&lt;h2 style="text-align:center"&gt;用户名:'.$xinxi.'&lt;/h2&gt;';//打印输出
    }else{
      echo "NO CODE";
    }
   
    function getUserInfo($code)
    {
      $appid = "wxe5809c42e6c00d2d";
      $appsecret = "506eba1b31666f6052e9c703f906368b";

      //Get access_token
      $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&amp;secret=$appsecret&amp;code=$code&amp;grant_type=authorization_code";
      $access_token_json = https_request($access_token_url);//自定义函数
      $access_token_array = json_decode($access_token_json,true);//对 JSON 格式的字符串进行解码,转换为 PHP 变量,自带函数
      //获取access_token
      $access_token = $access_token_array['access_token'];//获取access_token对应的值
      //获取openid
      $openid = $access_token_array['openid'];//获取openid对应的值

      //Get user info
      $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&amp;openid=$openid";
      $userinfo_json = https_request($userinfo_url);
      $userinfo_array = json_decode($userinfo_json,ture);
      return $userinfo_array;
    }

    function https_request($url)//自定义函数,访问url返回结果
    {
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      $data = curl_exec($curl);
      if (curl_errno($curl)){
            return 'ERROR'.curl_error($curl);
      }
      curl_close($curl);
      return $data;
    }
?&gt;</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p>自定义函数中的curl。</p>
<p>&nbsp;</p>
<p>--------------------------网页授权,用户信息的获取体验</p>
<p>两种体验方式。需要完成配置后实现。</p>
<p>微信公众号自动回复中:</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre>//自动回复模式
      if (strstr($keyword, "文本")){
            $content = "这是个文本";
      }else if (strstr($keyword, "登录")){
            $content = "OAuth2.0网页授权演示\n";
            $content .= '&lt;a href="http://dingcanphp.applinzi.com/login.php"&gt;点击这里体验&lt;/a&gt;';
            $content .="\n".'&lt;a href="https://jq.qq.com/?_wv=1027&amp;k=4BeSCye"&gt;技术支持 现代软件工程工作室&lt;/a&gt;';
      }else{
            $content = date("Y-m-d H:i:s",time())."\n\n".'技术支持 现代软件工程工作室';
      }</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p>&nbsp;</p>
<p>菜单点击访问:</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre>{
    "button": [
             {
                  "type":"view",
                  "name":"餐厅信息",
                  "url":"http://dingcanphp.applinzi.com/index/canting.html"
                },
         {
            "name": "帮助",
            "sub_button": [
                {
                         "type":"view",
                         "name":"天气查询",
                         "url":"http://dingcanphp.applinzi.com/index/tianqi.html"
                },
      {
                         "type":"view",
                         "name":"网页授权",
                         "url":"http://dingcanphp.applinzi.com/login.php"
                }
            ]
      }   
    ]
}</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p>&nbsp;</p>
<p>效果图展示:</p>
<p><img src="https://images2015.cnblogs.com/blog/1100697/201707/1100697-20170717112257706-231035599.jpg" alt=""></p>
<p>&nbsp;</p>
<p>谢谢阅读,如有不足,请赐教。</p>
<p>&nbsp;</p>
</div>
<div class="clear">&nbsp;</div>
<div id="blog_post_info_block">
<div id="BlogPostCategory">分类:&nbsp;微信公众号开发</div>
</div><br><br>
来源:https://www.cnblogs.com/wangsongbai/p/13444688.html
頁: [1]
查看完整版本: 微信公众号开发之网页授权(获取用户信息)