微信开发3-openid+session身份验证

其实到了这里才算做真正的 "开发",前面的环境部署属于运维部分,并没有涉及到微信 API 调用之类的。

目的是获取用户的 openid,与数据库储存的用户信息进行对比,通过则启动 session,后面调用 session 验证以授予访问页面的权限,否则跳转其它页面。(有点冗余,可以看下面的结构图)。

从用户操作的角度来说,会便利化用户的操作。用户登陆过了该公众号,我们获取到的 openid 对于每个公众号是唯一不变的。省去了用户下载 APP、注册登陆等步骤。

openID:


在微信里面,每个用户关注公众号,就会产生对这个公众号唯一的 28 位 openID(微信自动生成)。openID 具有唯一性和不可变性,可以作为用户对某一公众号身份的凭证。

session:

业务流程:


下面分别讲获取 openid 和创建运用 session。

配置网页授权获取用户基本信息


在公众号管理界面:网页服务 -> 网页账号 -> 修改
这里填入授权回调页面域名,就是自己的域名。比如 www.xxx.com

1. 获取 code

用户点击自定义菜单的按钮后,会跳转到目标页面,这个是开发人员自己设定的 url 链接。
比如我们想跳转到 www.xxx.com/index.php,此时我们并不是让用户直接跳转到这个页面,而是把链接进行处理。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxxxxxxxxxxxxxx
&redirect_uri=http://www.xxx.com/index.php
&response_type=code
&scope=snsapi_userinfo
&state=123#wechat_redirect

(这里为了方便查看换行写了,用的时候注意删去换行)
这里的 xxxxxxxxxxxxxxxxxx 为自己公众号的 appid
&redirect_uri= 加上 "回调链接",即要转到的地址;&response_type= 加上 "回调参数 code",下一步会用到这个变量;
&scop= 加上 "snsapi_base 和 snsapi_userfo",不多解释,参考这个: 传送门
后面的 &state 写 123 就行

2. 通过 CODE 向服务器请求 Openid

这里用后台处理脚本实现,创建 getOpenid.php,直接上代码:

<?php
function getOpenid(){
        $code = $_GET['code'];//获取code
        $appid = 'xxxxxxxxxxxxxxxxxx';
        $secret = 'ssssssssssssssssssssssssssssssss';
        $weixin = file_get_contents("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code="
                .$code."&grant_type=authorization_code");//通过code换取网页授权access_token,(利用code间接获取用户数据组)
        $jsondecode = json_decode($weixin); //对JSON格式的字符串进行编码
        $array = get_object_vars($jsondecode);//转换成数组(用户数据组)
        $openid = $array['openid'];//取出openid
        return $openid;
}
$openid = getOpenid();
?>
在要用到openid的地方,先引入文件 include ("getOpenid.php"),然后就直接可以用这个变量。

注意:这里建议最好取出来存入变量中。刚开始没有取出来,直接用到openid的时候就执行一次函数,这个时候有的时候根本获取不到。

最后找到原因:必须得先有 "获取 code" 这一步的跳转,紧接 getOpenid() 才可以拿到 openid。没有 code 回调参数的情况下执行这个函数是拿不到 openid 的。

另一种方法:$code = $_GET['code']; 放到函数外部,存入到变量,就不需要每个页面都获取一次 code,。函数内要先 global $code。

3. 身份验证、创建 session

紧接上一步,我们获取到了 openid,就可以进行身份验证了。

例:openid1(未注册用户,不能访问站点) openid2(注册用户,可以访问站点)
于是我们用获取到的 openid 与数据库进行对比,返回相应的权限值。action.php:

<?php
include ("getOpenid.php");
$openid = getOpenid();

function ifUser(){
        global $openid;  //访问函数外全局变量,前面加上global
        /*
        *这里进行查数据库操作
        *$num为返回的行数
        *$num = $result->num_rows;
        */

        //如果已经存在该用户
        if ($num){
                session_start();//session启动
                $_SESSION["admin"] = true;//赋值真
        }else{//跳转其他界面
                echo '<script>window.location="Hello.html"</script>';
                die();
        }
}
?>
上面两个部分可以应该写到一起,要用的时候直接调用一个函数即可,这里还是以分开为准。

session 参考的博客:传送门 ,以及 传送门 2

要访问的页面:www.xxx.com/index.php,我们就可以在 index.php 的开头写入判断部分。
通过则继续执行下方的代码,不通过则自动跳转其他界面。

<?php
include ("getOpenid.php");
$openid = getOpenid();
include ("action.php");
ifUser();//如果两个步骤放到一个PHP脚本,则只用引用一次,可以减少openid的出现次数
 
$admin = false; //防止全局变量造成安全隐患
session_start();//启动会话
if(!isset($_SESSION["admin"]) || !$_SESSION["admin"] === true){
    //session验证不通过就跳转到其它页面
    echo '<script>window.location="Hello2.php"</script>';
    die();
}
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello Openid !</title>
</head>
<body>
    <?php 
    echo "Welcom !""<br>";
    echo "Openid is: ".&openid."<br>";
    ?>
</body>
</html>

思考:session 可以作为储存的媒介,可以将诸如身份的信息存储到里面 $_SESSION["admin"]='123';,要用的时候就进行调用 $x = $_SESSION["admin"]。

本文链接:https://ariser.cn/index.php/archives/7/
本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!