无需认证公众号!完全免费!使用企业微信API获取个人微信的openid实现用户鉴权!

摘要

在微信中,需要鉴别用户身份的常用做法是什么?当然是微信授权,获取用户的openid进行确认身份。

如果是h5网页,那么需要使用微信公众号提供的网页授权接口实现,如果是小程序那就好办,个人小程序的 wx.login 接口也可以获取openid,那么问题来了,微信公众号提供的网页授权只有认证的服务号才有权限,个人根本没机会使用,这便是门槛。

但是我发现,企业微信的接口,个人也可以使用网页授权链接实现获取用户的openid,即便你的网页不是在企业微信环境下使用,也是可以获取到用户的openid,本次文章就是我要实现的。

准备

1、登录企业微信;
2、创建一个应用;

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-1

3、创建完毕之后,进入应用,获取 AgentId 和 Secret

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-2

4、获取 appid

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-3

以上3个参数准备好,就可以用代码实现了。

getCode.php

<?php

    // 获取访问令牌的函数
    function getAccessToken($corpid, $corpsecret) {
        
        $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret";
        $response = file_get_contents($url);
        $data = json_decode($response, true);
        if(isset($data['access_token'])) {
            
            return $data['access_token'];
        } else {
            
            // 处理错误
            return false;
        }
    }
    
    // 从数组中检索访问令牌的函数
    function getCachedAccessToken() {
        
        if(file_exists('access_token.php')) {
            
            include 'access_token.php';
            return $access_token_data['access_token'];
        } else {
            
            // 如果文件不存在,返回空字符串
            return '';
        }
    }
    
    // 检查访问令牌是否过期的函数
    function isAccessTokenExpired() {
        
        if(file_exists('access_token.php')) {
            
            include 'access_token.php';
            return $access_token_data['expires_at'] < time();
        } else {
            
            // 如果文件不存在,返回 true 表示过期
            return true;
        }
    }
    
    // 将访问令牌保存到数组中的函数
    function saveAccessToken($access_token) {
        
        $access_token_data = array(
            'access_token' => $access_token, // 设置访问令牌
            'expires_at' => time() + 7200 // 设置过期时间为2小时后
        );
        file_put_contents('access_token.php', '<?php $access_token_data = ' . var_export($access_token_data, true) . ';');
    }
    
    // 你的企业微信 API 凭证
    $corpid = '你的企业微信appid';
    $corpsecret = '你的企业微信所创建的应用的Secret';
    
    // 检查访问令牌是否过期或未缓存
    if(isAccessTokenExpired()) {
        
        // 从企业微信 API 获取新的访问令牌
        $access_token = getAccessToken($corpid, $corpsecret);
        if($access_token) {
            
            // 将访问令牌保存到数组中
            saveAccessToken($access_token);
        } else {
            
            // 处理错误
            die("从企业微信 API 获取访问令牌失败。");
        }
    }
    
    // 获取用户信息
    function getUserInfo($access_token, $code) {
        $url = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=$access_token&code=$code";
        $response = file_get_contents($url);
        $data = json_decode($response, true);
        return $data;
    }
    
    // 从数组中检索访问令牌
    $access_token = getCachedAccessToken();
    
    // code
    $code = $_GET['code'];
    
    $userInfo = getUserInfo($access_token, $code);
    
    if($userInfo['errcode'] == 0) {
        
        // 判断当前是userid还是openid
        if($userInfo['userid']) {
            
            // userid
            $openid = $userInfo['userid'];
        }else {
            
            // openid
            $openid = $userInfo['openid'];
        }
        
        // 跳转到展示页面
        echo '<script>location.href="showOpenid.php?openid='.$openid.'";</script>';
    }else {
        
        // 错误
        echo $userInfo['errmsg'];
    }
    
?>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">

以上代码两处需要配置,这两处已经在上面准备阶段获取到了。

// 你的企业微信 API 凭证
$corpid = '你的企业微信appid';
$corpsecret = '你的企业微信所创建的应用的Secret';

showOpenid.php

<html>
    <head>
        <title>展示页面</title>
        <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
    </head>
    <body>
        <p style="width:90%;margin: 50px auto 0;text-align:center;padding:20px 5px;border:2px dashed #ccc;">
            <?php
                echo $_GET['openid'];
            ?>
        </p>
    </body>
</html>

以上两个php文件上传至你服务器即可。例如你的域名是:

https://www.qq.com

你将 getCode.php 和 showOpenid.php 上传至根目录下的 Auth 目录。

那么继续往下看:

构造网页授权链接

根据官方API文档可知:

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-4
使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-5

构造格式如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE&agentid=AGENTID#wechat_redirect

CORPID: 替换为你的appid
redirect_uri: 替换为getCode.php页面的链接
AGENTID: 替换为你的AgentId

假设你的CORPID是:ww1f1289a1254d49b2
假设你的AGENTID是:1000002

最终的网页授权链接如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww1f1289a1254d49b2&redirect_uri=https://www.qq.com/Auth/getCode.php&response_type=code&scope=snsapi_base&state=STATE&agentid=1000002#wechat_redirect

还要去配置一下i网页授权的域名(应用管理点进去往下拉)

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-6
使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-7

唯一缺点: 为保障企业数据安全,需配置备案主体与当前企业主体相同或有关联关系的域名。

将构造完成的链接发到微信:

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-8

点击即可获取到openid了!

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-9

注意:如果你用登录企业微信的微信扫码,可能就不是获取到openid了,而是获取到userid,因为文档说了,当用户为企业成员时(无论是否在应用可见范围之内)返回示例如下:

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-10

所以你要测试的话得找个不是你的企业微信成员的微信进行扫码,才可以看到openid,所以这一块要注意,你以后的业务逻辑也是需要对这一块进行特殊处理。

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-11

演示

使用企业微信API获取个人微信的openid实现用户鉴权!无需认证公众号!完全免费!-12

应用场景

那么问题来了,获取到openid的应用场景如何?我给大家列举一二:

1、活码系统记录用户openid是否重复访问,首次访问展示群二维码,记录openid,第二次访问活码页面就告知用户不能重复进群;

2、新老用户鉴别,假设你有一个活动,这个活动长期在推,每次有新的奖品上来,那么你可以鉴别这个用户是不是新用户,防止薅羊毛;

3、网站登录,快捷用户注册,注册后绑定微信openid,下次用户就不需要再通过输入账号和密码登录你的网站或者一些小工具了,直接微信访问链接,即可快速通过openid鉴别用户是否注册,就可以实现微信授权登录;

4、投票系统,允许同一个openid可以投票多少次,一天投票多少次,都是可以的!

场景很多,我仅仅列出冰山一角。

本文作者

TANKING