企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证;

本篇将介绍如何将应用安装到企业工作台。

添加测试企业

通过【应用管理】->【测试企业配置】添加测试企业。

通过企业微信扫描二维码添加测试企业。

注意:需要扫描的账号为管理员权限。

安装测试应用

安装方式

客户企业授权安装第三方应用有两种发起方式:

1.通过服务商网站的授权链接安装

2.通过企业微信应用市场直接安装

安装测试途径

服务商网站的授权链接方式需要应用已经上线才可实施,

本教程仅讲解如何测试应用市场安装的方式。

企业微信提供两种安装测试途径:

1.从服务商后台安装测试:服务商可在本地应用中对已创建的应用进行安装测试

2.自行构造测试授权链接:调用设置授权配置接口,构造测试授权链接进行测试授权

安装测试

在【应用详情】页面,点击【安装测试】,确保指令回调和数据回调均已通过验证。

 

添加企业安装

在【安装测试】中点击【添加企业安装测试】。

安装测试之前,请先确保当前测试已经加入测试企业列表中。

 在【测试安装】确认页面,点击【确认】。

 

管理员授权

使用测试企业的管理员企业微信,扫码【管理员授权】。

确认【可见范围】、【授权应用权限】等安装信息。

接收临时授权码

预授权码用于企业授权时的第三方服务商安全验证。

需要通过授权成功后指令回调POST解析获取临时授权码。

回调内容

可以看到InfoType类型为create_auth。

接下来就是将解析得到的临时授权码请求永久授权码和授权企业信息。

企业永久授权码

该API用于使用临时授权码换取授权方的永久授权码,

并换取授权信息、企业access_token,临时授权码一次有效。

请求方式

POST

请求地址

https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=SUITE_ACCESS_TOKEN

请求包体

{"auth_code": "auth_code_value"}

 

业务代码

还是在原来的post回调解析中处理新的类型。这里需要注意的一点是:获取到的auto_code不是一个字符串,而是一个xml对象类型;所以下方在处理时,先进行json处理后又转换为数组类型,这样就能获取其中的key 0内容。

代码如下:

/**
 * 企业微信post回调解析
 * @param $sReqMsgSig
 * @param $sReqTimeStamp
 * @param $sReqNonce
 * @param $sReqData
 * @return string
 */
public function callbackPOST($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData)
{
    $sMsg = "";  // 解析之后的明文
    $wxcpt = new \WXBizMsgCrypt(self::$token, self::$encodingAesKey, self::$SuiteID);
    $errCode = $wxcpt->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg);
    if ($errCode == 0) {
        // 解密成功,sMsg即为xml格式的明文
        writeRecordLog('companyWechat.log', "解密成功:\r\n" . var_export($sMsg, true));
        // TODO: 对明文的处理
        // 解析该xml字符串,利用simpleXML
        libxml_disable_entity_loader(true);
        //禁止xml实体解析,防止xml注入
        $xml = simplexml_load_string($sMsg, 'SimpleXMLElement', LIBXML_NOCDATA);
        switch ($xml->InfoType) {
            case 'suite_ticket': // 存储suite_ticket
                $log_desc = '存储suite_ticket:' . $xml->SuiteTicket;
                self::$redisWechat->setCompanyTicket($xml->SuiteTicket);
                break;
            case 'create_auth': // 授权小程序
                $auth_code = djson(json($xml->AuthCode));
                $log_desc = '接收临时授权码:' . $auth_code[0];
                $log_desc .= "\r\n" . '获取永久授权码';
                $res = $this->getPermanentCode($auth_code[0]);
                $log_desc .= "\r\n" . $res;
                break;
            case 'cancel_auth': // 删除小程序
                $log_desc = '删除小程序,取消企业微信corpId:' . $xml->AuthCorpId;
                break;
            default:
                $log_desc = '未知的类型:' . $xml->InfoType;
                break;
        }
        writeRecordLog('companyWechat.log', '解析日志:' . $log_desc);
        return 'success';
    } else {
        writeRecordLog('companyWechat.log', "ERR: " . $errCode . "\r\n");
        return "ERR: " . $errCode . "\r\n";
    }
}

/**
 * 获取企业永久授权码信息
 * @param $authCode
 * @return array|mixed|string
 */
protected function getPermanentCode($authCode)
{
    $get_access_token = $this->companyAccessToken();
    $access_token = $get_access_token['data']['suite_access_token'];
    $url = 'https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=' . $access_token;
    $params = json(['auth_code' => $authCode]);
    $info = $this->linkCurl($url, 'POST', $params);
    return $info;
 }

回调响应

在回调中解析并打印到日志中,可查看到获取的授权企业信息,并包含永久授权码。

参数说明

下面是回调中通过临时授权码获取的企业永久授权码接口返回参数说明,主要用到企业access_token、permanent_code和授权企业信息、授权应用信息及授权管理员信息。

参数

说明

access_token

授权方(企业)access_token,最长为512字节。代开发自建应用安装时不返回。

expires_in

授权方(企业)access_token超时时间(秒)。代开发自建应用安装时不返回。

