WxController.java 5.5 KB
package com.w1hd.zzhnc.controller.wx;

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

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.theyeasy.weixin.service.WxOpenMpService;
import org.theyeasy.weixin.service.WxOpenService;
import org.theyeasy.weixin.util.WXBizMsgCrypt;
import org.theyeasy.weixin.util.WxMessageUtil;

import com.w1hd.zzhnc.controller.pc.BaseController;
import com.w1hd.zzhnc.service.FansService;
import com.w1hd.zzhnc.service.SysWxauthorizeService;
import com.w1hd.zzhnc.util.CommonUtil;
import com.w1hd.zzhnc.vo.Vo_msg;

import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;

@Controller
@RequestMapping("/wx")
public class WxController extends BaseController {
	@Autowired
	WxOpenService wxOpenService;

	WxOpenMpService WxOpenMpService;
	@Autowired
	SysWxauthorizeService sysWxauthorizeService;

	
	@Autowired
	FansService fansService;

	/*
	 * 授权回调,获取授权公众号
	 */
	@RequestMapping(value = "getAuthAuthorization", method = RequestMethod.POST)
	@ResponseBody
	public Vo_msg getAuthAuthorization(HttpServletRequest request, @RequestParam(value = "auth_code") String auth_code, @RequestParam(value = "merchantId", required = true) Integer merchantId) {
		try {
			String msg = wxOpenService.getApiGetAuthorizerInfo(auth_code, merchantId);
			return new Vo_msg(0, "", msg);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new Vo_msg(-1, "", e.getLocalizedMessage());
		}

	}

	private final static String COMPONENT_VERIFY_TICKET = "component_verify_ticket";

	// 接收微信每十分钟推送一次的授权ticket
	@RequestMapping(value = "authorize")
	public void acceptAuthrizeTicket(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "msg_signature") String msg_signature, @RequestParam(value = "timestamp") String timestamp, @RequestParam(value = "nonce") String nonce) throws Exception {
		try {

			System.out.println("收到ticket推送:signature=" + msg_signature + "   timestamp=" + timestamp + " nonce=" + nonce);

			String data = WxMessageUtil.readStrFromInputStream(request);
			Map<String, String> map = WxMessageUtil.parseXml(data);
			String appid = map.get("AppId");
			String encrypt = map.get("Encrypt");
			String openToken = wxOpenService.getWxOpenConfigStorage().getToken();
			String aseKey = wxOpenService.getWxOpenConfigStorage().getAesKey();
			System.out.println("openToken=" + openToken + "   aseKey=" + aseKey);
			WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(openToken, aseKey, appid);
			// 得到解密后的消息内容
			String decrpytMsg = wxBizMsgCrypt.decryptMsg(msg_signature, timestamp, nonce, encrypt);
			Map<String, String> decryptMap = WxMessageUtil.parseXml(decrpytMsg);

			if (null != decryptMap && decryptMap.containsKey("InfoType")) {
				if (COMPONENT_VERIFY_TICKET.equals(decryptMap.get("InfoType").toLowerCase())) {
					String verifyTicket = decryptMap.get("ComponentVerifyTicket");
					CommonUtil.sendWeiXinTicket(appid, verifyTicket); // 发送到托管服务器

					wxOpenService.getWxOpenConfigStorage().updateComponentVerifyTicket(verifyTicket);// 更新本地缓存变量

				}
			}

			PrintWriter writer = response.getWriter();
			writer.print("success");
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 接收公众号的事件消息
	@RequestMapping(value = "/{APPID}/msg")
	public void msg(HttpServletRequest request, HttpServletResponse response, @PathVariable("APPID") String appid, @RequestParam(value = "msg_signature") String msg_signature, @RequestParam(value = "timestamp") String timestamp, @RequestParam(value = "nonce") String nonce) throws Exception {
		response.setCharacterEncoding("utf-8");
		String msg = "success";
		
		try {

			String data = WxMessageUtil.readStrFromInputStream(request);
			Map<String, String> map = WxMessageUtil.parseXml(data);
			String encrypt = map.get("Encrypt");

			String openToken = wxOpenService.getWxOpenConfigStorage().getToken();
			String aseKey = wxOpenService.getWxOpenConfigStorage().getAesKey();
			String openAppId = wxOpenService.getWxOpenConfigStorage().getAppId();

			WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(openToken, aseKey, openAppId);

			try {
				wxOpenService.getWxMpService(appid);
			} catch (Exception e) {
				wxOpenService.initWxMpService(appid, "");// 注册
			}
			String decrypt = wxBizMsgCrypt.decryptMsg(msg_signature, timestamp, nonce, encrypt);
			 
			WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(decrypt);
			WxMpXmlOutMessage outMessage = wxOpenService.route(inMessage, appid);
			if (null != outMessage) msg = wxBizMsgCrypt.encryptMsg(outMessage.toXml(), timestamp, nonce);
		} catch (Exception e) {
			e.printStackTrace();
		}

		PrintWriter writer = response.getWriter();
		writer.print(msg);
		writer.close();
	}



	//红包中奖页面
	@RequestMapping(value = "/redpackage")
	public ModelAndView redpackage(String mny) {
		ModelAndView mv = new ModelAndView("/weixin/redpackage");
		mv.addObject("mny", mny);		
		return mv;
	}
}