企业号开发配置最麻烦、注意最多的也是回调模式,也叫被动模式,主动调用模式是企业号给员工发消息,回调模式则是员工向企业号发送消息,在接受消息上,回调模式先通过配置的链接,以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、回调模式接受到真正的消息内容之后,注意回复,空消息即可,否则微信会认为消息接受失败,会再次发送同一消息
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
在回调模式下,企业不仅可以主动调用企业号接口,还可以接收成员的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密。
企业号的每个应用都有自己的回调模式开关。在管理端开启并设置好相关参数后,此应用的回调模式才生效。
针对加解密的处理,微信提供了各种语言的库,企业可以在附录中下载。
当你开启应用的回调模式时,企业号会要求你填写应用的URL、Token、EncodingAESKey三个参数。
URL是企业应用接收企业号推送请求的访问协议和地址,支持http或https协议。
Token可由企业任意填写,用于生成签名。
EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。
验证URL、Token以及加密的详细处理请参考后续'接收消息时的加解密处理'的章节。
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
我们写一个servlet服务,在Get方法中进行请求校验,对接加密解密的工具类,微信API已经提供,注意修改JCE,并重启生效http://qydev.weixin.qq.com/wiki/index.php?title=加解密库下载与返回码
/**
* 请求校验(确认请求来自微信服务器)
*/
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();
}
}
/**
* 处理微信服务器发来的消息
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取消息,执行消息处理
CoreService.processRequest(request,response);
}