permanent_code

企业微信永久授权码,最长为512字节

auth_corp_info

授权方企业信息

auth_corp_info.corpid

授权方企业微信id

auth_corp_info.corp_name

授权方企业名称,即企业简称

auth_corp_info.corp_type

授权方企业类型,认证号:verified, 注册号:unverified

auth_corp_info.corp_square_logo_url

授权方企业方形头像

auth_corp_info.corp_user_max

授权方企业用户规模

auth_corp_info.corp_full_name

授权方企业的主体名称(仅认证或验证过的企业有),即企业全称。企业微信将逐步回收该字段,后续实际返回内容为企业名称,即auth_corp_info.corp_name。

auth_corp_info.subject_type

企业类型,1. 企业; 2. 政府以及事业单位; 3. 其他组织, 4.团队号

auth_corp_info.verified_end_time

认证到期时间

auth_corp_info.corp_wxqrcode

授权企业在微信插件(原企业号)的二维码,可用于关注微信插件

auth_corp_info.corp_scale

企业规模。当企业未设置该属性时,值为空

auth_corp_info.corp_industry

企业所属行业。当企业未设置该属性时,值为空

auth_corp_info.corp_sub_industry

企业所属子行业。当企业未设置该属性时,值为空

auth_info

授权信息。如果是通讯录应用,且没开启实体应用,是没有该项的。通讯录应用拥有企业通讯录的全部信息读写权限

auth_info.agent

授权的应用信息,注意是一个数组,但仅旧的多应用套件授权时会返回多个agent,对新的单应用授权,永远只返回一个agent

auth_info.agent.agentid

授权方应用id

auth_info.agent.name

授权方应用名字

auth_info.agent.square_logo_url

授权方应用方形头像

auth_info.agent.round_logo_url

授权方应用圆形头像

auth_info.agent.appid

旧的多应用套件中的对应应用id,新开发者请忽略

auth_info.agent.auth_mode

授权模式,0为管理员授权;1为成员授权

auth_info.agent.is_customized_app

是否为代开发自建应用

auth_info.agent.auth_from_thirdapp

来自第三方应用接口唤起,仅通过第三方应用添加自建应用 获取授权链接授权代开发自建应用时,才返回该字段

auth_info.agent.privilege

应用对应的权限

auth_info.agent.privilege.allow_party

应用可见范围(部门)

auth_info.agent.privilege.allow_tag

应用可见范围(标签)

auth_info.agent.privilege.allow_user

应用可见范围(成员)

auth_info.agent.privilege.extra_party

额外通讯录(部门)

auth_info.agent.privilege.extra_user

额外通讯录(成员)

auth_info.agent.privilege.extra_tag

额外通讯录(标签)

auth_info.agent.privilege.level

权限等级。
1:通讯录基本信息只读
2:通讯录全部信息只读
3:通讯录全部信息读写
4:单个基本信息只读
5:通讯录全部信息只写

auth_info.agent.shared_from

共享了应用的企业信息,仅当由企业互联或者上下游共享应用触发的安装时才返回

auth_info.agent.shared_from.corpid

共享了应用的企业信息,仅当企业互联或者上下游共享应用触发的安装时才返回

auth_info.agent.shared_from.share_type

共享了途径,0表示企业互联,1表示上下游

auth_user_info

授权管理员的信息,可能不返回

auth_user_info.userid

授权管理员的userid,可能为空

auth_user_info.open_userid

授权管理员的open_userid,可能为空

auth_user_info.name

授权管理员的name,可能为空

auth_user_info.avatar

授权管理员的头像url,可能为空

接下来就是把永久授权码和企业授权id或者其他能用上的信息保存起来;

这里就不在详说,可根据具体业务实现。

总结

本篇将介绍如何将应用安装到企业工作台,其中包含添加测试企业、安装测试应用及获取企业授权信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/167534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录

目录 一、前言 1.Database.ExecuteSqlCommand 方法不被EF7.0支持 2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用 3.主键和标识列分离,成功实现插入与修改 二、新建本文涉及的项目 三、程序设计 1.Form1.cs源码 2.Form1.cs[设计] 四、生成和测试 1.原始表 …

【EI会议征稿】2024年电气技术与自动化工程国际学术会议 (ETAE 2024)

2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 2024 International Conference on Electrical Technology and Automation Engineering 2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 将于2024年3月8-10日在中国杭州召开。电气工程及其自动化和人们的日常生活…

Vue3的7种和Vue2的12种组件通信

Vue3 组件通信方式 props$emitexpose / ref$attrsv-modelprovide / injectVuex Vue3 通信使用写法 props 用 props 传数据给子组件有两种方法&#xff0c;如下 方法一&#xff0c;混合写法 // Parent.vue 传送 <child :msg1"msg1" :msg2"msg2">…

CLIP浅谈

CLIP论文地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP代码地址&#xff1a;https://github.com/openai/CLIP 简介 CLIP是OpenAI在2021年2月发表的一篇文章&#xff0c;它的主要贡献有以下2点&#xff1a; 1&#xff09;将图…

MCU内存基础知识

