APP下载

基于Java Servlet的微信公众平台开发实训环境搭建

2017-03-24生力军

电脑知识与技术 2017年1期

生力军

摘要:微信公众平台开发实训环境的搭建面临的主要问题是开发技术的选择和内部服務器的映射。流行的Java Servlet技术与网络映射软件的结合可以方便搭建微信公众平台开发的实训环境。搭建核心步骤包括:使用Apache Tomcat配置公众号服务器、使用“花生壳”映射内网服务器、使用Java Servlet验证服务器的有效性,其解决了微信公众平台开发课程实施过程中的关键问题。

关键词:java servlet; 微信公众平台开发; 实训环境; 内网映射; 服务器验证

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2017)01-0079-03

Abstract: Training environment of WeChat public platform development is constructed by using Java Servlet and network mapping software. Core steps include configuring public server, mapping intranet server, validating server. It solves the key problem in implementation of the curriculum of WeChat public platform development.

Key words: java Servlet; WeChat public platform development; training environment; network mapping; server validation

1 微信公众平台开发实训环境搭建存在的问题

目前,智能手机已经广泛普及到了人们的生活当中,而微信又是智能手机上使用率首屈一指的移动应用。据2015年腾讯统计的微信数据显示:90%以上的智能手机安装了微信,微信每月活跃用户高达5.49亿,遍及全世界200多个国家,使用语言超过20种,微信支付用户达到了4亿人。特别需要关注的是:各类品牌、企业、个体开通的微信公众账号总数已超过850万个,而对接公众账号的移动应用仅有8万5千个。可见,市场对微信公众平台功能的对接与开发存在了巨大的需求,微信公众平台应用已经与传统Web端应用同等重要。因此,各大互联网及软件企业对于微信公众平台开发人员的需求量也持续上升。作为需要与企业需求密切接轨的高职院校,也纷纷敏锐地捕捉到这一需求,计划在各自的计算机或软件专业中开设微信公众平台开发相关的专业必修或选修课。然而,由于微信公众平台开发涉及腾讯公司的后台服务器对于互联网消息的转发,课程在实训阶段所面临的实训环境问题成为课程实施过程中的最大阻碍。

如图1所示,由于微信公众号服务器不是像传统Web服务器直接接收和处理用户请求,而是经过了腾讯微信后台的转发,这就要求腾讯微信后台能够在Internet上与微信公众号服务器进行交互。在传统的实训室中,我们能保证学生人手一台实训计算机,这台实训计算机一般被配置成虚拟服务器,只能在实训室的局域网内使用,并不能被Internet上的设备所寻址,也就无法被腾讯微信后台访问,导致微信公众平台开发的实训无法进行。

另一方面,选择何种语言作为微信公众平台开发的教学也是一个关键问题。腾讯公司提供了一套微信公众平台开发的接口,并没有对开发语言进行限制。由于目前Web应用还是业界主流,因此高职计算机和软件专业教学一般都将Java或C#语言作为必修课。微信公众平台开发作为Web开发的后续课程,可以选用与先修课程同样的开发语言。

本文以Java Servlet作为微信公众平台开发技术,以内网映射软件“花生壳”作为服务器映射工具,搭建了微信公众平台开发实训环境,解决了制约课程实施的关键问题。

2 配置微信公众号服务器

进行公众号开发,关键是开发属于我们自己的公众号服务器。这里我们建立服务器要解决的关键问题主要有两点:第一,采用何种平台建立服务器?第二,如何把内网服务器映射到Internet上?

2.1 使用Apache Tomcat配置微信公众号服务器

Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。其主要特点是:开放源码、技术先进、性能稳定、免费使用。据调查,在现行的Java Web服务器中,Tomcat服务器的市场占有率保持在50%以上。由于我们采用Java语言作为微信公众平台的开发语言,Servlet作为Java服务器端开发的重要技术自然必不可少,采用Tomcat作为服务器就成了最经济实惠且一脉相承的解决方案。Tomcat的安装及配置比较简单,主要保证Tomcat的版本与JDK、JRE相应的版本一致即可,本文采用的是Tomcat 7+JDK 7+JRE 1.7开发环境。

2.2 使用“花生壳”映射内网服务器

“花生壳”是一个动态域名解析软件,在任何地点、任何时间、使用任何线路,均可利用动态域名解析服务建立拥有固定域名和最大自主权的互联网主机。

1)注册并获得域名

下载“花生壳”软件,注册之后便可获得一个形如:xxxxx.xicp.net的域名,使用这个域名,就可以让腾讯微信后台能够顺利寻址到我们的微信公众平台服务器。

2)配置内网映射

“花生壳”软件的核心功能就是内网映射,如图2所示,我们需要填写的重要参数包括:内网主机、内网端口、外网端口。

其中,内网主机是指局域网内部主机IP地址,由于实训时,一般都是由每个学生将自己的计算机映射成服务器,所以这里一般填写本机IP:127.0.0.1;内网端口取决于前面步骤配置的Tomcat服务的端口号,以便让腾讯微信后台能够正确与Tomcat服务进行通信;外网端口是指映射到Internet上的Tomcat服务端口号,由于腾讯微信后台默认采用http协议与微信公众平台服务器进行通信,所以这里一般选择http协议默认采用的80端口。

3 验证微信公众平台服务器的有效性

3.1 填写服务器配置

