企业号开发配置最麻烦、注意最多的也是回调模式,也叫被动模式,主动调用模式是企业号给员工发消息,回调模式则是员工向企业号发送消息,在接受消息上,回调模式先通过配置的链接,以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(); } }
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程