包教包会:企业微信服务商发布应用,获取应用安装方企业通讯录流程

近期接触了一个微信服务商项目,业务需求是,作为服务商(以下以#微码公司#为例)发布一款服务商应用(以下以#微码秀#为例),能够让安装应用的企业(以下以A公司为例,辛苦A公司),看到A公司某ERP业务数据。抛开业务,首先需要做到A公司企业通讯录和erp组织架构的关联,关联的前提就是#微码秀#能够拿到企业的通讯录数据。拿到需求的一刻,笔者还是企业微信届的小白。但在写本文的此时,已经能够拿到A公司通讯录。接下来,本文就将详细讲述如何实现 服务商应用 拿到 应用安装企业 通讯录。

以结果为导向,先看一下同步企业通讯录的接口

以同步部门列表接口为例,看一下同步部门数据接口文档
1070314-20190712112821685-2107239895.png
如图所示,必须的数据就是A公司的accessToken,所以目标明确了,我们需要A公司的AccessToken。

目标明确,要拿到安装应用的A公司accessToken

获取A公司accessToken的过程还真的有点绕,为此笔者画了一幅时序图。接下来的讲述,按照图中的标号进行。
1070314-20190712150152470-1604844829.png

1、2 并不困难,按照流程注册填写就行
3.1 数据回调、指令回调

数据回调,指令回调指的是微信端对服务商应用填写的数据回调地址、指令回调地址进行验证,确保能够正常通讯。企业微信后台会以GET请求的方式推送加密的数据,以及加密用到的用到的数据,服务商应用后台收到数据之后需要对数据进行解密处理。加密解密的代码微信会提供,个人觉得加解密算法的代码写得并不是很好,但是能用。服务商应用后台将解密的数据直接返回给企业微信后台,两边即完成数据验证。这里需要注意的是,微信开放文档专门提到需要对数据进行urldecode,但笔者使用 @RequestParam 接收数据,进行urldecode之后却总是解密失败,最后不进行 urldecode 反而成功。虽然没有深究,但笔者猜测,这可能是springMVC已经对参数进行了urldecode。

3.2 定时推送suiteTicket

suiteTicket,是服务商在调用微信后台部分接口的时候,需要的一个重要数据,一般结合suiteId , suiteSecret一起刷新。我们需要了解的重点是,suiteID suiteSecret 一般不会变化,而suiteTicket则会定时刷新。因此微信后台会定时向服务商后台推送该数据,推送的地址就是指令回调的地址。服务商后台需要将接收到的数据解密,然后解析得到xml数据,里面包含suiteTicket。然后,服务商需要将suiteTicket存起来,毕竟后面还要用到。值得一提的是,企业安装服务商应用后,服务商应用后台获取企业安装临时授权码authCode也是在指令回调。authCode和suiteTicket的解密是一样的操作,二者对应不同的数据类型InfoType。事实上指令回调还有很多infoType,对应不同的指令。下面附上指令回调验证,suiteTicket,authCode的接收代码。

 @ApiOperation("企业微信-指令回调")
    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, value = "/orderCallback")
    @ResponseBody
    public String receive(
            @RequestParam(value = "msg_signature", required = false) String msgSignature,
            @RequestParam(required = false) String timestamp,
            @RequestParam(required = false) String nonce,
            @RequestParam(value = "echostr", required = false) String echoStr,
            @RequestBody OrderCallBackDTO xml
    ) throws AesException, IOException {
        log.info("指令回调: msgSignature={} timestamp={} nonce={} echoStr={} xml={}", msgSignature, timestamp, nonce, echoStr, xml);
        if (StringUtils.isEmpty(echoStr)) {
            String content = verifyUrlService.extractXMLData(msgSignature, timestamp, nonce, xml.getEncrypt());
            SuiteDTO dto = fromXml(SuiteDTO.class, content);
            log.info("suiteDto={}", dto);
            if (dto == null) {
                log.error("解密指令,得到空数据,content={}", content);
                return null;
            }
            // 推送suiteTicket
            if (dto.getInfoType().equals(WXConstants.INFO_TYPE_SUITE_TICKET)) {
                suiteTicketService.save(dto.getSuiteTicket());
                log.info("db's suite ticket = {}", suiteTicketService.get());
            } else if (dto.getInfoType().equals(WXConstants.INFO_TYPE_CREATE_AUTH)) {
                // 临时授权码,借此获取企业永久授权码及其他信息
                log.info("临时授权码 auth_code={}", dto.getAuthCode());
                clientPermantCodeService.saveCorpInfo(dto.getAuthCode());
            }
            return WXConstants.SUCCESS;
        }
        String content = verifyUrlService.verifyUrl(msgSignature, timestamp, nonce, echoStr);
        log.info("指令回调验证,解密成功,content={}", content);
        return content;
    }
4 获取suiteAccessToken

suiteAccessToken是服务商应用一个凭证,该凭证由微信服务端生成,2小时内会刷新一次。服务商应用后台需要获取并缓存该数据,该数据获取需要suiteId,suiteSecret,suiteTicket。注意suiteTicket也是由微信服务端自动刷新的。

5 企业临时授权码authCode

企业在安装微信服务商的应用时,企业微信服务端会向服务商应用后台指令回调接口推送临时授权码authCode。拥有了authCode,等于是拿到了获取企业通讯录等其他信息的钥匙。authCode会推送给指令回调的接口,authCode具有临时的特性,有效时间比较短。再拿到authCode之后,应用服务端需要立即请求微信后台获取永久授权码以及其他企业信息(corpId,accessToken等)。永久授权码具有永久不变的特性,应用服务端可以根据永久授权码+客户应用ID来刷新企业accessToken,这也是时序图中标号6表达的内容。

6 刷新企业accessToken,不在赘述

最后附上一张数据获取依赖图

1070314-20190714170513689-1996636654.png

至此,服务商注册、设置应用已经获取安装应用企业accessToken的流程已经走通,拿到accessToken其实还只是第一步。对于需要依赖于企业通讯录数据进行应用设计与开发的企业来说,还需要进一步结合微信的数据策略来完成数据同步。文章简陋,有问题或建议欢迎评论或者添加微信 csuZengLu 交流~

转载于:https://www.cnblogs.com/tuofan/p/11175005.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值