包教包會:企業微信服務商發布應用,獲取應用安裝方企業通訊錄流程


近期接觸了一個微信服務商項目,業務需求是,作為服務商(以下以#微碼公司#為例)發布一款服務商應用(以下以#微碼秀#為例),能夠讓安裝應用的企業(以下以A公司為例,辛苦A公司),看到A公司某ERP業務數據。拋開業務,首先需要做到A公司企業通訊錄和erp組織架構的關聯,關聯的前提就是#微碼秀#能夠拿到企業的通訊錄數據。拿到需求的一刻,筆者還是企業微信屆的小白。但在寫本文的此時,已經能夠拿到A公司通訊錄。接下來,本文就將詳細講述如何實現 服務商應用 拿到 應用安裝企業 通訊錄。

以結果為導向,先看一下同步企業通訊錄的接口

以同步部門列表接口為例,看一下同步部門數據接口文檔

如圖所示,必須的數據就是A公司的accessToken,所以目標明確了,我們需要A公司的AccessToken。

目標明確,要拿到安裝應用的A公司accessToken

獲取A公司accessToken的過程還真的有點繞,為此筆者畫了一幅時序圖。接下來的講述,按照圖中的標號進行。

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,不在贅述

最后附上一張數據獲取依賴圖

至此,服務商注冊、設置應用已經獲取安裝應用企業accessToken的流程已經走通,拿到accessToken其實還只是第一步。對於需要依賴於企業通訊錄數據進行應用設計與開發的企業來說,還需要進一步結合微信的數據策略來完成數據同步。文章簡陋,有問題或建議歡迎評論或者添加微信 csuZengLu 交流~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM