java微信公众平台开发接口_微信公众平台API的Java通讯实现
微信公众平台 相信大家也不陌生,官方网站提供了一个简单的php程序Demo
因为微信平台采用HTTP方式承载微信的协议,而且不是双向通讯,也就是说只能由微信服务器主动请求我们的服务器。其实当你使用我开发的weixinapi包,你不用关心那么多的,呵呵。
看了api文档很久一段事件,今天突然恍然大雾,然后weixinapi的java版出来了
此api结合我之前从事通讯协议方面经验,采用Session抽象类方式+消息对象模式开发
【实现功能】:
接收微信服务器的文本消息、图片消息、事件消息、链接消息、地理位置消息等功能,
调用callback()响应回复文本消息、音乐消息、图文消息 。
微信菜单接口实现:创建、删除、查询
使用条件:有自己的服务器,公网IP+80端口,依赖于alibaba fastjson.jar。
欢迎大家关注我的微信公众号!!!(暂时没做功能,未来会有功能的,先关注到嘛,最新消息第一时间得到)
微信公众平台:http://mp.weixin.qq.com
===============================================
根据@tds的建议,我将微信API增加了HandleMessageListener监听器和HandleMessageAdapter适配器
微信服务器发送http请求过来后,会调用注册的所有监听器,的对应on方法(已然有模仿这种模式的三方微信SDK了,可见此模式的优越性,呵呵)。
【具体代码看Demo】
这样做的好处,你可以分散你的消息回复处理,放在不同的监听器中,方便代码管理与维护。
2014-08-30: 非常感谢开源中国的朋友关注我的公众号,目前已经有211位了。打破记录了,呵呵。还在构思服务内容,谢谢支持哈。
【更新】
----------------------完成官方2014-08-30更新的消息接口------------------------
[2014-08-30] 添加了微信推出已久的菜单创建、删除、查询API
[2013-11-11] 更新了音乐消息的回复
[2013-11-11] 更新了视频消息的收发。
[2013-11-11] 更新了语音消息和语音识别消息兼容问题。
[2013-11-11] 更新了文本消息的属性,去除了funcFlag属性
[2013-11-11] 更新了图片消息的接收解析和被动发送解析,去除了funcFlag属性。
[2013-11-08] 添加了10月29日微信官方API中的视频消息
[2013-11-08] 添加了10月29日微信官方API中的语音识别消息
[2013-11-08] 更新了微信API最新接收事件推送{已关注事件推送、上报地理位置事件推送}接口
【微信模拟器】
链接:http://pan.baidu.com/s/1eQlCgyI 密码:2kp4
[加密的原因是因为百度的政策]
【接口源码开源了!!!】
1.[代码]配置菜单相关参数
package org.marker.config;
/**
* 配置文件
* @author marker
* @date 2014年8月30日
* @version 1.0
*/
public interface Config {
// 赋权类型
String grant_type = "client_credential";
// 修改为开发者申请的appid
String APPID = "";
// 修改为开发者申请的secret密钥
String SECRET = "";
}
2.[代码]菜单测试代码
package org.marker.weixin.test;
import org.marker.utils.MenuUtil;
import org.marker.weixin.exception.WeixinException;
import org.marker.weixin.msg.Data4Button;
import org.marker.weixin.msg.Data4Menu;
import com.alibaba.fastjson.JSON;
/**
* 微信菜单测试代码
* @author marker
* @date 2014年8月30日
* @version 1.0
*/
public class ButtonTest {
public static void main(String[] args) {
// 创建按钮
Data4Button btn = new Data4Button();
// 创建一级菜单
Data4Menu menu1 = new Data4Menu("view","关于我们","http://cms.yl-blog.com/about.html");
Data4Menu menu2 = new Data4Menu("click","guanyuds","Btn_a");
// 二级菜单
Data4Menu sm_1 = new Data4Menu("click", "赞助我们", "btn_zanzu");
Data4Menu menu3 = new Data4Menu("click","guanyuds","Btn_5");
Data4Menu sn_1 = new Data4Menu("click","guanyuds","Btn_2");
try {
// 菜单之间的关系
btn.addMenu(menu1);
menu2.addSubMenu(sm_1);
btn.addMenu(menu2);
menu3.addSubMenu(sn_1);
btn.addMenu(menu3);
// Object -> json
String menustr = JSON.toJSONString(btn);
// weixinapi更具微信规范,添加了异常机制。
/*
* 比如:菜单操作的异常,一级菜单最多三个,超出就抛出异常
*
* */
MenuUtil.create(menustr);
} catch (WeixinException e) {
e.printStackTrace();
}
}
}
3.[文件] weixin20140830.zip ~ 410KB 下载(1498)
4.[文件] 微信API更新20131111.rar ~ 164KB 下载(3428)
5.[图片] 微信服务端消息模拟器.png
6.[代码]Servlet调用weixinAPI源码
package org.marker.mushroom.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.marker.weixin.DefaultSession;
import org.marker.weixin.HandleMessageAdapter;
import org.marker.weixin.MySecurity;
import org.marker.weixin.msg.Data4Item;
import org.marker.weixin.msg.Msg4Image;
import org.marker.weixin.msg.Msg4ImageText;
import org.marker.weixin.msg.Msg4Text;
/**
* 处理微信服务器请求的Servlet URL地址:http://xxx/weixin/dealwith.do
*
* 注意:官方文档限制使用80端口哦!
*
* @author marker
* @blog www.yl-blog.com
* @weibo http://t.qq.com/wuweiit
*/
public class WeixinServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public WeixinServlet() { }
//TOKEN 是你在微信平台开发模式中设置的哦
public static final String TOKEN = "xxx";
/**
* 处理微信服务器验证
*
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
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");// 随机字符串
// 重写totring方法,得到三个参数的拼接字符串
List list = new ArrayList(3) {
private static final long serialVersionUID = 2621444383666420433L;
public String toString() {
return this.get(0) + this.get(1) + this.get(2);
}
};
list.add(TOKEN);
list.add(timestamp);
list.add(nonce);
Collections.sort(list);// 排序
String tmpStr = new MySecurity().encode(list.toString(),
MySecurity.SHA_1);// SHA-1加密
Writer out = response.getWriter();
if (signature.equals(tmpStr)) {
out.write(echostr);// 请求验证成功,返回随机码
} else {
out.write("");
}
out.flush();
out.close();
}
/**
* 处理微信服务器发过来的各种消息,包括:文本、图片、地理位置、音乐等等
*
*
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
InputStream is = request.getInputStream();
OutputStream os = response.getOutputStream();
final DefaultSession session = DefaultSession.newInstance();
session.addOnHandleMessageListener(new HandleMessageAdapter(){
@Override
public void onTextMsg(Msg4Text msg) {
System.out.println("收到微信消息:"+msg.getContent());
if("我是唐小怪".equals(msg.getContent())){
Msg4Text rmsg =new Msg4Text();
rmsg.setFromUserName(msg.getToUserName());
rmsg.setToUserName(msg.getFromUserName());
rmsg.setFuncFlag("0");
rmsg.setContent("你是小乖乖,哈哈!");
session.callback(rmsg);
return;
}
//回复一条消息
Data4Item d1 = new Data4Item("蘑菇建站系统", "测试描述", "http://cms.yl-blog.com/themes/blue/images/logo.png", "cms.yl-blog.com");
Data4Item d2 = new Data4Item("雨林博客", "测试描述", "http://www.yl-blog.com/template/ylblog/images/logo.png", "www.yl-blog.com");
Msg4ImageText mit = new Msg4ImageText();
mit.setFromUserName(msg.getToUserName());
mit.setToUserName(msg.getFromUserName());
mit.setCreateTime(msg.getCreateTime());
mit.addItem(d1);
mit.addItem(d2);
mit.setFuncFlag("0");
session.callback(mit);
}
});
//必须调用这两个方法
//如果不调用close方法,将会出现响应数据串到其它Servlet中。
session.process(is, os);//处理微信消息
session.close();//关闭Session
}
}
7.[图片] qrcode_for_gh_b389d01873ac_430.jpg
java微信公众平台开发接口_微信公众平台API的Java通讯实现相关推荐
- java微信公众号开发教程_微信公众平台开发教程(java版本含代码) 中文PDF版 3.13MB...
本文档将对即将推出的微信公众帐号开发系列连载教程做简单的说明. 教程主要是面向有一定 Java 编程基础的朋友, 目录: 微信公众帐号开发教程第 1 篇-引言 2 微信公众帐号开发教程第 2 篇-微 ...
- 微信小程序 python接口_微信小程序-封装请求基准路径、接口API 和使用
1.在文件夹utils下新建 request.js文件 2.封装请求代码 // 基准路径 //路径仅为举例 const baseurl ='https://127.0.0.1' //get请求 fun ...
- Java微信公众号开发(一:接入平台,验证token)
Java微信公众号开发(一:接入平台,验证token) 开发环境: 环境:JDK1.8 框架:springBoot 首先,在我们接入微信公众平台之前,我们需要注册微信公众号的开发者账号,获取开发者ID ...
- 微信公众账号开发接口实现 - java servlet
原文:微信公众账号开发接口实现 - java servlet 源代码下载地址:http://www.zuidaima.com/share/1550463697898496.htm 微信公众平台开发接口 ...
- 微信公众开放平台开发08---纯java 实现微信开发:编写自定义菜单
微信公众开放平台开发08---纯java 实现微信开发:编写自定义菜单 微信公众开放平台开发08---纯java 实现微信开发:编写自定义菜单 技术qq交流群:JavaDream:251572072 ...
- 微信公众平台开发(93) 关闭微信浏览器
原文地址为: 微信公众平台开发(93) 关闭微信浏览器 在这篇微信公众平台开发教程中,我们将介绍如何使用微信JS接口关闭微信内置浏览器返回到微信聊天窗口界面. 微信的JS接口目前已公布了三种:右上角按 ...
- 微信公众号开发接口语音下载解决方案
需求:利用微信公众号开发接口下载语音,展示并可以收听语音 1.利用微信公众平台开发接口下载语音文件至本机 /*** 下载多媒体文件* @param string $mediaId* @return s ...
- 急急急求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户可以保存表情?
求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户就可以保存表情到手机? 需求描述 1.用户在公众号对话框发送微信表情(GIF) 2.公 ...
- Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API
目录 Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API 一.概述及API 1.JS-SDK是对之前的 WeixinJSBridge 的一个包装 2.JS-SD ...
最新文章
- opencv ocr字符识别_OCR深度实践系列:图像预处理
- 成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred
- Jquery中表单序列化提交到后台是怎样进行URL解码查看参数
- IntelliJ IDEA启动Tomcat控制台乱码问题解决
- 质量故事(4)---割草的男孩
- 【深度学习】空洞卷积(Atrous Convolution)
- 使用Arduino驱动 ADS1115 ADC采样芯片
- 用scrapy爬虫无数据
- 应用程序错误电脑黑屏_werfault应用程序错误黑屏|Win7解决werfault.exe应用程序错误方法...
- dpdk介绍系列之ring
- 如何让自己变得更加成熟
- Scrum 项目 3.0
- python flasgger bearer验证
- 线上活动| 阿里云、亚马逊云与MongoDB的技术专家带你来涨知识
- MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用
- 使用循环打印三角型以及九九乘法表
- 简历中满分的自我评价是啥样?
- matlab周期图法,周期图谱估计及其改进方法的Matlab仿真
- flash的不同分类
- 为什么协同OA办公系统成为企业的必备平台?