本文实例讲述了java版微信公众平台消息接口应用方法。分享给大家供大家参考,具体如下:

微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对Java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口。

首先先把整个接口代码贴出来做下比较,然后我们再分析代码:

PHP:

/**

* wechat php test

*/

//define your token

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();

$wechatObj->valid();

class wechatCallbackapiTest

{

public function valid()

{

$echoStr = $_GET["echostr"];

//valid signature , option

if($this->checkSignature()){

echo $echoStr;

exit;

}

}

public function responseMsg()

{

//get post data, May be due to the different environments

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//extract post data

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 = "Welcome to wechat world!";

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

echo $resultStr;

}else{

echo "Input something...";

}

}else {

echo "";

exit;

}

}

private function checkSignature()

{

$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 ){

return true;

}else{

return false;

}

}

}

?>

JAVA:

//WeiXinHandler为内部类不能使用非final类型的对象

final String TOKEN="weixin";

final HttpServletRequest final_request=request;

final HttpServletResponse final_response=response;

%>

class WeiXinHandler{

public void valid(){

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

if(null==echostr||echostr.isEmpty()){

responseMsg();

}else{

if(this.checkSignature()){

this.print(echostr);

}else{

this.print("error");

}

}

}

//自动回复内容

public void responseMsg(){

String postStr=null;

try{

postStr=this.readStreamParameter(final_request.getInputStream());

}catch(Exception e){

e.printStackTrace();

}

//System.out.println(postStr);

if (null!=postStr&&!postStr.isEmpty()){

Document document=null;

try{

document = DocumentHelper.parseText(postStr);

}catch(Exception e){

e.printStackTrace();

}

if(null==document){

this.print("");

return;

}

Element root=document.getRootElement();

String fromUsername = root.elementText("FromUserName");

String toUsername = root.elementText("ToUserName");

String keyword = root.elementTextTrim("Content");

String time = new Date().getTime()+"";

String textTpl = ""+

""+

""+

"%3$s"+

""+

""+

"0"+

"";

if(null!=keyword&&!keyword.equals(""))

{

String msgType = "text";

String contentStr = "Welcome to wechat world!";

String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);

this.print(resultStr);

}else{

this.print("Input something...");

}

}else {

this.print("");

}

}

//微信接口验证

public boolean checkSignature(){

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

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

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

String token=TOKEN;

String[] tmpArr={token,timestamp,nonce};

Arrays.sort(tmpArr);

String tmpStr=this.ArrayToString(tmpArr);

tmpStr=this.SHA1Encode(tmpStr);

if(tmpStr.equalsIgnoreCase(signature)){

return true;

}else{

return false;

}

}

//向请求端发送返回数据

public void print(String content){

try{

final_response.getWriter().print(content);

final_response.getWriter().flush();

final_response.getWriter().close();

}catch(Exception e){

}

}

//数组转字符串

public String ArrayToString(String [] arr){

StringBuffer bf = new StringBuffer();

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

bf.append(arr[i]);

}

return bf.toString();

}

//sha1加密

public String SHA1Encode(String sourceString) {

String resultString = null;

try {

resultString = new String(sourceString);

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

resultString = byte2hexString(md.digest(resultString.getBytes()));

} catch (Exception ex) {

}

return resultString;

}

public final String byte2hexString(byte[] bytes) {

StringBuffer buf = new StringBuffer(bytes.length * 2);

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

if (((int) bytes[i] & 0xff) < 0x10) {

buf.append("0");

}

buf.append(Long.toString((int) bytes[i] & 0xff, 16));

}

return buf.toString().toUpperCase();

}

//从输入流读取post参数

public String readStreamParameter(ServletInputStream in){

StringBuilder buffer = new StringBuilder();

BufferedReader reader=null;

try{

reader = new BufferedReader(new InputStreamReader(in));

String line=null;

while((line = reader.readLine())!=null){

buffer.append(line);

}

}catch(Exception e){

e.printStackTrace();

}finally{

if(null!=reader){

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return buffer.toString();

}

}

%>

WeiXinHandler handler=new WeiXinHandler();

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.jb51.net/article/117653.htm)

所以这里使用获取原始数据流的方式来解析post的xml数据

String postStr=null;

try{

postStr=this.readStreamParameter(final_request.getInputStream());

}catch(Exception e){

e.printStackTrace();

}

//从输入流读取post参数

