`
yvonxiao
  • 浏览: 77912 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

微信公众平台api的Java调用

阅读更多

  最近要给公司写个微信的公众平台自动回复的程序,就研究了微信的公众平台的api,发现目前api提供的功能还比较少,仅仅只能被动式应答,而且只能收取文字,图片和地理信息类的消息,但是从这个web版的管理平台可以在线管理消息来看,其实是可以用Java模拟浏览器的行为从而实现高级的功能,比如获取声音,主动群发消息,但是由于这些功能不是api中提供的,存在以后接口发生变化的可能,所以可以用来做个小工具来使用这些高级功能但不适合在产品中使用

  官方给的调用api的例子只有php的,我这里用java实现了个简单的文本回复的,DOM解析部分因为刚好有dom4j的jar包就用了,换成jdk自带的w3c的dom解析也行,反正消息xml内容很少

 

 

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class WeixinpublicServlet extends HttpServlet {

	private static final long serialVersionUID = -4267408236898837036L;

	private static final String TOKEN = "weixin";
	
	private static final String RESPONSE_TXT = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		
		PrintWriter out = response.getWriter();
		if(checkSignature(signature,timestamp,nonce)){
			out.print(request.getParameter("echostr"));
		}
		out.close();
		out = null;
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();

		Document doc = null;
		SAXReader reader = new SAXReader();
		InputStream in = request.getInputStream();
		try {
			doc = reader.read(in);
            Element root = doc.getRootElement();
            String toUserName = root.element("ToUserName").getTextTrim();
            String fromUserName = root.element("FromUserName").getTextTrim();
            String content = root.element("Content").getTextTrim();
			// root.element("MsgType")可以获取消息类型
			// 这里只回复简单文本信息
            out.printf(RESPONSE_TXT, fromUserName,toUserName,System.currentTimeMillis(),"text","您发送的内容是:"+content);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		in.close();
		in = null;
		out.close();
		out = null;
	}
	
	private static boolean checkSignature(String signature,String timestamp,String nonce){
		String[] arr = new String[]{TOKEN,timestamp,nonce};
		Arrays.sort(arr);
		StringBuilder content = new StringBuilder();
		for(int i=0;i<arr.length;i++){
			content.append(arr[i]);
		}
		MessageDigest md = null;
		String tmpStr = null;
		
        try {
			md = MessageDigest.getInstance("SHA-1");
	        byte[] digest = md.digest(content.toString().getBytes());
	        tmpStr = byteToStr(digest);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
        
		content = null;
		return tmpStr!=null?tmpStr.equals(signature.toUpperCase()):false;
	}
	
    // 将字节转换为十六进制字符串
    private static String byteToHexStr(byte ib) {
        char[] Digit = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
                'D', 'E', 'F'
            };
        char[] ob = new char[2];
        ob[0] = Digit[(ib >>> 4) & 0X0F];
        ob[1] = Digit[ib & 0X0F];

        String s = new String(ob);
        return s;
    }
	
    // 将字节数组转换为十六进制字符串
    private static String byteToStr(byte[] bytearray) {
        String strDigest = "";
        for (int i = 0; i < bytearray.length; i++) {
            strDigest += byteToHexStr(bytearray[i]);
        }
        return strDigest;
    }

}
分享到:
评论
6 楼 kakarottoz 2013-07-01  
用了楼主代码果然成功了! 谢谢分享
5 楼 kakarottoz 2013-06-26  
谢谢分享,这块刚好不会  学习了:lol:
4 楼 haiyupeter 2013-05-09  
代码质量太差了,居然还有NullPointerException
3 楼 yvonxiao 2013-03-04  
wzwahl36 写道
yvonxiao 写道
wzwahl36 写道

没看过,这个java写的东西都一样,自己参考下php的代码就可以了,没必要抄别人的

我是来贴链接的,没有别的意思~

2 楼 wzwahl36 2013-02-27  
yvonxiao 写道
wzwahl36 写道

没看过,这个java写的东西都一样,自己参考下php的代码就可以了,没必要抄别人的

我是来贴链接的,没有别的意思~
1 楼 yvonxiao 2013-02-20  
wzwahl36 写道

没看过,这个java写的东西都一样,自己参考下php的代码就可以了,没必要抄别人的

相关推荐

    微信公共平台开发者API

    微信公众平台开发者需要调用的接口,主要有消息接口部分

    微信对接API-java版

    采用springboot框架,maven,package为jar,内部封装了公众平台的常用api,包括授权、签名、分享、消息推送等。同时加了缓存,ticket的定时刷新(每90分钟),内附API使用教程,以及war包、jar包的引用方法。 适用...

    微信公众平台 客服接口发消息的实现代码(Java接口开发)

    微信公众平台技术文档:客服消息 一、接口说明 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过...

    微信公众平台java开发完整项目示例程序源码---图灵机器人 微信智能回复

    本例中列出了微信公众平台开发的所有流程的代码,包括接收xml数据、解析xml数据、调用图灵机器人api接口获取智能回复内容、封装结果xml数据等,简单明了,不明之处可查看个人博客中的讲解。

    微信公众平台接口开发java版sdk

    模板消息,带参数二维码接口的调用,免去复杂的学习过程简单粗暴,对于刚上手微信api接口开发的,可以很方面的上手开发,做到真正免去学习研究api的复杂流程,即用即会,调用代码简单易懂,带中文文档以及中文注释,...

    微信公众平台服务器

    #快速搭建微信公众平台服务器 简单封装了所有与微信服务器交互的消息:文本消息、图片消息、图文消息等等 提供了基于`springmvc`以及基于`servlet`框架的控制器,集成了微信服务器绑定、监听所有类型消息的方法 使用...

    Java调用微信支付接口

    在Java开发中,微信支付接口的调用是一个常见的任务,特别是在电商或者服务类应用程序中。SSM框架(Spring、SpringMVC和MyBatis)是Java Web开发中的主流选择,它提供了一个完整的后端解决方案。下面我们将深入探讨...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、CSDN等社区,CSDN博客专家,在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此...

    java 微信扫描二维码支付demo

    微信提供了公众平台支付API,开发者可以调用这些接口来实现支付功能。在Java中,我们需要使用微信官方提供的SDK,如`wxpay-sdk-java`,来与微信服务器进行交互。 2. **生成二维码** - **QRCodeEncoder**: 生成...

    EggJS插件之微信公众平台基本服务源码.zip

    EggJS插件之微信公众平台基本服务源码.zip 微信小程序 小程序登录 小程序授权 小程序支付 推送模板消息 检测是否含有敏感词 生成二维码/小程序码 接入在线客服消息 微信服务号 网页授权 发送模板消息 获取...

    基于Flurl.Http的微信HTTP API SDK包含公众平台、开放平台、商户平台、企业微信、广告平台、对话开放平台等模块

    基于 Flurl.Http 的微信 HTTP API SDK,目前已包含公众平台、开放平台、商户平台、企业微信、广告平台、对话开放平台等模块。基于 Flurl.Http,可与 IHttpClientFactory 集成。支持 .NET Framework 4.6.1+、.NET ...

    java开发微信公众号完整示例

    微信公众平台开发的所有流程的代码,包括接收xml数据、解析xml数据、调用图灵机器人api接口获取智能回复内容、封装结果xml数据等

    项目源码-SpringBoot整合微信模板消息实现每日给女友发送早安问候语和天气预报.zip

    1、微信公众平台申请账号及微信开放接口的调用。 2、百度地图天气API接口的调用。 3、天行数据API接口的调用。 运行环境 jdk8+tomcat9+IntelliJ IDEA+maven 项目技术(必填) springboot+微信api+百度地图api+...

    毕业设计---基于python的微信公众平台机器人的设计与实现.zip

    毕业设计---基于python的微信公众平台机器人的设计与实现.zip 用到了几个技术 NGINX做负载均衡,反向代理 nginx.conf是nginx配置文件,如何配置请参考网上教程 使用mysql数据库 数据库连接在config.py中配置,配置...

    微信群机器人源码,微信群机器人源码 最新,Java源码.zip

    这些功能的实现依赖于微信提供的API接口,通常包括微信公共平台的API或者微信企业号API。下面将详细介绍关于微信群机器人源码的相关知识点。 1. **微信API接口**:微信为开发者提供了丰富的API接口,允许创建自定义...

    JAVA版微信连wifi

    【JAVA版微信连WiFi】项目...对于初学者来说,这是一个很好的实践机会,可以提升Java编程能力、API调用技巧以及对微信开放平台的理解。而对于有经验的开发者,这个项目则可以作为拓宽技能范围、学习新领域的一个挑战。

    微信聊天机器人.rar

    通过java后台调用微信公众平台api以及一些wsdl文件实现。主要功能有:简单的日常对话,天气查询,翻译,输入查看课表,校历图片查看(需要自己在微信公众平台上传素材) 如何使用:创建微信公众平台账号;申请微信...

    APP微信支付Java服务端构建完整步骤

    需要注意的是,这里的appkey并非公众平台的密钥,而是指商户号对应的API密钥。具体操作如下: 1. **登录商户后台**:使用提供的账号密码登录微信支付商户平台。 2. **进入账户设置**:找到“账户设置”中的“安全...

    微信服务号java版开发教程

    微信服务号是一个为企业和组织提供更强大的业务服务与用户管理能力的公众平台,它允许开发者通过API接口实现各种功能,例如自定义菜单、消息推送、用户管理等。本教程将深入探讨如何利用Java实现这些功能。 首先,...

    微信公众号 提示:Unauthorized API function 问题解决方法

    主要介绍了微信公众号 提示:Unauthorized API function 问题解决方法的相关资料,这里提供了出现提示的解决方法,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics