java版微信公众平台消息接口应用示例
本文实例讲述了java版微信公众平台消息接口应用方法。分享给大家供大家参考,具体如下:
微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对Java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口。
首先先把整个接口代码贴出来做下比较,然后我们再分析代码:
PHP:
valid();
classwechatCallbackapiTest
{
publicfunctionvalid()
{
$echoStr=$_GET["echostr"];
//validsignature,option
if($this->checkSignature()){
echo$echoStr;
exit;
}
}
publicfunctionresponseMsg()
{
//getpostdata,Maybeduetothedifferentenvironments
$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];
//extractpostdata
if(!empty($postStr)){
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$fromUsername=$postObj->FromUserName;
$toUsername=$postObj->ToUserName;
$keyword=trim($postObj->Content);
$time=time();
$textTpl="
%s
0
";
if(!empty($keyword))
{
$msgType="text";
$contentStr="Welcometowechatworld!";
$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
echo$resultStr;
}else{
echo"Inputsomething...";
}
}else{
echo"";
exit;
}
}
privatefunctioncheckSignature()
{
$signature=$_GET["signature"];
$timestamp=$_GET["timestamp"];
$nonce=$_GET["nonce"];
$token=TOKEN;
$tmpArr=array($token,$timestamp,$nonce);
sort($tmpArr);
$tmpStr=implode($tmpArr);
$tmpStr=sha1($tmpStr);
if($tmpStr==$signature){
returntrue;
}else{
returnfalse;
}
}
}
?>
JAVA:
<%@pageimport="java.util.Date"%>
<%@pageimport="org.dom4j.Element"%>
<%@pageimport="org.dom4j.DocumentHelper"%>
<%@pageimport="org.dom4j.Document"%>
<%@pageimport="java.io.IOException"%>
<%@pageimport="java.io.InputStreamReader"%>
<%@pageimport="java.io.BufferedReader"%>
<%@pageimport="java.io.Reader"%>
<%@pageimport="java.security.MessageDigest"%>
<%@pageimport="java.util.Arrays"%>
<%@pagelanguage="java"contentType="text/html;charset=utf-8"pageEncoding="utf-8"%>
<%
//WeiXinHandler为内部类不能使用非final类型的对象
finalStringTOKEN="weixin";
finalHttpServletRequestfinal_request=request;
finalHttpServletResponsefinal_response=response;
%>
<%
classWeiXinHandler{
publicvoidvalid(){
Stringechostr=final_request.getParameter("echostr");
if(null==echostr||echostr.isEmpty()){
responseMsg();
}else{
if(this.checkSignature()){
this.print(echostr);
}else{
this.print("error");
}
}
}
//自动回复内容
publicvoidresponseMsg(){
StringpostStr=null;
try{
postStr=this.readStreamParameter(final_request.getInputStream());
}catch(Exceptione){
e.printStackTrace();
}
//System.out.println(postStr);
if(null!=postStr&&!postStr.isEmpty()){
Documentdocument=null;
try{
document=DocumentHelper.parseText(postStr);
}catch(Exceptione){
e.printStackTrace();
}
if(null==document){
this.print("");
return;
}
Elementroot=document.getRootElement();
StringfromUsername=root.elementText("FromUserName");
StringtoUsername=root.elementText("ToUserName");
Stringkeyword=root.elementTextTrim("Content");
Stringtime=newDate().getTime()+"";
StringtextTpl=""+
" "+
" "+
"%3$s "+
" "+
" "+
"0 "+
" ";
if(null!=keyword&&!keyword.equals(""))
{
StringmsgType="text";
StringcontentStr="Welcometowechatworld!";
StringresultStr=textTpl.format(textTpl,fromUsername,toUsername,time,msgType,contentStr);
this.print(resultStr);
}else{
this.print("Inputsomething...");
}
}else{
this.print("");
}
}
//微信接口验证
publicbooleancheckSignature(){
Stringsignature=final_request.getParameter("signature");
Stringtimestamp=final_request.getParameter("timestamp");
Stringnonce=final_request.getParameter("nonce");
Stringtoken=TOKEN;
String[]tmpArr={token,timestamp,nonce};
Arrays.sort(tmpArr);
StringtmpStr=this.ArrayToString(tmpArr);
tmpStr=this.SHA1Encode(tmpStr);
if(tmpStr.equalsIgnoreCase(signature)){
returntrue;
}else{
returnfalse;
}
}
//向请求端发送返回数据
publicvoidprint(Stringcontent){
try{
final_response.getWriter().print(content);
final_response.getWriter().flush();
final_response.getWriter().close();
}catch(Exceptione){
}
}
//数组转字符串
publicStringArrayToString(String[]arr){
StringBufferbf=newStringBuffer();
for(inti=0;i
<%
WeiXinHandlerhandler=newWeiXinHandler();
handler.valid();
%>
以上就是PHP接口和JSP接口的所有代码,现在我们来对一些需要注意的地方做下分析:
首先的从总体看的话,jsp要比PHP繁琐一些,因为很多函数需要自己写,像sha1加密,解析xml字符串等都需要自己找第三方的库。
第一点,我们要获取微信公众平台给jsp发送的post或get参数,正常情况下都是用request.getParameter就可以获取到,但是在写的过程中发现PHP是这样获取
$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];
这时通过查询一些资料知道这样获取的是无法通过$_GET或$_POST函数得到的”未识别MIME类型的数据“,原始的POST数据
(参考:https://www.nhooo.com/article/117653.htm)
所以这里使用获取原始数据流的方式来解析post的xml数据
StringpostStr=null;
try{
postStr=this.readStreamParameter(final_request.getInputStream());
}catch(Exceptione){
e.printStackTrace();
}
//从输入流读取post参数
publicStringreadStreamParameter(ServletInputStreamin){
StringBuilderbuffer=newStringBuilder();
BufferedReaderreader=null;
try{
reader=newBufferedReader(newInputStreamReader(in));
Stringline=null;
while((line=reader.readLine())!=null){
buffer.append(line);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(null!=reader){
try{
reader.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
returnbuffer.toString();
}
第二个,是response消息返回给微信平台,我尝试的用最一般的out.print去做,但是发现没反应,观察PHP的代码写法
echo""; exit;
猜想可能需要有个刷新的操作才能把消息response回去,于是找了下response内的一些函数做出以下尝试
//向请求端发送返回数据
publicvoidprint(Stringcontent){
try{
final_response.getWriter().print(content);
final_response.getWriter().flush();
final_response.getWriter().close();
}catch(Exceptione){
}
}
发现以上做法是可以在微信发送端得到消息的;
第三个,接口描述上说目前只支持80端口的服务端地址,所以我这里的做法是用apache服务器路由到tomcat的jsp上
关于微信公众平台的消息接口的详细介绍,可以参看微信公众平台的官方文档,里面介绍了消息的xml的格式和消息的发送方式等。
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java字符与字符串操作技巧总结》、《Java数组操作技巧总结》、《Java数学运算技巧总结》、《Java编码操作技巧总结》和《Java数据结构与算法教程》
希望本文所述对大家java程序设计有所帮助。