public String readStreamParameter(ServletInputStream in){

StringBuilder buffer = new StringBuilder();

BufferedReader reader=null;

try{

reader = new BufferedReader(new InputStreamReader(in));

String line=null;

while((line = reader.readLine())!=null){

buffer.append(line);

}

}catch(Exception e){

e.printStackTrace();

}finally{

if(null!=reader){

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return buffer.toString();

}

第二个,是response消息返回给微信平台,我尝试的用最一般的out.print去做,但是发现没反应,观察PHP的代码写法

echo "";

exit;

猜想可能需要有个刷新的操作才能把消息response回去,于是找了下response内的一些函数做出以下尝试

//向请求端发送返回数据

public void print(String content){

try{

final_response.getWriter().print(content);

final_response.getWriter().flush();

final_response.getWriter().close();

}catch(Exception e){

}

}

发现以上做法是可以在微信发送端得到消息的;

第三个,接口描述上说目前只支持80端口的服务端地址,所以我这里的做法是用apache服务器路由到tomcat的jsp上

关于微信公众平台的消息接口的详细介绍,可以参看微信公众平台的官方文档,里面介绍了消息的xml的格式和消息的发送方式等。

希望本文所述对大家java程序设计有所帮助。

java在微信的应用_java版微信公众平台消息接口应用示例相关推荐

  1. php对接微信提醒,PHP对接微信公众平台消息接口开发流程教程

    PHP对接微信公众平台消息接口开发流程教程 发布于 2015-02-15 08:54:13 | 157 次阅读 | 评论: 1 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  2. php网站怎么对接微信群,PHP对接微信公众平台消息接口开发流程教程

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使 ...

  3. php微信公众号怎么开发_PHP对接微信公众平台消息接口开发流程详解及实例

    这篇文章主要介绍了PHP对接微信公众平台消息接口开发流程,如何使用PHP版接口操作公众平台消息,需要的朋友可以参考下 一.写好接口程序 在你的服务器上上传好一个接口程序文件内容如下: 代码如下:< ...

  4. 微信公众平台消息接口星标功能

    [微信公众平台星标功能接口被撤销]微信公众平台消息接口中的星标功能,被悄悄的去掉了. 原因应该是有的账号在程序中大量使用星标功能,造成微信服务器存储记录过于宠大. 现在要继续使用星标功能,只能在后台手 ...

  5. 微信公众平台消息接口开发(13)多语种互译

    微信公众平台消息接口 微信公众平台API 微信开发模式 多语种翻译 多语言互译 Microsoft Translator 方倍工作室 Paraphrase API 10 out of 11 rated ...

  6. 微信公众平台消息接口API指南

    下述文档已过期,更加完整及详细的请访问  http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 简介 微信公众平台消息接口为开发者提供了一种新的消 ...

  7. 微信公众平台消息接口开发(2)-封装weixin.class.php

    微信公众平台消息接口开发(2)-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...

  8. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  9. 微信公众平台消息接口开发(1)

    原文链接 现在微信很热,微信公众平台的应用也很热,其实微信公众平台消息接口开发并不难,只要有接口调用就OK了. 要开发微信公众平台上的应用,得准备什么呢? 至少要有一个公众账号.服务器.域名这三样东西 ...

  10. 微信公众平台消息接口使用指南

    >>微信公众平台接口申请地址 最近微信开发这个东西炒的很猛,于是dApps考虑提供一些资源. 一 .微信公众平台消息接口简介 公众平台消息接口为开发者提供了一种新的消息处理方式. 二 . ...

最新文章

  1. 来自程序员的福利!用Python做一款翻译软件
  2. Resteasy集成Spring
  3. orm 通用方法——RunProc调用存储过程
  4. 软件项目开发流程及配置人员
  5. Active report-在Web 上使用 active report
  6. 微调也重要:探究参数初始化、训练顺序和提前终止对结果的影响
  7. 树莓派设置NTP同步
  8. 简单实现顶部固定,中部自适应布局
  9. Linux---文件操作
  10. ArcGIS Pro 简明教程(4)工具和模型构建器
  11. mysql 数字处理方法_mysql中保留字段中的数字的处理方法。
  12. php7+结合比较运算符,php7运算符
  13. 最常用的五种PDF阅读器,你都用过了吗!
  14. 一阶低通滤波器方程_一阶有源低通滤波电路与最经典一阶低通滤波器电路图
  15. html中增加一个播放器,从零实现一个自定义 HTML5 播放器
  16. 霹雳灯双灯c语言程序,单片机霹雳游侠灯源程序
  17. android 数据库查看工具 mac,关于android studio:在MacOS上查看Realm数据库并将adb定义为环境变量...
  18. WPS怎么外链网页上的实时数据_什么是外链,如何获取更多的外链?
  19. 46、linux开发笔记(主线更新)
  20. 一文教你股票买卖问题实用而装逼的解法

热门文章

  1. linux/windows eclipse远程调试 c/c++程序
  2. 虚拟化应用(三)Hyper-V 2.0 初探
  3. 如何安全地终止线程interrupt()、isInterrupted()、interrupted()的区别与使用
  4. java运行时数据区(pc寄存器、虚拟机栈(栈帧)、本地方法栈、java堆、方法区、运行时常量池、直接内存)
  5. SpringBoot整合easyexcel进行excel报表导入导出
  6. 一个故事告诉你什么才是好的程序员
  7. 用户只有一部手机,怎么保护私钥—— mixin如何实现资产安全
  8. vmware虚拟机安装jdk
  9. 关于rnn神经网络的loss函数的一些思考
  10. 深入理解RunLoop(四)