java 微信公众号发送消息_JAVA微信公众号网页开发 —— 接收微信服务器发送的消息...

WeixinMessage.java

package com.test;

import java.io.Serializable;

/**

* This is an object that contains data related to the jg_weixinmessage table.

* Do not modify this class because it will be overwritten if the configuration file

* related to this class is modified.

*

* @hibernate.class

* table="jg_weixinmessage"

*/

public abstract class WeixinMessage implements Serializable {

private static final long serialVersionUID = 1L;

public static final int CONTENT_ONLY=2;

public static final int CONTENT_WITH_KEY=1;

public static final int CONTENT_WITH_IMG=0;

// constructors

public WeixinMessage() {

initialize();

}

/**

* Constructor for primary key

*/

public WeixinMessage(Integer id) {

this.setId(id);

initialize();

}

protected void initialize () {}

private int hashCode = Integer.MIN_VALUE;

// primary key

private Integer id;

// fields

private String number;

private String title;

private String path;

private String url;

private String content;

private Boolean welcome;

private Integer type;

// many to one

/**

* Return the unique identifier of this class

* @hibernate.id

* generator-class="identity"

* column="wm_id"

*/

public Integer getId () {

return id;

}

/**

* Set the unique identifier of this class

* @param id the new ID

*/

public void setId (Integer id) {

this.id = id;

this.hashCode = Integer.MIN_VALUE;

}

/**

* Return the value associated with the column: wm_number

*/

public String getNumber () {

return number;

}

/**

* Set the value related to the column: wm_number

* @param number the wm_number value

*/

public void setNumber (String number) {

this.number = number;

}

/**

* Return the value associated with the column: wm_title

*/

public String getTitle () {

return title;

}

/**

* Set the value related to the column: wm_title

* @param title the wm_title value

*/

public void setTitle (String title) {

this.title = title;

}

/**

* Return the value associated with the column: wm_path

*/

public String getPath () {

return path;

}

/**

* Set the value related to the column: wm_path

* @param path the wm_path value

*/

public void setPath (String path) {

this.path = path;

}

/**

* Return the value associated with the column: wm_url

*/

public String getUrl () {

return url;

}

/**

* Set the value related to the column: wm_url

* @param url the wm_url value

*/

public void setUrl (String url) {

this.url = url;

}

/**

* Return the value associated with the column: wm_content

*/

public String getContent () {

return content;

}

/**

* Set the value related to the column: wm_content

* @param content the wm_content value

*/

public void setContent (String content) {

this.content = content;

}

/**

* Return the value associated with the column: is_welcome

*/

public Boolean isWelcome () {

return welcome;

}

/**

* Set the value related to the column: is_welcome

* @param welcome the is_welcome value

*/

public void setWelcome (Boolean welcome) {

this.welcome = welcome;

}

public Integer getType() {

return type;

}

public void setType(Integer type) {

this.type = type;

}

/**

* Return the value associated with the column: site_id

*/

/**

* Set the value related to the column: site_id

*/

public boolean equals (Object obj) {

if (null == obj) return false;

if (!(obj instanceof WeixinMessage)) return false;

else {

WeixinMessage weixinMessage = (WeixinMessage) obj;

if (null == this.getId() || null == weixinMessage.getId()) return false;

else return (this.getId().equals(weixinMessage.getId()));

}

}

public int hashCode () {

if (Integer.MIN_VALUE == this.hashCode) {

if (null == this.getId()) return super.hashCode();

else {

String hashStr = this.getClass().getName() + ":" + this.getId().hashCode();

this.hashCode = hashStr.hashCode();

}

}

return this.hashCode;

}

public String toString () {

return super.toString();

}

}

MessageAct.java

package com.test;

import org.apache.commons.codec.digest.DigestUtils;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletInputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Arrays;

import java.util.Date;

import java.util.List;

@Controller

