企业微信身份验证

本篇主要是在上一篇获取第三方凭证基础上,用户通过三方网站自定义授权登录后获取用户信息,以实现用户绑定登录功能。

构造第三方应用 授权 链接

如果第三方应用需要在打开的网页里面携带用户的身份信息,

第一步需要构造如下的链接来获取授权code。

请求方式

GET

请求地址

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

参数说明

|------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 必须 | 说明 |
| appid | 是 | 第三方应用id(即ww或wx开头的suite_id)。注意与企业的网页授权登录不同 |
| redirect_uri | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 ,注意域名需要设置为第三方应用的可信域名 |
| response_type | 是 | 返回类型,此时固定为:code |
| scope | 是 | 应用授权作用域。 snsapi_base:[静默授权](#wechat_redirect 是 固定内容),可获取成员的基础信息(UserId与DeviceId); snsapi_privateinfo:[手动授权](#wechat_redirect 是 固定内容),可获取成员的详细信息,包含头像、二维码等敏感信息。 |
| state | 否 | 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节 |
| #wechat_redirect | 是 | 固定内容 |

企业员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,第三方应用可根据code参数获得企业员工的corpid与userid。code长度最大为512字节。

权限说明

使用snsapi_privateinfo的scope时,第三方应用必须有"成员敏感信息授权"的权限。

服务层业务代码

设置一个参数就是应用的SuiteId。这里的回调地址需要前端传递过来,因为是测试所以写一个固定的。返回一个网址需要在手机端企业微信中点击触发。

具体代码如下:

php 复制代码
/**
 * 构建企业微信授权链接
 * @param $backUrl
 */
public function getCompanyWxOauth()
{
	$backUrl = 'https://www.test.net/api/test';

    $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=三方应用suiteID&redirect_uri={$backUrl}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
	echo "<a href='{$url}'>点击</a>";
}

开通调用许可

在企业微信手机端点击链接后,提示需要开通【接口调用许可】。

解决方式

首先账号需要是测试企业,并且测试企业加入到测试企业列表中。

【应用管理】->【购买接口许可】企业微信接口许可 【购买】

需要添加企业客户ID,也就是之前企业授权安装获取的corpid。

这时候发现就变成0元可以购买了,购买后就可以访问了。

scope的特殊情况

当oauth2中appid=corpid时,scope为snsapi_userinfo或snsapi_privateinfo时,必须填agentid参数,否则系统会视为snsapi_base,不会返回敏感信息。

第三方服务商配置scope为snsapi_privateinfo时,agentid所对应的应用必须有"成员敏感信息授权"的权限。

"成员敏感信息授权"的开启方法为:登录服务商管理后台->标准应用服务->本地应用->进入应用->点击基本信息栏"编辑"按钮->勾选"成员敏感信息"。

获取访问用户身份

请求方式

GET

请求地址

https://qyapi.weixin.qq.com/cgi-bin/service/auth/getuserinfo3rd?suite_access_token=SUITE_ACCESS_TOKEN&code=CODE

参数说明

|--------------------|------------|-------------------------------------------------------------------|
| 参数 | 必须 | 说明 |
| suite_access_token | 是 | 第三方应用凭证:suite_access_token |
| code | 是 | 通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 |

业务处理

通过上篇《企业微信获取第三方凭证》得到三方凭证也就是suite_access_token和授权链接得到的code,可用来获取访问用户身份信息。

具体代码如下:

php 复制代码
/**
 * 获取企业微信 suite_access_token
 * @return array|mixed
 */
public function companyAccessToken()
{
    $url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token";
    $params = json([
        'suite_id' => '三方应用的suitId',
        'suite_secret' => '三方应用Secret',
        'suite_ticket' => 'redis存储的回调解析得到的ticket'
    ]);
    $info = $this->linkCurl($url, 'POST', $params);
    $res = djson($info);
    if (isset($res['errcode'])) {
        return toFail('error', $res);
    }
    return toSuccess('success', [
        'access_token' => $suite_access_token
   ]);
}


/**
 * 获取企业微信用户信息
 * @param $code
 * @return array|mixed
 */
public function getWxUserInfo($code)
{
    if (empty($code)) {
        return toFail('请输入code参数!');
    }
       $get_access_token = $this->companyAccessToken();
        if ($get_access_token['status'] != 1) {
        return $get_access_token;
    }
    $access_token = $get_access_token['data']['access_token'];
    $url = "https://qyapi.weixin.qq.com/cgi-bin/service/auth/getuserinfo3rd?suite_access_token={$access_token}&code={$code}";
    $info = $this->linkCurl($url, 'GET');
	print_r($info);die;
  }
返回内容

返回的是通过请求授权链接,经过用户允许后获取基本用户信息。

bash 复制代码
{
    "errcode":0,
    "errmsg":"ok",
    "corpid":"ww0d127fa51eaab",
    "userid":"YuanLaiShiNi",
    "parents":[],
    "open_userid":"woxL4YTwAAvAGu3mLUy8dkchzW"
}
返回参数说明

|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 说明 |
| errcode | 返回码 |
| errmsg | 对返回码的文本描述内容 |
| corpid | 用户所属企业的corpid |
| userid | 用户在企业内的UserID,如果该企业与第三方应用没有授权关系时,返回密文UserId,有授权关系时,按照[升级后的ID策略](#参数 说明 errcode 返回码 errmsg 对返回码的文本描述内容 corpid 用户所属企业的corpid userid 用户在企业内的UserID,如果该企业与第三方应用没有授权关系时,返回密文UserId,有授权关系时,按照升级后的ID策略返回明文或密文 user_ticket 成员票据,最大为512字节。 scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。 后续利用该参数可以获取用户信息或敏感信息,参见"第三方使用user_ticket获取成员详情"。 expires_in user_ticket的有效时间(秒),随user_ticket一起返回 open_userid 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取)返回明文或密文 |
| user_ticket | 成员票据,最大为512字节。 scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。 后续利用该参数可以获取用户信息或敏感信息,参见["第三方使用user_ticket获取成员详情"](#参数 说明 errcode 返回码 errmsg 对返回码的文本描述内容 corpid 用户所属企业的corpid userid 用户在企业内的UserID,如果该企业与第三方应用没有授权关系时,返回密文UserId,有授权关系时,按照升级后的ID策略返回明文或密文 user_ticket 成员票据,最大为512字节。 scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。 后续利用该参数可以获取用户信息或敏感信息,参见"第三方使用user_ticket获取成员详情"。 expires_in user_ticket的有效时间(秒),随user_ticket一起返回 open_userid 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取)。 |
| expires_in | user_ticket的有效时间(秒),随user_ticket一起返回 |
| open_userid | 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取 |

总结

本篇主要是在上一篇获取第三方凭证基础上,用户通过三方网站自定义授权登录后获取用户信息,以实现用户绑定登录功能。

相关推荐
凡人的AI工具箱6 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀6 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy6 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行7 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7128 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴8 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries9 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05679 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱10 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐12 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea