微信开放平台API对接

研究了一下微信公众账号的开放平台的APi

/**
 * 
 * @Description: 微信消息处理以及用户分组 
 * @author zhangjun
 * @date 2014-1-7 上午10:51:51
 */
public class WeiXinMessageAction extends BaseAction{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private IFeWeiXinMessageService weiXinExternalService;
	
	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></xml>";
	
	private String wxNo;
	
	public String responseMessgaeInfo(){
		Boolean isGet = request.getMethod().equalsIgnoreCase("GET");
		if(isGet){
			validateSignature();
		}else{
			saveWxMessage();
		}
		return null;
	}

	/**
	 * 
	 * @Description: 接收post保存接受的消息 只保存MsgType类型为text信息
	 * @param     
	 * @return void 
	 * @throws
	 */
	private void saveWxMessage(){
		InputStream inputStream;
		try {
			request.setCharacterEncoding("UTF-8");
			Document doc = null;
			SAXReader reader = new SAXReader();
			inputStream = request.getInputStream();
			doc = reader.read(inputStream);
			Element root = doc.getRootElement();
			String toUserName = root.element("ToUserName").getTextTrim();
			String fromUserName = root.element("FromUserName").getTextTrim();
			String content = root.element("Content").getTextTrim();
			String msgType=root.element("MsgType").getTextTrim();
			String msgId=root.element("MsgId").getTextTrim();
			String createTime=root.element("CreateTime").getTextTrim();
			//只保存文本消息
			//时间
			System.out.println("接收消息内容:"+content+"-----------------msgType:"+msgType);
			if(WeiXinMsgType.TEXT.type.equals(msgType)){
				weiXinExternalService.addWxMessage(toUserName, fromUserName, content, msgType, msgId, formatTime(createTime));
				//如果需要回复消息
				PrintWriter out = null;
				out.printf(RESPONSE_TXT, fromUserName, toUserName,
						System.currentTimeMillis(), "text",  "回复内容");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * @Description: 传入的CreateTime转换成long类型
	 * @param @param createTime
	 * @param @return    
	 * @return Date 
	 * @throws
	 */
	private   Date formatTime(String createTime) {
		long msgCreateTime = Long.parseLong(createTime) * 1000L;
		return new Date(msgCreateTime);
	}
	
	/**
	 * 
	 * @Description: 校验微信签名
	 * @param     
	 * @return void 
	 * @throws
	 */
	private void validateSignature(){
		PrintWriter out = null;
		try {
			String signature = request.getParameter("signature");
			String timestamp = request.getParameter("timestamp");
			String nonce = request.getParameter("nonce");
			out = response.getWriter();
			if (checkSignature(signature, timestamp, nonce)) {
				out.print(request.getParameter("echostr"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			out.close();
			out = null;
		}
	}
	
	/**
	 * 
	 * @Description: 判断token是否合法
	 * @param @param signature
	 * @param @param timestamp
	 * @param @param nonce
	 * @param @return    
	 * @return boolean 
	 * @throws
	 */
	private  boolean checkSignature(String signature, String timestamp, String nonce) {
			//根据微信账号获取token并校验
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("wxNo", wxNo);
			WeiXinMasterConfig  masterConfig= weiXinExternalService.selectWeiXinMasterConfig(map);
			if(masterConfig==null){
				return false;
			}
			String[] arr = new String[] {masterConfig.getWxToken(), 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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值