企业微信第三方应用开发入坑指南


这里需要注意的是企业微信的开发者分为2种,一种是个人开发者,一种是服务商(需要企业认证,同时需要认证费用,同微信公众号,如果有微信公众号可直接同步认证信息)。2种角色的接口等流程是一样的。同时现在企业微信是按使用应用的人数计费的!!!

相关文档:

下面是以网页应用为示例,在工具中创建应用

创建应用和配置

根据自己应用场景选择对应的选择,不同业务方向需要的提交的东西也会有所不同。对于服务商需要先企业认证,认证通过后才可以创建应用。

这里配置的是打开应用时的跳转地址,我们通常要实现静默登录就需要通过这个页面来开始。

这里配置回调信息,企业微信会通过配置的回调信息来推送信息给我们。

开发实现

回调接收

回调分为数据回调和指令回调,这2个接口都必须支持POST和GET请求,其中GET请求用于验证,POST请求用于数据接收;注意它们的GET请求的验证流程是一致(相同的,可以通用)。

回调验证

// 获取相关的参数信息
String msgSignature = request.getParameter("msg_signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
// 注意这个echostr需要额外处理一下
String echoStr = request.getParameter("echostr").replace(" ", "+");
// 调用工具类验证
return wxBizMsgCrypt.verifyUrl(msgSignature, timestamp, nonce, echoStr);

这里的echostr 有个坑,因为base64编码后会出现加号的情况,而在URL参数传递中加号会被替换为空格;这就导致后台接收到的数据不是一个合法的base64字符串,因此需要手动处理一下,将空格替换为 +

指令回调处理

数据回调和指令回调类似,这里就不再举例。

// 获取回调信息
private CallbackMsg getCallbackMsg(HttpServletRequest request){
    String msgSignature = request.getParameter("msg_signature");
    String timestamp = request.getParameter("timestamp");
    String nonce = request.getParameter("nonce");
    StringBuilder body = new StringBuilder();
    try(BufferedReader br=new BufferedReader(request.getReader())){
        String str;
        while ((str= br.readLine())!=null){
            body.append(str);
        }
    }catch (Exception e){
        log.error("读取企业微信数据回调body异常", e);
        throw new BizException(ApiCode.SERVER_ERROR, "读取请求body异常");
    }
    return CallbackMsg.builder()
            .msgSignature(msgSignature)
            .timestamp(timestamp)
            .nonce(nonce)
            .body(body.toString())
            .build();
}

// 处理回调信息
CallbackMsg callbackMsg = getCallbackMsg(request);
log.info("收到企业微信指令回调:{}", callbackMsg);
String toUserName = XMLParse.extract(callbackMsg.getBody(), "ToUserName");
WxBizMsgCrypt wxBizMsgCrypt = new WxBizMsgCrypt(suitId, toUserName);
String body = wxBizMsgCrypt.decryptMsg(callbackMsg);
log.info("企业微信指令回调解密结果:{}", body);
// 根据消息类型处理对应的消息
String infoType = XMLParse.extract(body, "InfoType");

指令回调中企业安装授权应用时会有create_auth类型的消息,这个回调会返回该企业的临时授权码,这里我们需要用这个去获取企业的永久授权码(后期可能会用到,因此最好将其存储下来)。

suite_ticket是通过指令回调定时推送的(每10分钟推送一次),我们需要通过suite_ticket来获取应用的access_suite_token,因此必须将其保存下来。获取应用授权

示例项目:https://github.com/vcharfred/wechat-ent-template


特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
  目录