`
knight_black_bob
  • 浏览: 853284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

weichat 微信开发之接受普通消息

阅读更多

 

 

 接入微信  使用 ngrok

 http://knight-black-bob.iteye.com/blog/2244830

 

接受普通消息

 源码下载 : http://download.csdn.net/download/knight_black_bob/9123671

WeichatServlet.java

package com.curiousby.cn;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;

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

import com.curiousby.cn.entity.TextMessage;
import com.curiousby.cn.util.CommonUtils;
import com.curiousby.cn.util.MessageUtil;
import com.curiousby.cn.util.WeichatCheckUtils;
 

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年9月20日 下午2:06:42 
 * des:
 */
public class WeichatServlet extends HttpServlet{

	 
	private static final long serialVersionUID = 1L;
	private String signature; //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
	private String timestamp; // 时间戳
	private String nonce; //随机数
	private String echostr; //随机字符串
	
	

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException { 
		signature = req.getParameter("signature");
		timestamp = req.getParameter("timestamp");
		nonce = req.getParameter("nonce");
		echostr = req.getParameter("echostr");
		System.out.println("signature timestamp  nonce  echostr  " + signature +" " + timestamp +" " + nonce  + " " + echostr ); 
		PrintWriter out = resp.getWriter();
        if (WeichatCheckUtils.checkSignature(signature, timestamp, nonce)) {
            out.print(echostr);
        }

	}
	 
	
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		PrintWriter out = resp.getWriter();
		try {
			Map<String,String> map = MessageUtil.xmlToString(req);
			System.out.println(CommonUtils.mapToString(map));
			  String toUserName   = map .get("ToUserName");
			  String fromUserName   = map .get("FromUserName");
			  String createTime  = map .get("CreateTime");
			  String msgType  = map .get("MsgType");
			  String content  = map .get("Content");
			  String msgId  = map .get("MsgId"); 
			
			  String message ="";
			 
			  if ("text".equals(msgType)) {
				  TextMessage text = new TextMessage();
				  text.setFromUserName(toUserName);
				  text.setToUserName(fromUserName);
				  text.setMsgType("text");
				  text.setCreateTime(new Date().getTime());
				  String recontent ="";
				  try{
				  int aint =  Integer.parseInt(content);
				  recontent=" 您好,我是包包大人.\r\n 您发送的内容是 :"+(aint+1);
				  }catch(Exception e){
					  recontent =" 您好,我是包包大人.\r\n 您发送的内容是 :"+content;
				  }
				  text.setContent(recontent);
				  message =  MessageUtil.textMessageToXml(text);
			  }
			   System.out.println(message);
			  out.print(message);
		} catch (Exception e) { 
			e.printStackTrace();
		}finally{
			out.close();
		}
		
		
	}
}

 

CommonUtils.java

package com.curiousby.cn.util;

import java.util.Map;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年9月20日 下午2:24:27 
 * des:
 */
public class CommonUtils {

	public static String arrayToString (String [] arr){
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < arr.length; i++) {
			sb.append(arr[i]);
		}
		return sb.toString();
	}
	
	public static String mapToString(Map<String,String> map){
		StringBuffer sb = new StringBuffer();
		sb.append("{");
		for (String key : map.keySet() ) {
			sb.append(key+":"+map.get(key)+",");
		}
		sb.substring(0, sb.length()-1);
		sb.append("}");
		return sb.toString();
	}
	
	
}

 

 MessageUtil.java

package com.curiousby.cn.util;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

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

import com.curiousby.cn.entity.TextMessage;
import com.thoughtworks.xstream.XStream;
 

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年9月20日 下午4:18:35 
 * des:
 */
public class MessageUtil {

	
	public  static Map <String,String> xmlToString(HttpServletRequest request) throws Exception{
		 Map <String,String>  map = new HashMap<String,String>();
		 SAXReader reader = new SAXReader();
		 InputStream is = request.getInputStream();
		 Document doc = reader.read(is);
		 Element root = doc.getRootElement();
		 List<Element> llist = root.elements();
		 for (Element e : llist) {
			map.put(e.getName(), e.getText());
		}
		 is.close();
		return map;
	}
	
	public static String textMessageToXml(TextMessage textMessage){
		
		XStream xStream = new XStream();
		xStream.alias("xml", textMessage.getClass());
		return xStream.toXML(textMessage);
	}
	
}

 

 

ShaUtils.java

package com.curiousby.cn.util;

import java.security.MessageDigest;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年9月20日 下午2:36:04 
 * des:
 */
public class ShaUtils {

	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
		'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
	
	
	public static String getSha1(String str){
		if (str == null || str.length() ==0) {
			return null;
		}
		
		try{
			
			MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
			messageDigest.update(str.getBytes("UTF-8"));
			
			byte[] md = messageDigest.digest(); 
			int j  = md.length;
			char [] buf  = new char[j*2];
			int k = 0;
			
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				buf[k++] =HEX_DIGITS[byte0 >>> 4 & 0xf ];
				buf[k++] =HEX_DIGITS[byte0  & 0xf ];
			}
			System.out.println(" before sha1 str :"+ str +"\r\n after sha1  string : "+new String(buf));
			return new String(buf);
		}catch(Exception e){
			return null;
		}
	}
}

 

 

WeichatCheckUtils.java

package com.curiousby.cn.util;

import java.util.Arrays;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年9月20日 下午2:14:46 
 * des:
 */
public class WeichatCheckUtils {

	
	private static final String TOKEN ="xxxxxx";
	
	public  static boolean checkSignature(String signature, String timestamp,String nonce){
		String[] str = { TOKEN, timestamp, nonce };
		 Arrays.sort(str); // 字典序排序
		String string = CommonUtils.arrayToString(str);
		String temp = ShaUtils.getSha1(string);
		 return temp.equals(signature);
	}
	
}

 

 

web.xml

<servlet>
  	<servlet-name>weichatServlet</servlet-name>
  	<servlet-class>com.curiousby.cn.WeichatServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>weichatServlet</servlet-name> 
  	<url-pattern>/weichat.do</url-pattern>
  </servlet-mapping>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

1
1
分享到:
评论

相关推荐

    微信 开发 接受普通消息

    微信 开发 接受 普通 消息 http://knight-black-bob.iteye.com/blog/2244830 http://knight-black-bob.iteye.com/blog/2244839

    微信开发的文档汇总.zip

    微信开发-接收普通消息.pdf 微信开发-接收事件推送和语音识别结果.pdf 微信开发-交通查询功能实现.pdf 微信开发-快递查询功能-编码实操 - 副本.pdf 微信开发-新浪云的创建.pdf 微信开发-用户分组管理.pdf 微信...

    java企业微信和钉钉向普通用户发送消息

    本教程将基于提供的"java企业微信和钉钉向普通用户发送消息"案例,深入讲解如何利用Java API与这两个主流的企业通讯平台进行集成,从而实现消息推送功能。 首先,我们来看`RemoteServiceUtil.java`,这是一个通用的...

    JAVA微信开发资料

    微信公众帐号开发教程第 2 篇-微信公众帐号的类型(普通和会议).. 3 微信公众帐号开发教程第 3 篇-开发模式启用及接口配置.. 7 微信公众帐号开发教程第 4 篇-消息及消息处理工具的封装. 17 微信公众帐号开发教程第 ...

    微信小程序开发环境搭建(超详细)

    微信小程序开发环境的搭建是很简单的 首先我们需要是登录微信公众平台 微信公众平台 点击右上角立即注册 注册账号类型选择小程序 进入注册界面后按提示完成账号信息 邮箱激活 信息登记 注册完成后界面如下,点击...

    微信小程序开发之普通链接二维码

    配置普通链接二维码规则 (此图片来源于网络,如有侵权,请联系删除! ) 生成二维码  访问https://cli.im/url,将https://test.com/linkcode?id=1_2生成二维码图片   小程序接收参数   if(option.q){ console.log...

    微信公众号开发--消息与事件处理

    当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者在微信公众号管理平台中配置的服务器地址URL上,本工程对消息与事件处理进行...

    微信开发学习总结(三)——消息管理(2)-接受普通消息和被动回复用户消息——项目源码

    微信开发学习总结(三)——消息管理(2)-接受普通消息和被动回复用户消息——项目源码; 博客:微信开发学习总结(三)——消息管理(2)-接受普通消息和被动回复用户消息; ...

    微信开发学习总结(三)——消息管理—接收普通消息—(1)文本消息——项目源码

    微信开发学习总结(三)——消息管理—接收普通消息—(1)文本消息——项目源码; 参考博客: https://blog.csdn.net/qq_29914837/article/details/82903594

    超实用的微信小程序开发的商城系统源码

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,尤其是微信用户。它的出现为企业和个人开发者提供了构建便捷、高效、互动的在线服务的工具。在这个"超实用的微信小程序开发的商城系统源码"中,我们可以深入...

    微信公共账号开发教程

    2. 微信公众帐号开发教程第2篇-微信公众帐号的类型(普通和会议) 3. 微信公众帐号开发教程第3篇-开发模式启用及接口配置 . 微信公众帐号开发教程第5篇-各种消息的接收与响应 6. 微信公众帐号开发教程第6篇-文本...

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

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

    C#微信开发之接收 / 返回文本消息

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息微信开发文档,对微信的这种消息处理机制有一定了解之后再着手开发(微信...

    微信公众平台开发【接收消息】接收普通消息源代码

    小易Smalle博文微信公众平台开发【接收消息】接收普通消息http://blog.csdn.net/oldinaction/article/details/48000583所用示例源代码

    微信系统开发设计方案

    微信发送形式可以多样化,包括普通文字消息(实时消息)和图文消息(单图文和多图文)。在试行期和正式运行期,设定不同的发布时间,如早上9:00、下午17:30和19:00,以吸引不同时间段的用户。同时,利用微信的高级...

    Springboot+mybatis微信小程序开发项目

    《Springboot+Mybatis微信小程序开发详解》 在当今互联网技术快速发展的时代,微信小程序以其轻量级、便捷性及广泛的用户基础,成为了许多开发者首选的移动端开发平台。结合Springboot和Mybatis两大热门框架,我们...

    微信公众平台开发的验证服务器和自动回复用户消息

    该例子仅简单的对微信服务器验证和用户信息的自动回复做了处理,为初学者在怎样开始微信公众平台的开发毫无头绪的时候提供一点儿帮助. 本例子使用了.net4.0框架,直接用VS2010打开网站,找到该文件夹,打开即可. 将...

    微信小程序开发合同协议书范本-最新通用.pdf

    2. **服务内容**:乙方将根据甲方的需求提供微信小程序的开发服务,可能包括普通版和高级版。具体的项目名称、主体数量、开发周期和费用应在合同中明确。付款方式可以是汇款、现金或支票,且通常在合同签订后支付以...

    微信公众平台开发发送客服消息

    微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数。此接口主要用于客服等有人工消息处理环节...

    cpp-超级微信电脑客户端支持多开防消息撤销语音消息备份开放WeChatSDK

    【标题】"cpp-超级微信电脑客户端支持多开防消息撤销语音消息备份开放WeChatSDK",这个标题揭示了一个基于C++开发的特殊版本微信电脑客户端,它具有多个特色功能,包括多账户同时登录、防止消息被撤销以及语音消息的...

Global site tag (gtag.js) - Google Analytics