企业微信接入第三方应用(以服务商身份)

最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼抓瞎的类型,因为场景比较特殊网上搜到的资料也不多,只能自己看着官方文档一点一点去调试。于是,一系列的踩坑之路就上演了,这里就简单介绍一下笔者自己踩的坑吧,也为其他刚刚接触企业微信开发者朋友们提供一点借鉴。

首先,要明确两个概念,就是微信和企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的第三方应用也不是一个东西(虽然也有些接口可以调用),企业内部开发指的是开发某个企业自己用的应用,而第三方应用开发指的就是开发者作为服务商开发第三方应用,让其他企业(使用企业微信的人)安装你(服务商)开发的应用。此处重点介绍下笔者作为服务商第三方应用的开发过程吧!(如下图是企业微信官方文档,上面有企业内部开发和第三方应用开发)
在这里插入图片描述

需要的准备:注册两个企业,一个作为应用的服务商,一个作为应用的使用者,使用服务商的企业登陆到服务商的管理平台。此处需要注意的是,企业微信有两个管理平台,一个是企业微信管理后台另一个是服务商管理平台,不要登陆错了。
企业微信管理后台:https://work.weixin.qq.com/wework_admin
企业微信服务商管理后台:https://open.work.weixin.qq.com/wwopen/developer
企业微信管理后台
企业微信服务商平台
第一步,在服务商平台创建一个应用,将需要填写的信息填入。基础信息可以根据实际情况填写,开发信息可能刚接触的时候并不清楚如何填写,这里可以暂时先写随便写一个,后面可以修改并且需要认证,下文会将用到的一一进行介绍。
在这里插入图片描述
在这里插入图片描述
第二步,信息介绍
1.基本信息,在基本信息中尤其要注意的是suiteId和secret,suiteId是用于标记用于的唯一标识,secret是用于加解密的秘钥,尤其是secret,千万不能泄露。
在这里插入图片描述
2.使用配置,应用主页是企业安装第三方应用之后,跳转的主页页面;可信域名是企业微信进行授权和前端使用JS-SDK的时候校验的域名,若是域名不一致企业微信会报错;安装完成回调域名是在企业进行安装应用之后回调接口的域名;业务设置URL笔者没有用到,没有进行深究
在这里插入图片描述
3.回调配置,数据回调URL笔者没有用到,也是随便写了一个;指令回调URL,这个千万要注意,在后面获取到suite_ticket(应用ticket)的时候就需要用他;Token和EncodingAESKey,自动生成填上就行,不过不要随便去更改,因为这边更改的话,后面解密信息的时候就需要更改代码中的这两个值。
在这里插入图片描述
比较重要的信息就是这些,因为笔者自己的需要这边没有用到业务设置URL和数据回调URL,若是有大神用到也希望不吝指出,这里感激不尽。

第三步,开发文档,将以上信息了解了之后,还需要看下官方文档。因为笔者是作为java开发的角度来进行开发的,所以主要需要了解的是快速入门服务端开发API注意,此处文档区分第三方应用开发和企业内部开发,服务商开发第三方应用一定是第三方应用的那一篇文档,千万不要看错了!
文档链接:https://work.weixin.qq.com/api/doc
在这里插入图片描述
1.快速开发,注意此处的三个场景:企业的、应用的和服务商的。在开发过程中一定要分清这三者的区别,这是重中之重,“企业的”是指登录者所属的企业;“应用的”是指开发者的第三方应用;“服务商的”是指应用所属的企业,这和登录的企业不一样,一定要区分清楚!(此处不分清楚,后面会有很多坑)
在这里插入图片描述
2.服务端API,这里就是主要获取需要的信息api都有,但此处要区分清楚应用的、企业的、服务商的、个人的信息,它们不可通用(如下文介绍的user_ticket和suite_ticket不是一个东西)
在这里插入图片描述
第四步:指令回调流程的建立,在第二步中说到指令回调Url,需要在这里进行配置(代码在这一步最后贴上),企业微信官方会每10分钟调用一次,或者手动点击“刷新Ticket”,或者在编辑完成确认的时候会进行回调。
在这里插入图片描述

