企业微信第三方应用开发小白版

根据项目要求,参考binary wangwx-java-cp sdk 来集成企业微信第三方应用。由于之前没有做过企业微信的开发,遇到了不少的坑,主要是不熟练导致的。在文章最后会有项目demo链接,方便下载参考使用。

第一步:登录企业微信,选择第三方服务商注册应用
任何具备以下条件的开发者都可以在“第三方官网”注册成为第三方服务商。
1、拥有第三方服务商身份的企业微信。
2、具有互联网上部署及发布应用的能力。
企业微信第三方应用开发小白版_第1张图片
企业微信第三方应用开发小白版_第2张图片
第二步:企业管理员授权应用
在服务商官网或企业微信官网找到适用的第三方应用后,管理员可发起一键授权。系统将展示第三方应用授权页面,管理员根据授权页面的引导,确认授权内容,完成授权操作。
企业微信第三方应用开发小白版_第3张图片
企业微信第三方应用开发小白版_第4张图片
企业微信第三方应用开发小白版_第5张图片
企业微信第三方应用开发小白版_第6张图片
第三步:第三方服务商提供服务
完成授权后,第三方即可获取企业赋予的永久授权码。通过此授权码,第三方可以换取到企业的访问凭证,从而可以调用通讯录管理、消息推送、身份验证、移动端SDK、素材、OA数据接口、企业支付、电子发票等相关接口。

我主要是卡在了配置两个回调接口怎么写。
首先指令回调按照企微文档的写法思路是接收企微发送过来的签名,时间戳,随机数,密文后,会根据签名时间戳还有随机数生成token,如果token对比正确,开始解密密文,并以明文的形式返回,这里要注意了,decrypt解析出来的明文字符串是[*****] 这样带中括号的,给我坑死了。要将中括号去除。
下面是指令回调的代码。

![在这里插入代码片](https://img-blog.csdnimg.cn/bfcbec638ee84bcbaf4df756d3250a16.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMGVyb3I=,size_20,color_FFFFFF,t_70,g_se,x_16)
/**
     * 指令回调URL
     *
     * @param signature 签名
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @param echostr   密文
     * @return
     */
@ApiOperation("指令回调URL")
    @PostMapping("/suite/receive")
    public String doSuitePost(@RequestParam(name = "msg_signature", required = false) String signature,
                              @RequestParam(name = "timestamp", required = false) String timestamp,
                              @RequestParam(name = "nonce", required = false) String nonce,
                              @RequestParam(name = "echostr", required = false) String echostr,
                              HttpServletRequest request) {
        log.info("\n接收微信请求:[signature=[{}], timestamp=[{}], nonce=[{}], echostr=[{}] ",
                signature, timestamp, nonce, echostr);

        String requestBody = getXmlData(request);
        if (StrUtil.isNotEmpty(requestBody)) {
            log.info(requestBody);
            WxCpTpConfigStorage wxCpTpConfigStorage = wxCpTpService.getWxCpTpConfigStorage();
            WxCpTpCryptUtil cryptUtil = new WxCpTpCryptUtil(wxCpTpConfigStorage);
            String xml = cryptUtil.decrypt(signature, timestamp, nonce, requestBody);
            log.info("解密后的原始xml消息内容:{}", xml);
            WxCpTpXmlMessage message = WxCpTpXmlMessage.fromXml(xml);
            wxCpTpConfigStorage.updateSuiteTicket(message.getSuiteTicket(), Integer.MAX_VALUE);
        }
        return "success";
    }

上面我自己的代码加上大佬的优化。
同样的,我把大佬单独写的回调也放上去,但是他的参数里有个id我不太明白,如果id表示应用id的话,怎么解释第三方应用id需要在获取永久授权码时才自动生成应用id。
下面的大佬的代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e9280be52264b98a38657c88e05ae53.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMGVyb3I=,size_20,color_FFFFFF,t_70,g_se,x_16)
这是大佬的代码,始终无法明白这个id指代什么。


数据回调接口如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a3999b3f080408f846933a4e8cf8f2b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMGVyb3I=,size_20,color_FFFFFF,t_70,g_se,x_16)

```java
 @ApiOperation("数据回调URL")
    @GetMapping(produces = "text/plain;charset=utf-8")
    public String doGet(@RequestParam(name = "msg_signature", required = false) String signature,
                        @RequestParam(name = "timestamp", required = false) String timestamp,
                        @RequestParam(name = "nonce", required = false) String nonce,
                        @RequestParam(name = "echostr", required = false) String echostr) {
        log.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
                signature, timestamp, nonce, echostr);
        WxCpTpConfigStorage wxCpTpConfigStorage = wxCpTpService.getWxCpTpConfigStorage();
        if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
            throw new BusinessException(ErrorStatus.ILLEGAL_DATA, "请求参数非法,请核实!");
        }
        if (wecomService.checkSignature(signature, timestamp, nonce, echostr)) {
            String plainText = new WxCpTpCryptUtil(wxCpTpConfigStorage).decrypt(echostr).replaceAll("\\[", "").replaceAll("]", "");
            log.info("明文:[plainText=[{}]]", plainText);
            return plainText;
        }
        return "非法请求";
    }

大佬写的我也放上去
企业微信第三方应用开发小白版_第7张图片
同样是不明白id表示什么。

获取三种类型access_token

企业微信第三方应用开发小白版_第8张图片
说实话看官方文档我觉得还好,很多参数都是我配置好的。但是我的疑惑是使用了binary wang的wx-java-cp这个sdk后出现的。被卡住主要是因为在获取这些token的时候,api里居然一个参数都没有,点开源码一看参数都是从内存或者缓存中获取的。
下面是我在yml文件里关于企业微信的配置
企业微信第三方应用开发小白版_第9张图片

还是直接整个demo吧,方便点,一共有两个demo,
1:binary wang 提供的demo,里面有很多都是自建应用的的写法,不过有参考价值,可以换成第三方应用的api。
链接:https://pan.baidu.com/s/1s_vZ77B73IfE7ndqKsOUoA
提取码:7zpp
2:大佬的优化后的代码,目前除了回调,我认为其它地方都是可以看懂的,
链接:https://pan.baidu.com/s/1XXWJMAyW7FyZ-OP6We0URQ
提取码:7gle

你可能感兴趣的:(java)