public class MessageAct {

/**

* 微信开发者验证URL 需要在微信公众平台填写该接收地址

*

* @param signature

* @param timestamp

* @param nonce

* @param echostr

* @param request

* @param response

* @param model

* @throws IOException

*/

@RequestMapping(value = "/sendMessage")

public void weixin(String signature, String timestamp, String nonce, String echostr,

HttpServletRequest request, HttpServletResponse response, ModelMap model) throws IOException {

//开发者验证填写TOKEN值

String token = ""; //微信后台配置的开发者token

Object[] tmpArr = new Object[]{token, timestamp, nonce};

Arrays.sort(tmpArr);

String str = tmpArr[0].toString() + tmpArr[1].toString() + tmpArr[2].toString();

String tmpStr = DigestUtils.shaHex(str);

if (tmpStr.equals(signature)) {

// 调用核心业务类接收消息、处理消息

processRequest(echostr, request, response);

} else {

System.out.println("fail");

}

}

private String processRequest(String echostr, HttpServletRequest request, HttpServletResponse response) throws IOException {

request.setCharacterEncoding("UTF-8");

String postStr = readStreamParameter(request.getInputStream());

Document document = null;

try {

if (postStr != null && !postStr.trim().equals("")) {

document = DocumentHelper.parseText(postStr);

}

} catch (Exception e) {

e.printStackTrace();

}

if (null == document) {

response.getWriter().write(echostr);

return null;

}

Element root = document.getRootElement();

String fromUsername = root.elementText("FromUserName"); //取得发送者

String toUsername = root.elementText("ToUserName"); //取得接收者

String userMsgType = root.elementText("MsgType");

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

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

// 默认返回的文本消息内容

String respContent = "no body";

String welcome = "默认回复语";

if (userMsgType.equals("event")) {

// 事件类型

String eventType = root.elementText("Event");

// 订阅

if (eventType.equals("subscribe")) {

respContent = welcome;

respContent = text(respContent, fromUsername, toUsername, time);

send(respContent, response);

//关注判断是否用户存在

return null;

}

// 取消订阅

else if (eventType.equals("unsubscribe")) {

// TODO 取消订阅后用户再收不到公众号发送的消息,因此不须要回复消息

//取消订阅后 修改用户状态

return null;

}else if (eventType.equals("LOCATION")) {

//用户的位置坐标

String latitude = root.elementText("Latitude");

String longitude = root.elementText("Longitude");

}

// 自定义菜单点击事件

// 事件KEY值,与创建自定义菜单时指定的KEY值对应

String eventKey = root.elementText("EventKey");

//返回自定义回复的定义

if (!eventType.equals("LOCATION")) {

autoReply(eventKey, fromUsername, toUsername, time, request, response);

}

return null;

}

//回复内容

if (keyword != null) {

keyword = keyword.trim();

}

if (keyword != null && userMsgType.equals("text")) {

autoReply(keyword, fromUsername, toUsername, time, request, response);

}

return null;

}

private void autoReply(String keyword, String fromUsername, String toUsername, String time, HttpServletRequest request, HttpServletResponse response) throws IOException {

WeixinMessage entity = weixinMessageMng.findByNumber(keyword);

if (entity != null) {

String text = contentWithImgUseMessage(entity, fromUsername, toUsername, time, request);

send(text, response);

} else {

entity = weixinMessageMng.getWelcome();

if (entity != null) {

StringBuffer buffer = new StringBuffer();

String textTpl = "";

//内容+关键字 标题 提示

if (entity.getType().equals(WeixinMessage.CONTENT_WITH_KEY)) {

buffer.append(entity.getContent()).append("\n");

List lists = weixinMessageMng.getList(site.getId());

for (int i = 0; i < lists.size(); i++) {

buffer.append(" 【" + lists.get(i).getNumber() + "】" + lists.get(i).getTitle()).append("\n");

}

textTpl = text(buffer.toString(), fromUsername, toUsername, time);

} else if (entity.getType().equals(WeixinMessage.CONTENT_ONLY)) {

//仅限内容

buffer.append(entity.getContent()).append("\n");

textTpl = text(buffer.toString(), fromUsername, toUsername, time);

} else if (entity.getType().equals(WeixinMessage.CONTENT_WITH_IMG)) {

//图文类型(图片 标题 文字 链接组成)

textTpl = contentWithImgUseMessage(entity, fromUsername, toUsername, time, request);

}

send(textTpl, response);

}

}

}

private String contentWithImgUseMessage(WeixinMessage entity, String fromUsername, String toUsername, String time, HttpServletRequest request) {

String textTpls = text(fromUsername, toUsername, time, entity.getTitle(), entity.getContent(), "(图片地址)", entity.getUrl());

return textTpls;

}

private void send(String textTpl, HttpServletResponse response) throws IOException {

String type = "text/xml;charset=UTF-8";

response.setContentType(type);

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

response.getWriter().write(textTpl);

}

private String text(String fromUsername, String toUsername, String time, String title, String desc, String img, String url) {

String textTpls = "" +

"" +

"" +

"" + time + "" +

"" +

"1" +

"" +

"" +

"

" +

"" +

"" +

"" +

"" +

"" +

"";

return textTpls;

}

private String text(String str, String fromUsername, String toUsername, String time) {

String textTpls = "" +

"" +

"" +

"" + time + "" +

"" +

"" +

"";

return textTpls;

}

//从输入流读取post参数

private String readStreamParameter(ServletInputStream in) {

StringBuilder buffer = new StringBuilder();

BufferedReader reader = null;

try {

reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值