微信企业号开发之启用回调模式

2017年09月19日 10:36 | 3010次浏览

企业号开发配置最麻烦、注意最多的也是回调模式,也叫被动模式,主动调用模式是企业号给员工发消息,回调模式则是员工向企业号发送消息,在接受消息上,回调模式先通过配置的链接,以Get形式发送一个密文,我们需要在Get中解析密文,返回给微信,微信接受消息无误之后,才会以Post形式将加密的真正内容发送过来,在配置上有几个注意的地方。

1、首要要有一个ICP备案的域名,一定要有ICP备案,后面需要;

2、EncodeAESKey不能随机生成,之前官网提供是不能使用的,目前不知道,EncodeAESKey生成规则是32位明文经过base64加密后,去掉“=”,形成的43位密钥;

3、替换JCE包,重启服务

4、JDK版本要大于等于1.6

5、回调模式和主动调用模式在消息发送上也有很大不同:

A:回调模式下,被动发送的消息需要时xml格式并进行加密,加密规则是首先进行AES加密,然后进行base64加密。

B:主动发送消息,格式为json格式,不需要加密,但需要token

6、回调模式接受到真正的消息内容之后,注意回复,空消息即可,否则微信会认为消息接受失败,会再次发送同一消息

微信企业号开发如何启用回调模式?就是简单的登陆PC版微信,点击应用中心,选择需要应用,再点击回调模式启用?


可以看到核心的只有三个URL,Token,EncodingAESKey这三个参数可以随便填写吗?

1 URL可以随便填写吗?

可以肯定的是,不能随便填写。不信你可以试试。因为点击确定后微信会给这个URL发送信息。因此这个URL必须是外网可以访问的地址。

而且后台还必须处理微信发送过来的信息。例如URL 是http://www.hao123.com/可以在外网方法,但点击保存时就会出现: echostr校验失败,请您检查是否正确解密并输出明文echostr


2 Token可以随便填写吗? 可以,目前我没有发现有什么特殊的要求


3 EncodingAESKey能随便填写吗? 不能随便填写,必须是数字字母的组合,而且是43个字符,建议使用微信随机生成的。


我们知道在URL处配置一个外网可以访问的URL,并不能保证保存成功,后台如何处理呢?

例如我配置为http://.../TestWeixin.ashx 则后台的处理方式,需要调用微信的相关加密解密函数

TestWeixin.ashx的后台代码为:

 public void ProcessRequest (HttpContext context) {
        if (context.Request.HttpMethod.ToLower() == "post")
        {            

        }
        else //点击保存时,微信需要验证时调用
        {
            Valid();
        }
    }

     private void Valid()
    {
        string msg_signature = HttpContext.Current.Request.QueryString["msg_signature"];
        string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
        string nonce = HttpContext.Current.Request.QueryString["nonce"];
        string decryptEchoString = "";  // 解析之后的明文
        string echoStr = HttpContext.Current.Request.QueryString["echoStr"];
        bool isok = CheckSignature(msg_signature, timestamp, nonce, echoStr, ref decryptEchoString);
        if (isok)
        {
            if (!string.IsNullOrEmpty(decryptEchoString))
            {
                HttpContext.Current.Response.Write(decryptEchoString);
                HttpContext.Current.Response.End();
            }
        }      
    }
    public bool CheckSignature(string signature, string timestamp, string nonce,string echostr, ref string retEchostr)
    {
        string token = "token"; //配置的token
        string corpId = "corpId"; //corpid,
        string encodingAESKey = "encodingAESKey"; //配置的tokenencodingAESKey
        WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId); //调用微信提供的函数
        int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);//调用微信提供的函数
        if (result != 0)
        {
            LogInfo.Error("ERR: VerifyURL fail, ret: " + result);
            return false;
        }
        return true;
        //ret==0表示验证成功,retEchostr参数表示明文,用户需要将retEchostr作为get请求的返回参数,返回给企业号。        
    }

上述为C#代码

java代码如下:

/** 
     * 请求校验(确认请求来自微信服务器) 
     */  
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // 微信加密签名  
        String signature = request.getParameter("msg_signature");  
        System.out.println("signature:"+signature);  
        // 时间戳  
        String timestamp = request.getParameter("timestamp");  
        System.out.println("timestamp:"+timestamp);  
        // 随机数  
        String nonce = request.getParameter("nonce");  
        System.out.println("nonce:"+nonce);  
        // 随机字符串  
        String echostr = request.getParameter("echostr");  
        System.out.println("echostr:"+echostr);  
          
          
        String sToken = MessageUtil.RESP_MESSAGE_TOKEN;  
        String sCorpID = MessageUtil.RESP_MESSAGE_CORPID;  
        String sEncodingAESKey = MessageUtil.RESP_MESSAGE_ENCODINGAESKEY;  
  
          
        try {  
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);  
            String sEchoStr; //需要返回的明文  
            sEchoStr = wxcpt.VerifyURL(signature, timestamp,  
                    nonce, echostr);  
            System.out.println("verifyurl echostr: " + sEchoStr);  
            // 验证URL成功,将sEchoStr返回  
            PrintWriter out = response.getWriter();  
            out.write(sEchoStr);  
            out.flush();  
            out.close();  
        } catch (Exception e) {  
            //验证URL失败,错误原因请查看异常  
            e.printStackTrace();  
        }  
  
    }

小说《我是全球混乱的源头》

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程