文章目录 一、存储器分类二、C语言内存分区内存区三、STM32启动文件分析四、应用分析 一、存储器分类 RAM&#xff08;Random Access Memory) &#xff1a;掉电之后就丢失数据&#xff0c;读写速度块 ROM (Read Only Memory) &#xff1a;掉电之后仍然可以保持数据 单片机的RA…

【Java SE】 详解java访问限定符

访问限定符 Java中主要通过类和访问权限来实现封装&#xff1a;类可以将数据以及封装数据的方法结合在一起&#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符&#xff1a; 实际只有三种访问限定…

纯CSS动态渐变文本特效

如图所示&#xff0c;这是一个炫酷的文本渐变效果&#xff0c;如同冰岛的极光一般。本次的文章让我们逐步分解代码&#xff0c;了解其实现原理。 基于以上动图效果可以分析以下是本次动效实现的主要几点&#xff1a; 文本中有多个颜色的动画每个颜色显示的半径不同&#xff0…

亚马逊化妆品护肤品等HRIPT/RIPT重复性斑贴测试如何办理?

一、哪类产品需要HRIPT / RIPT斑贴试验&#xff1a; HRIPT&#xff08;人体重复斑点试验&#xff09;和RIPT&#xff08;人体斑点试验&#xff09;是化妆品相关的测试&#xff0c;用于评估化妆品是否可能引起皮肤敏感和过敏反应。只有化妆品类产品需要进行HRIPT / RIPT斑贴试验…

五分钟搭建开源ERP:Odoo,并实现公网远程访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

普通函数VS箭头函数

首先给大家看一个代码 const jonas {year: 1995,calcAge: function () {console.log(this);console.log(2038 - this.year);},greet: () > console.log(Hey ${this.firstName}), };jonas.greet();这个会输出什么&#xff1f; 这个我们上篇文章中讲过&#xff0c;箭头函数…

(五)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (文档加载 Document Loading)

&#x1f604; 大语言模型(Large Language Model, LLM), 可以回答许多不同的问题。但是大语言模型的知识来源于其训练数据集&#xff0c;并没有用户的信息&#xff08;比如用户的个人数据&#xff0c;公司的自有数据&#xff09;&#xff0c;也没有最新发生时事的信息&#xff…

算法-二叉树-简单-二叉树的最大和最小深度

记录一下算法题的学习7 二叉树的最大深度 题目&#xff1a;给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例分析&#xff…

概念解析 | 光电神经网络:optoelectronic neural network

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:光电神经网络。 概念解析 | 光电神经网络的原理、挑战与未来 1. 背景介绍 在过去的十年中,深度学习和神经网络在许多领域取得了显著的成就,如图像识别、自然语言处理、医疗…

【大数据开发】FineReport报表基础入门

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 登录账号二 创建一个新的表格三 单元格扩展3.1 无扩展3.2 纵向扩展3.3 横向扩展 四 父子格…

代码随想录算法训练营第四十一天【动态规划part03】 | 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;dp[i] 拆分i&#xff0c;可以得到的最大乘积为dp[i]确定递推公式&#xff1a;从1开始遍…

一周互联网简讯 | 本周互联网发生了啥?(第3期)

1.百度T7跳槽字节3-1&#xff0c;总包145万&#xff0c;压力太大想降级 硕士毕业工作10年&#xff0c;一百度T7大头兵发文称&#xff0c;自己最近拿到字节3-1的offer&#xff0c;年包从现有的110万涨30%到145万。但是担心去字节后因为定的职级高需要带人&#xff0c;压力会很大…

nginx代理本地服务请求,避免跨域;前端图片压缩并上传

痛点 有时用vscode进行一些测试 请求不同端口服务、或者其他服务接口时时&#xff0c;老是会报跨域&#xff0c;非常的烦 所有就想用 nginx 进行请求代理&#xff0c;来解决这个痛点 nginx 下载地址&#xff1a;nginx: download 下载到某一目录&#xff1a; window下nginx相关…

10个值得关注的即时通讯软件开发趋势

作为即时通讯软件开发领域的专家&#xff0c;以下是我对即时通讯软件开发的十个值得关注的趋势的分享。 1. 云通信技术的进步 随着云计算和网络技术的不断发展&#xff0c;云通信技术在即时通讯软件开发中扮演着越来越重要的角色。通过使用云通信技术&#xff0c;开发者可以实…

文具办公产品展示预约小程序的作用如何

从整体来看&#xff0c;文具办公品牌/门店的生意来源于线下自然流量或线上自营商城/入驻第三方商城的的流量&#xff0c;线上多数情况都是以直接销售配送为主&#xff0c;但其实对文具品牌/门店而言还有信息展示、服务预约、在线咨询、产品介绍等需求。 虽然小区周边的消费者需…

vue安装three.js并创建第一个入门场景

vue安装three.js&#xff0c;并创建第一个入门场景 安装three.js npm install --save three引入three.js import * as THREE from threethree.js结构 three.js坐标 创建一个场景 scene场景&#xff0c;camera相机&#xff0c;renderer渲染器 创建一个场景 this.scene new T…