如果要讓自己搭建的服务器能够接受腾讯微信公众平台的信息转发,首先就需要登录腾讯微信公众平台官网的开发者中心,填写服务器地址(URL)、令牌(Token)和消息加密解密密钥(EncodingAESKey)。

其中URL是开发者用来接收微信消息和事件的接口URL,这里我们需要填写“花生壳”软件映射的外网地址。Token是开发者随机填写,其作用主要是参与验证算法,使微信公众平台服务器能够验证自己搭建服务器的安全。EncodingAESKey也是由开发者随机填写,其作用主要是作为传输消息的加密和解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效。

3.2 验证URL的有效性

当开发者在微信公众平台官网的开发者中心填写好URL、Token和EncodingAESKey后,微信服务器将会发送一条信息到该URL上进行服务器有效性的验证,该消息采用了HTTP的GET请求,请求中附加了4个参数,signature、timestamp、nonce、echostr,其含义如表1所示:

微信服务器要求开发者检验参数signature,对微信服务求发送的HTTP请求进行校验,具体校验流程为:

1)将token、timestamp、nonce三个参数按照字典序排序;

2)将三个参数拼接成一个完整的字符串;

3)使用sha1算法对拼接后的字符串进行加密;

4)将加密后的字符串与signature对比,如果一致就表示该HTTP GET请求来源于微信服务器。

如果能够确认此HTTP GET请求来自微信服务器,则只需要将echostr参数的内容原样返回给微信服务器即可,自此接入即可生效;如果校验不成功,则接入失败。

为了使用Java Servlet实现上述流程,我们使用MyEclipse2015集成开发工具,新建一个Web项目,添加一个新的工具类Tool来实现上述流程,实现代码如下:

public class Tool {

//这里的Token与微信服务器配置信息中的 Token 要一致

private static String token = "whslj2015";

//函数checkSign用来验证签名

public static boolean checkSign (String sign, String time, String nonce){

String[] array = new String[]{token, time, nonce};

//将token、timestamp、nonce三个参数按照字典序排序

Arrays.sort(array);

String newStr="";

//将三个参数拼接成一个完整的字符串

for(int i = 0; i < array.length; i++){

newStr+=array[i];

}

String tmpStr = "";

try {

MessageDigest md = MessageDigest.getInstance("SHA-1");

//使用sha1算法对拼接后的字符串进行加密

byte[] secret = md.digest(newStr.getBytes());

tmpStr = bytesToStr(secret);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

newStr = null;

//将加密后的字符串与signature对比

if (tmpStr.equals(sign.toUpperCase())) {

return true;

}

else {

return false;

}

}

//函数bytesToStr用来将字节数组转为16进制字符串

private static String bytesToStr(byte[] dig) {

String str = "";

for(int i = 0; i < dig.length; i++){

str += bytesTo16Str(dig[i]);

}

return str;

}

//函数bytesTo16Str将单字节转为16进制字符串

private static String bytesTo16Str(byte by) {

char[] Digital = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

char[] tempArray = new char[2];

tempArray[0] = Digital[(by >>> 4) & 0X0F];

tempArray[1] = Digital[by & 0X0F];

String str = new String(tempArray);

return str;

}

}

接下來,在Web项目中新建一个Servlet,在其中的doGet方法中实现参数的捕获,以及参数验证,返回结果等一系列操作,就能完成服务器地址的有效性验证逻辑,实现代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String signature = request.getParameter("signature");

String timestamp = request.getParameter("timestamp");

String nonce = request.getParameter("nonce");

String echostr = request.getParameter("echostr");

PrintWriter outPrint = response.getWriter();

//将加密后的字符串可与signature对比,如果一致就表示该HTTP GET请求来源于微信服务器

if(Tool.checkSign(signature, timestamp, nonce)){

outPrint.print(echostr);

}

outPrint.close();

outPrint = null;

}

最后,将项目部署到Tomcat服务器,登录微信公众平台官网后,将服务器地址(URL)完善为上面新建的Servlet完整外网地址,验证成功后,整个实训环境的搭建就完成了。

4 结束语

本文利用流行的Java Servlet技术结合网络映射软件搭建了微信公众平台开发的实训环境,解决了课程实施过程中的关键问题。实际上,不论何种开发语言,都可以结合相应的服务器软件和网络映射软件构建微信公众平台开发实训环境。服务器有效性验证只需要按照腾讯提供的微信开发API提供的验证算法,也可以用任意开发语言实现,本文就整个操作过程提供了基本思路。

参考文献:

[1] 梁广浩.搭建框架快速开发微信公众平台功能[J].大众科技, 2015(17).

[2] 杨杰.基于微信公众平台校园服务公众号的设计与实现[D].武汉:华中师范大学,2015.

[3] 易伟.微信公众平台搭建与开发揭秘[M]. 2版.北京:机械工业出版社,2015.

[4] 马俊.公众号的开发和应用——基于湖南某微信公众平台设计[J].电脑知识与技术, 2015,11(34):213-216.

[5] 甘荣石.基于微信平台的移动银行应用架构研究[D].广州:华南理工大学,2013.

[6] 夏文忠,单长吉.微信公众平台在图书馆信息系统中的应用[J].吉林广播电视大学学报,2015(8):10-12.

[7] 常永杰,陈亮,张颖.基于新媒体技术的电力微博微信服务平台设计分析[J].河北电力技术, 2015,34(5):50-53.

[8] 宿晶格.基于3G手机网络的广播媒体传播交互式应用研究[D].哈尔滨:哈尔滨工业大学,2013.