zoukankan      html  css  js  c++  java
  • 夺命雷公狗---微信开发53----网页授权(oauth2.0)获取用户基本信息接口(3)实现世界留言版

    前面两节课我们讲的是base型的授权了,那么现在我们开始Userinfo型授权,

    先来看下我们的原理图

    我们这节课来做一个 世界留言版 系统

    1..首先我还是在微信测试平台那里设置好回调页面的域名

    2..编写程序create_userinfourl.php,代码如下:

    <?php
        header("Content-Type:text/html;charset=utf-8");
        require_once "get_token.php";
        require_once "common.php";
    
        //公众号的appid
        $appid = "wxed89d8f74fa6fc51";
        //回调url,也就是第三方页面
        $userinfo_redirect_uri = "http://weixin.showtp.com/dream.php";
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$userinfo_redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
        echo "您发送的值是:$url<br />";
        
        //这里可以写得更人性化一点,通过表单post过来即可
        $contentStr = $url;
        //因为是测试蓄意将openid写死了
        $fromUsername = 'oB1_6tzeHj-KG7kL8Thmu6VcF2BM';
        //因为可能会存在中文所以需要url编码
        $contentStr = urlencode($contentStr);
        //到时候我们我发送的内容我们放到一个数组里面去了
         $content_arr = array('content'=>"{$contentStr}");
        //这里的意思是将来我要发送消息给这个用户
        $reply_arr = array('touser'=>"{$fromUsername}",'msgtype'=>'text','text'=>$content_arr);
        //下一步就是将编码转成规定的json格式
        $post = json_encode($reply_arr);
        //url解码,如果不解码他将会发来一段二进制代码
        $post = urldecode($post);
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={$access_token}";
        //处理好了直接发送
        http_request($url,$post);
        
        echo "发送成功咯";

    3...编写dream.php来接收发送过来的数据

    <?php
        require_once "common.php";
        //获取code,得到access_token和appid
        $code = $_GET['code'];
        //公众号的appid
        $appid = "wxed89d8f74fa6fc51";
        //公众号的appsecret
        $appsecret = 'd4624c36b6795d1d99dcf0547af5443d';
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code";
        $res = http_request($url,null);
        //json解码
        $res = json_decode($res);
        //获取openid和access_token
        $openid = $res->openid;
        $access_token = $res->access_token;
        
        //这里是请求过去拉取用户信息这和基本接口的获取是不一样的,详情可以参考手册上的第四步
        $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}";
        $res = http_request($url,null);
        //他是通过json返回用户的基本信息的
        $res = json_decode($res);
        $nickname = $res->nickname;  //用户昵称
        $headimgurl = $res->headimgurl; //用户头像
        //因为他放回http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46
        //所以要处理以下后面的46
        $small_head_imgurl = substr($headimgurl,0,-1).'132'; //小头像的地址
        
        
        
        //通过access_token和openid获取该用户的详细信息
    ?>
    <!doctype html> 
    <html> 
        <head> 
            <meta charset="utf-8"> 
            <title>世界留言板</title> 
            <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0, maximum-scale=1.0,user-scalable=no;"> 
            <meta name="apple-mobile-web-app-capable" content="yes"> 
            <meta name="apple-mobile-web-app-status-bar-style" content="black"> 
            <meta name="format-detection" content="telephone=no"> 
            <link href="./jquery.mobile-1.0.min.css" rel="stylesheet" type="text/css"> 
            <script src="./jquery-1.6.4.min.js" type="text/javascript"></script> 
            <script src="./jquery.mobile-1.0.min.js" type="text/javascript"></script> 
        </head> 
        <body> 
            <div data-role="page" id="page3"> 
                <div data-role="header"> 
                    <h1>世界留言板</h1> 
                </div> 
                <div data-role="content"> 
                    <form action="post_dream.php" method="post" data-ajax="false" > 
                        <div data-role="fieldcontain"> 
                            <label for="textarea"><?php echo $nickname; ?>, 请说出您对世界心声:</label> 
                            <textarea cols="40" rows="8" name="textarea" id="textarea"></textarea> 
                        </div> 
                        <!--通过隐藏表单发送我们会用到的参数-->
                        <input type="hidden" name="openid" value="<?php echo $openid; ?>" />
                        <input type="hidden" name="nickname" value="<?php echo $nickname; ?>" />
                        <input type="hidden" name="small_head_imgurl" value="<?php echo $small_head_imgurl; ?>" />
                        <div class="ui-grid-a"> 
                            <div class="ui-block-a"> 
                                <button type="submit" data-role="button" >提交心声</button> 
                            </div> 
                            <div class="ui-block-b"> 
                                <button type="reset" data-role="button">重输心声</button> 
                            </div> 
                        </div> 
                    </form> 
                </div> 
            </div> 
        </body> 
    </html> 

    然后我们还需要创建一个post_dream.php来接收以下dream.php传递过来的数据,但是因为我们的数据是入库的,所以我们需要先来创建一张“user_dream”表,如下所示:

    我们开始写我们的post_dream.php,来进行数据的处理,代码如下:

    <?php
        $openid = $_POST['openid'];
        $nickname = $_POST['nickname'];
        $small_head_imgurl = $_POST['small_head_imgurl'];
        $content = $_POST['textarea'];
    
        $conn = mysql_connect('localhost','root','root') or die('数据库链接失败');
        mysql_select_db('wxdb',$conn);
        mysql_query('set names utf8');
        $sql = "insert into user_dream (id,openid,nickname,content,headimgurl) values(null,'{$openid}','{$nickname}','{$content}','{$small_head_imgurl}')";
        mysql_query($sql);
    ?>
    <!doctype html> 
    <html> 
        <head> 
            <meta charset="utf-8"> 
            <title>世界留言板</title> 
            <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;"> 
            <meta name="apple-mobile-web-app-capable" content="yes"> 
            <meta name="apple-mobile-web-app-status-bar-style" content="black"> 
            <meta name="format-detection" content="telephone=no"> 
            <link href="./jquery.mobile-1.0.min.css" rel="stylesheet" type="text/css"> 
            <script src="./jquery-1.6.4.min.js" type="text/javascript"></script> 
            <script src="./jquery.mobile-1.0.min.js" type="text/javascript"></script> 
        </head> 
        <body> 
            <div data-role="page" id="page3"> 
            <div data-role="header"> 
                <h1>世界留言板</h1> 
                <a href="show_dream.php" data-role="button" data-icon="arrow-l">看看别人的梦想</a> 
            </div> 
            <div data-role="content">恭喜您! 梦想发布成功!</div> 
        </body> 
    </html> 

    这里处理完后然后写个页面然他从数据库将里面的内容遍历出来,所以我们写个show_dream.php,代码如下所示:

    <?php
         //链接数据库
        $connect = mysql_connect('localhost','root','root');
        mysql_select_db('wxdb',$connect);
        mysql_query('set names utf8');
        //分页开工咯,先取个别名counts
        $sql = "select count(*) as counts from user_dream";
        $res = mysql_query($sql);
        $row = mysql_fetch_assoc($res);
        //这里的$row_num是总的咨询条数
        $row_num = $row['counts'];
        //我们规定每页显示5条记录
        $page_size = 5;
        //计算总页数
        $page_count = ceil($row_num/$page_size);
        //接收当前用户点击的是第几页
        $page_num = $_GET['page_num'];
        //判断$page_num是否为空,如果是空的默认给他一个1
        if(empty($page_num)){
            $page_num = 1;
        }
        //计算从那条记录开始获取
        $begin = ($page_num-1)*$page_size;
        $sql = "select * from user_dream order by id desc limit {$begin},{$page_size}";
        $info_res = mysql_query($sql);
    ?>
    ?>
    <!doctype html> 
    <html> 
    <head> 
        <meta charset="utf-8">
        <title>世界留言板</title>
        <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black"> 
        <meta name="format-detection" content="telephone=no"> 
        <link href="./jquery.mobile-1.0.min.css" rel="stylesheet" type="text/css"> 
        <script src="./jquery-1.6.4.min.js" type="text/javascript"></script> 
        <script src="./jquery.mobile-1.0.min.js" type="text/javascript"></script> 
        </head>
        <body>
            <div data-role="page" id="page3">
                <div data-role="header">
                    <h1>世界留言板</h1>
                </div>
                <div data-role="content">
                    <ul data-role="listview">
                        <?php while($row = mysql_fetch_assoc($info_res)){ ?>
                        <li>
                            <a href="#"><?php echo $row['nickname']; ?><br/>
                                对世界想说的是:<br/>
                                <font color='red'><?php echo $row['content']; ?></font>
                                <p class="ui-li-aside">
                                    <img width='50px' src="<?php echo $row['headimgurl']; ?>" />
                                </p>
                            </a>
                        </li>
                        <?php } ?>
                    </ul>
                </div>
                <!--增加分页的按钮-->
                <div data-role="controlgroup" data-type="horizontal">
                <?php
                    if($page_num != 1 && $page_num > 1)
                    { ?>
                    <a href="/show_dream.php?page_num=<?php echo $page_num-1; ?>" data-role="button">上一页</a>
                <?php } ?>
                <?php
                    if($page_count > $page_num)
                    { ?>
                <a href="/show_dream.php?page_num=<?php echo $page_num+1; ?>" data-role="button">下一页</a>
                <?php } ?>
                </div>
            </div>
        </body> 
    </html>

    总结:

    1...base授权和userinfo授权比较,我们可以发现bases型授权只能获取到用户openid,而userinfo可以获取到更多的信息,比如昵称性别头像等

    2...从开发流程看,userinfo在最后还需要拉取用户信息(需要scope为snsapi_userinfo),而base型权限不需要

    3...网页授权接口调用凭证的access_token,这access_token与基础支持的access_token不同

    4...code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能用一次,5分钟如果还没被使用则自动过期

    其实oauth2.0还是有很大前景的噢,嘻嘻

  • 相关阅读:
    MySQL 5.6中如何定位DDL被阻塞的问题
    MySQL 5.7中如何定位DDL被阻塞的问题
    MySQL表结构变更,不可不知的Metadata Lock
    mysqlfrm
    升级MySQL5.7,开发不得不注意的坑
    MySQL root密码忘记,原来还有更优雅的解法!
    MySQL 8 新特性之自增主键的持久化
    ip route显示和设定路由
    RHEL7/CentOS7 ip 命令常用用法,代替 ifconfg/route/ifup/ifdown
    网络安全+运维进阶(79)-网络基础-网络基础
  • 原文地址:https://www.cnblogs.com/leigood/p/5256712.html
Copyright © 2011-2022 走看看