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

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

William
2024-04-20 / 0 评论 / 4 阅读 / 正在检测是否收录...

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

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

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

准备

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

image.png

3、创建完毕之后,进入应用,获取 AgentIdSecret

image.png

4、获取 appid

image.png

以上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.phpshowOpenid.php 上传至根目录下的 Auth 目录。

那么继续往下看:

构造网页授权链接

根据官方API文档可知:

image.png
image.png

构造格式如下:

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

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

image.png
image.png

配置完授权域名后,也要配置信任IP,不然会提示你从不被允许的IP访问

配置企业可信IP

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

image.png

点击即可获取到openid了!

image.png

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

image.png

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

image.png

0

评论 (0)

取消