指令回调的需要先参考这篇文档(其中有好几个需要注意的点)
在这里插入图片描述
注意点1:解密此处有demo,直接使用官方的即可
在这里插入图片描述
在这里插入图片描述
注意点2:在使用java解密过程中,可能会出现异常java.security.InvalidKeyException:illegal Key Size,这是因为jdk本身有解密策略的限制(有限制的解密策略,好像是为了传输安全?),这需要去oracle官方下载无限制的解密策略,企业微信官方也给出了关于这个问题的解决方案(在解密demo代码的WXBizMsgCrypt类的注释中,如图)
此处附上下载地址:
JDK7:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
在这里插入图片描述

注意点3:验证回调和实际数据传输方式不同:验证是GET请求,解密后需要将明文的echostr返回回去,实际数据传输是POST请求,入参是xml格式传入(但是在链接上也会有解密需要的参数msg_signature、timestamp、nonce因此都要接收),需要返回success
在这里插入图片描述
在这里插入图片描述
注意点4:此处数据类型可能有很多种,具体可以参考文档的这边,此处笔者只是接收了suite_ticket(应用ticket)类型进行处理
在这里插入图片描述
在这里插入图片描述
以下是笔者自己写的demo的代码(此处用dom4j解析xml字符串):

	@ResponseBody@RequestMapping(value = "/directCallback")public void directCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("----------------------------");System.out.println("this is directCallback");response.setCharacterEncoding("UTF-8");try {String corpid = request.getParameter("corpid");// 企业微信加密签名String msgSignature = request.getParameter("msg_signature");// 时间戳 与nonce结合使用,用于防止请求重放攻击String timestamp = request.getParameter("timestamp");// 校验时字符串String echostr = request.getParameter("echostr");// 随机数 与timestamp结合使用,用于防止请求重放攻击String nonce = request.getParameter("nonce");System.out.println("msgSignature: "+ msgSignature);System.out.println("timestamp: "+ timestamp);System.out.println("echostr: "+ echostr);System.out.println("nonce: "+ nonce);if("GET".equals(request.getMethod())) { // get请求表示是验证System.out.println("corpid:" + corpid);String echostrDecrypt = null;// 校验服务商公司idWXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, corpid);echostrDecrypt = wxcpt.VerifyURL(msgSignature, timestamp, nonce, echostr);System.out.println("verifyurl echostr: " + echostrDecrypt);response.setCharacterEncoding("UTF-8");response.getWriter().write(echostrDecrypt);}else { // post请求表示是真实数据// 获取传过来的xml信息(密文)InputStream ins = request.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(ins));StringBuilder postData = new StringBuilder();String line = null;while((line=bufferedReader.readLine()) != null) {postData.append(line);}System.out.println("postData:"+ postData);WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, suiteid);String info = wxcpt.DecryptMsg(msgSignature, timestamp, nonce, postData.toString());System.out.println("解析的明文是:" + info); // 此处明文是xml信息// 解析xml,若InfoType是suite_ticket的话,说明是发送ticket的响应方式Document doc = DocumentHelper.parseText(info);Element root = doc.getRootElement();String infoType = root.elementTextTrim("InfoType");if("suite_ticket".equals(infoType)) { // 此处只是进行suite_ticket的处理,若是需要其他的处理需要在这里添加类型String suiteTicket = root.elementTextTrim("SuiteTicket");System.out.println("拿到的ticket是: " + suiteTicket);}response.getWriter().write("success");}System.out.println("----------------------------");} catch (Exception e) {//验证URL失败,错误原因请查看异常e.printStackTrace();}}

第五步:建立应用授权流程(注意主体是应用),此处不是登陆者登录之后授权才能用那个流程,而是在安装应用时候的授权流程。此时是为了获取应用的access_token(第三方应用凭证)和permanent_code(永久授权码),有了access_token和permanent_code,加上之前的suite_ticket(应用ticket),很多其他的信息就可以获取到了
1.在服务商网站配置ip访问白名单,这一点不可忽略,否则无法访问
在这里插入图片描述
在这里插入图片描述
2.获取企业的access_token(第三方应用凭证),此处ticket就是企业微信官方每10分钟推送的suite_ticket(应用ticket),还需要应用的id和应用的secret
在这里插入图片描述
3.安装应用获取auth_code(临时授权码),此处只是进行安装测试,若需要正式上线需要走上线流程
在这里插入图片描述
使用另一个企业进行此处的安装测试之后,之前实现的回调接口会接收到临时授权码的信息
在这里插入图片描述
在这里插入图片描述
4.获取到permanent_code永久授权码
在这里插入图片描述
有了access_token、permanent_code和suite_ticket之后,很多的信息都可以获取到了

第六步:用户登录时的用户授权流程,在用户登录的时候,需要用户授权应用,获取去到用户信息,将用户与第三方应用中的用户关联起来。此处,企业微信官方采用的是oauth2授权方式,oauth2授权流程可以参考文档此处--------此处请注意下后面的更新,有神坑!!!!!
在这里插入图片描述
1.构造oauth2授权链接,此处若是后面需要获取到用户的手机号、邮箱等敏感信息,必须要使用手动授权方式(即scope=snsapi_privateinfo),服务商管理后台中创建的应用,必须支持获取用户的敏感信息,这两个条件只要有一个不满足就无法获取到用户的手机号等敏感信息。
在这里插入图片描述
在这里插入图片描述
构造的oauth2链接可以放在前端,也可以由后端配置后返回给前端,但是oauth2链接必须由前端跳转(不能由后端重定向,当然内部转发跳不到服务器之外的地址更不行),因为此处关联了设置的可信域名,可信域名关联前端使用的JS-SDK因此必须填前端域名
在这里插入图片描述
2.获取user_ticket(用户ticket),此处不能搞混user_ticket和suite_ticket,一个是用户的ticket,通过code获取;一个是应用的ticket,企业微信每10分钟推送给回调函数(笔者就搞混了,一直以为是哪里获取的不对导致获取不到用户信息)
在这里插入图片描述
3.若是还需要获取到用户的敏感信息,则根据access_token和user_ticket就可以拿到了,当然,是建立在可以拿到的前提下(应用允许获取、oauth2采用手动授权、用户同意授权)
在这里插入图片描述
获取到用户信息之后,就可以将企业微信的用户信息和业务的用户信息关联起来,主要的流程就可以疏通了!

第七步:服务端配置客户端需要的签名signature等信息,在客户端的JS-SDK中,必须要先调用wx.config接口来进行权限的校验之后,才能够进行JS其他接口的调用,此时就需要服务端将签名signature、时间戳timestamp、随机串nonceStr、登录公司corpId返回,如下图
在这里插入图片描述
此处需要注意的点不少,只要有一点对不上,那么就可能造成流程走不下去。

注意点1:
使用JSSDK之前,一定要填写可信域名并且校验,否则JSSDK的接口无法使用。此处需要注意的点是,若是测试授权应用的话,进行验证之后,一定要重新安装才能生效,笔者就因为没有重新安装卡了很久,一直以为是配置的问题。
在这里插入图片描述
在这里插入图片描述

注意点2:
生成签名的算法需要参考客户端附录中的这篇文档(如图),由于之前第三方应用凭证已经获取到,此处jsapi_ticket也可以拿到了
在这里插入图片描述
注意点3:
生成签名算法的时候,需要的url参数一定不要加上#后面的参数
在这里插入图片描述
注意点4:
校验签名算法工具:https://work.weixin.qq.com/api/jsapisign
此处只能校验签名是否正确,但是不能保证传入的url正确,因此需要确保传入的url包含“?”后面的参数但是不包含#后面的参数,如“http://xxx.xxx.xxx/xxx/?test=xxx”,可使用UUID生成nonceStr,再加上时间戳和url,将代码生成的signature和工具生成的signature进行校对保证生成算法的正确性
在这里插入图片描述

注意点5:
在附录最后一篇中,有各种错误的结局方案,但是此处说要将生成signature进行转码,但是亲测转码之后是不行的,不转码可以
在这里插入图片描述

以上就是笔者疏通整个企业微信流程的踩过的坑,当然因为也是第一次接触,还有很多还不熟悉,可能还有很多谬误,若是读者发现那里不对,还望不吝指教!


20190814更新
更新遇到的两个神坑:
神坑1.官方文档上提供了获取登录用户的手机号、邮箱等敏感信息
在这里插入图片描述
在构建oauth链接的时候,仅仅有一个“已废弃”的字样,可是在使用中还是可以继续使用的,到这里,一切还没有其他问题,正常使用。。。
在这里插入图片描述
于是!!!!!在上线审核的时候,获取用户敏感信息的应用,是审核不通过的!!!
在这里插入图片描述
找客服仔细确认之后(普通客服到技术客服到产品客服),才知道现在以后不支持获取用户敏感信息的应用上线的!!!!!(可能以后会支持,但是目前不支持,时间节点是20190814)

神坑2.在服务商的应用中,是可以填写多个可信域名的(3个),但是亲测,只有第一个有效!!!另外的两个无论是构建oauth链接,还是使用jssdk(此处笔者调用的是wx.config这个jssdk无效,报错为not reliable domain),均无效(也是找客服确认后才知道,只有第一个是有效的)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从码力到算力的“狂飙”,探元宇宙的未来风向

导语 | 随着 GPT-4 的问世,大大加速催化了 AIGC 与元宇宙的融合发展,在大家对元宇宙的了解逐渐深入之后,越来越多企业不断探索元宇宙的发展机遇。那么在技术驱动的数字时代,我们该如何看待元宇宙的未来发展?今天&#…

chatgpt赋能python:Python怎么更改语言

Python怎么更改语言 Python是一种高级编程语言,因其简洁、易读、易学和可扩展性而受到许多程序员的青睐。 Python在许多领域中都有着广泛的应用,特别是在数据科学领域和人工智能领域。 本文将探讨如何使用Python更改语言,介绍一些工具和技巧…

ClickHouse用户路径分析原理及实现

在互联网数据分析钟,有一种针对用户行为路径的分析模型——路径分析。路径分析应用是对特定事件的上下游进行可视化展示并分析用户在使用产品时的路径分布情况。比如:当用户使用某APP时,是怎样从【首页】进入【详情页】的,用户从【…

【GIT】git个人笔记

GIT个人手册 版本 日期 修订内容 作者 V01 2019-06-25 初稿 备注: 使用中不断迭代完善,其他人使用中有其他总结的,可以补充。 目录 第一章 说明 一.1.1 GIT 中文手册 一.1.2 git仓库说明(工作区、暂存区、本地仓、远程仓)1 一.1.3 g…

ES优化实战- forceMerge搜索提升测试报告

测试结论 通过测试数据能够得出以下结论。 对于历史不变的数据,段合并的效果是非常好的。它对普通查询(query_string)有着较大的提升,提升在10%~90%不等的效果,其中搜索条件命中的结果集越多,提升就越明显…

unity对接T.Flight Hotas 4操控杆

unity对接T.Flight Hotas 4操控杆: 注: 提示: 本篇主要说明,如何使用unity获取 T.Flight Hotas 4 传回来的各种值 获取驱动: 提示:首先要下载安装官方的驱动,用他的软件先检测一边是否能够正常运行 地址: 固件地址:https://support.thrustmaster.com/zh/product…

ES优化实战 - 小操作节省百分之三十以上的磁盘空间

通过关闭索引的 _source来节省磁盘 un_source 是去掉存储的数据。在查询的时候,不反回数据。数据只做索引和倒排这些。 这样做的意思是,只让es做检索,不做存储。es检索完,只返回一个id。然后选用Hbase这样的数据库联动。Hbase擅长…

ES 搜索优化测试 - indexSort 对检索性能提升50%

indexSort 是在写入数据的时候,根据某个字段做排序。我们可以理解为数据的预排序。 在检索的时候,假如搜索正好是根据排好序的字段做排序的,那么将会有 50%的 检索性能提升效果。 注意,不要在请求中返回 count数据总量。这样配合i…

unity中的摇杆按钮设置

摇杆设备的所有按钮都有顺序编号,下图按钮框内的1到16分别对应摇杆设备的各个按钮。 若要使用摇杆的某个按钮需按 joystick button 按钮编号 的格式设置。unity的按钮从0开始计算在设置的时候需要减去一个数。 下图红线框住的选项其设置表示:摇杆7号按钮…

【转】浅谈协方差

【转】浅谈协方差 觉得有用的话,欢迎一起讨论相互学习~ 转载自:http://pinkyjie.com/2010/08/31/covariance/ 作者:进击的马斯特 协方差矩阵 Matlab协方差矩阵

IT 常用词汇(一)

1, amend [əmend] vt. 修改;改善,改进 vi. 改正,改善;改过自新 n. (Amend)人名;(德、英)阿门德 2, bearer [bɛrɚ] n. 持票人;[建] 承木;[机] 托架;送信人;搬运工人 …

浅谈协方差矩阵(马斯特的斯马特生活)

统计学的基本概念 学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧&#x…

Thrustmaster(图马思特) HOTAS Warthog 疣猪杆 读取按钮数据

我所使用的摇杆是THRUSTMASTER(右下图所示),用于在目标追踪页面进行框选物体(实际应用场景不涉及鼠标键盘,只能使用操作杆进行操作) 1、首先,安装摇杆所需环境,winR输入cmd后&#x…

速魔与图马思特优缺点对比

速魔和图马思特优缺点对比速魔图马思特传动系统直驱双皮带最大力反馈10Nm10Nm工作电压110-240V220-240V功率360W240W快拆50mm/70mm 盘面通用特制优点1.直驱,没有传动装置 2.力反馈更加直接 3.回盘速度更快,输出力度更大,操控好 4.秒换方向盘 …

微软获GPT-3独家授权,OpenAI创始人马斯克:与初衷相悖

萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软获OpenAI GPT-3独家授权,马斯克不高兴了。 就在微软官宣GPT-3后一天,马斯克在社交媒体上吐槽此事:“这看起来像是与‘开放’相悖。OpenAI本质上已经被微软‘控制’了。” 这件事情的起因&…

张俊林:GPT-4 模型会开创哪些新的研究方向?

作者|张俊林知乎 整理|蘑菇先生学习记 分享一篇张俊林老师关于GPT-4模型会开创哪些新的研究方向的回答。 引言 在这个历史性的时刻,回答个问题,留下自己作为历史见证人的足迹。先遵循这个问题的主旨,写两句GPT-4开创了…

OpenAI 发布 GPT-4,有哪些技术上的优化或突破?

作者:张俊林 在这个历史性的时刻,回答个问题,留下自己作为历史见证人的足迹。GPT4的技术报告里很明确地指出了三个新的方向: 第一,LLM最前沿研究的封闭化或小圈子化。 技术报告里说了,出于竞争以及安全等方…

海康威视人证对比设备SDK-C#

SDk下载地址:https://www.hikvision.com/cn/download_more_570.html 本文应用场景:第一次进行人脸身份证的验证方式,之后刷脸即可得到这个用户的信息 调用的SDK为布防门禁事件,以下为流程图和说明 报警回调事件 实际使用&#x…

java调用海康威视人脸识别抓拍

**1.**首先下载官网的sdk开发包,引入HCNetSDK.java,里面定义了很多调用的能力集。 **2.**通过报警回调函数中的黑名单报警这个接口去实现人脸抓拍的。 3.简单来说就是写个类去实现HCNetSDK.FMSGCallBack 然后根据条件函数 case HCNetSDK.COMM_SNAP_MATCH…

对接海康威视平台拿取视频流

创建工具类 public class ArtemisUtil {private static final Logger logger LoggerFactory.getLogger(ArtemisUtil.class);static {ArtemisConfig artemisConfig new ArtemisConfig();artemisConfig.setAppKey("123");artemisConfig.setAppSecret("123"…