
3.2 回调模式
登录企业号,在页面右上方单击“开发者中心”选项进入开发者中心,然后单击“开发文档”→“开始开发”选项,选择回调模式,参考里面的开发文档。
3.2.1 回调模式概述
关于回调模式,主要概括为两个要点,第一点是处于回调模式下,可以主动调用企业号接口,还可以接收成员的消息和事件,第二点是每个应用都有自己开发回调模式的开关,可以在管理端设置相关参数。
3.2.2 使用回调模式所需加解密库下载
关于回调模式的开启和交互,需要我们下载加解密库,官方提供多种语言版本,可以自行下载。大家也可以关注笔者的微信企业号获取下载地址。
3.2.3 接收消息的加解密处理
企业号在回调企业URL时,会对消息体本身做AES加密,以XML格式POST到企业应用的URL上。企业在被动响应时,也需要对数据加密,以XML格式返回给微信。企业的回复支持文本、图片、语音、视频、图文等格式。下载微信官方提供的加解密库之后,将需要替换的库文件替换掉即可,然后调用加解密函数进行开发。
3.2.4 编写加解密调用函数
为了方便大家学习,笔者新建了一个微信企业号项目,从零开始、一点一滴地把整个开发流程全部详细地讲解和展示出来。新建一个项目,然后下载官方网站提供的加解密Java库并解压,复制到自己新建的项目下。为了方便管理,最好新建一个新的包名,注意命名规范,然后将其复制到该包名下,导入需要用到的第三方jar,后面会告诉大家需要哪些第三方jar。接下来开始编写新的工程。在编写之前一定要替换JDK的jat,官方网站的文档如图3-14所示。

图3-14 替换JDK及导入三方jar
图3-14说明的内容如下。
(1)com\qq\weixin\mp\aes目录下是用户需要用到的接入企业微信的接口,其中WXBizMsgCrypt.java文件提供的WXBizMsgCrypt类封装了用户接入企业微信的三个接口,其他类文件用于实现加解密,用户无须关心。sample.java文件提供了接口的使用示例。
(2)WXBizMsgCrypt封装了VerifyURL、DecryptMsg、EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.java文件。
(3)请开发者使用jdk1.6或以上版本。针对org.apache.commons.codec.binary.Base64,需要导入jar包commons-codec-1.9(或comm ons-codec-1.8等其他版本),官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi。
(4)异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本,例如JDK7的下载地址:http://www.oracle.com/ technetwork/java/javase/downloads/jce-7-download-432124.html)。下载后解压,可以看到local_policy.jar、US_export_policy.jar以及readme.txt。如果安装了JRE,就将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件;如果安装了JDK,就将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来的文件。
全部完成之后,打开MyEclipse,开始新项目的编写。首先看看项目的主要构成(见图3-15),再开展后面的工作。

图3-15 初次编写的项目结构
jsp.weixin.encryption.util下的类都来自微信官方网站下载的加解密库,ParamesAPI主要是一些需要配置的参数,后面需要修改时可以更快地找到对应的参数并修改。CoreServlet为核心的请求、外发类,包括加密、解密消息。注意导入需要的jar,web.xml、index.jsp的相关配置也会详细介绍。

上述代码是参数类的配置,接下来再编写一个请求类CoreServlet。



这是需要写的核心请求类,写完这个类开始配置xml、index文件。

在index.jsp里配置一下验证信息,信息可以随意填写,如笔者填写的是英文笔名。

在body标签对之间输入一些特定的内容,待浏览器打开该页面时,可查看内容是否一致。
整个项目完成之后,需要再部署一次,在本地验证一遍,最后上传到服务器,如图3-16所示。

图3-16 部署新的项目
按图3-16所示的步骤操作,最后单击“OK”按钮,再打开浏览器,输入地址http://localhost/ WeiXinEnterprises。如果服务器配置端口为8080,地址需要这样写http://localhost:8080/ WeiXinEnterprises,输完后按回车键,跳到默认的index.jsp页面,如图3-17所示。

图3-17 本地测试OK
3.2.5 项目提交到服务器
按图3-16操作后,会在Tomcat安装路径下的webapps目录下生成对应的项目,需要把项目上传到服务器部署或打包成WAR,通过Web Manager的方式提交。下面给大家介绍两种上传方式。
第一种方式是Web Manager 上传,首先按图3-18所示操作,把项目导出。
单击Export选项进入如图3-19所示的界面,单击J2EE选项展开其子选项,再选择WAR file选项,然后单击“Next”按钮进入如图3-20所示的界面,最后单击“Finish”按钮即可。

图3-18 项目打包成WAR

图3-19 选择WAR file

图3-20 导出WAR文件
在浏览器中输入服务器地址,打开远程服务器管理页面,如图3-21所示,输入用户名和密码,再单击“确定”按钮。

图3-21 远程登录管理页面
登录成功后,进入如图3-22所示的界面,拖动页面至底部,单击“选择文件”按钮,弹出文件选择框,找到刚刚导出项目的WAR文件并选中,再单击“打开”按钮,最后单击“Deploy”按钮即可开始上传项目的WAR文件。

图3-22 上传WAR文件
上传完成后,往上拖动页面至Applications表格并单击WeiXinEnterprises选项,可查看WeiXinEnterprises项目的默认页面。
在浏览器中输入项目地址并访问该地址,项目部署成功的界面如图3-23所示。

图3-23 项目部署成功
第二种方式是直接复制本地webapps目录下的对应项目到服务器Tomcat安装路径下的webapps目录,如图3-24所示。

图3-24 在服务器部署
重启服务器端Tomcat,在浏览器中输入项目访问地址即可查看该项目的默认页面。
3.2.6 开启回调模式
登录企业号,进入企业号管理后台的“企业应用”页面。开启回调模式之前需要选择一个应用,然后填写相关的参数。笔者选择“Android趣味堂”作为开启回调模式的应用,如图3-25所示。当然,其他应用也可以开启回调模式。

图3-25 选择开启回调模式的应用
单击这个应用,进入该应用的详细信息页面,如图3-26所示。找到接收消息选项,单击“设置API接收”选项,进入如图3-27所示的界面,开始填写开启回调模式的相关信息和配置项。

图3-26 单击“设置API接收”选项

图3-27 填写回调模式配置信息
接下来详细介绍3个参数的意义,以及怎么获取并开启回调模式。
- URL:为发布和部署应用的服务器的域名,具体怎么填写后面会讲。
- Token:为后台验证需要,在这里的Token需要跟后台,即我们写的回调应用里的Token。
- EncodingAESKey:为后台随机生成的。
如图3-28所示的代码为开启回调模式需要的参数。

图3-28 需要的参数
Secret参数的获取方式是,进入企业号管理后台,单击“企业应用”选项,进入“企业应用”页面,如图3-29所示。
在“企业应用”页面单击所要调试的应用后,进入应用详情页面,如图3-30所示,框内的内容就是Secret参数了。

图3-29 进入“企业应用”页面

图3-30 获取Secret
需要注意的一点是,EncodingAESKey参数是有时间限制的,如果长时间没有使用,配置回调模式就会失败,需要再次生成新的密钥才行,所以EncodingAESKey生成之后需要尽快使用,如图3-31所示。
参数填写完之后,单击“保存”按钮,等待返回结果。
如图3-32所示的界面为成功开启回调模式。

图3-31 填写参数

图3-32 回调模式开启成功
成功开启回调模式之后,就可以使用回调模式、测试回调模式了。