微信企业号开发五:回调模式

        企业号开发配置最麻烦、注意最多的也是回调模式,也叫被动模式,主动调用模式是企业号给员工发消息,回调模式则是员工向企业号发送消息,在接受消息上,回调模式先通过配置的链接,以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以及加密的详细处理请参考后续'接收消息时的加解密处理'的章节。

详细链接可以查看官网: http://qydev.weixin.qq.com/wiki/index.php?title=回调模式

---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------

我们写一个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();
		}

	}

在Post方法中进行消息处理

/**
	 * 处理微信服务器发来的消息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//读取消息,执行消息处理
		CoreService.processRequest(request,response);
		
	}



你可能感兴趣的:(微信,微信企业号,移动开发)