微信公众号java01

最近在研究微信公众号java开发,今天写一个简单的程序(我使用的是自己的微信测试号):

1、这里使用微信sdk

maven:

   <dependency>
			<groupId>com.github.binarywang</groupId>
			<artifactId>weixin-java-mp</artifactId>
			<version>2.9.0</version>
		</dependency>

springMVC的环境配置就不多说了。


2、wechatContorller,

	/**
	 * 微信验证
	 * 
	 */
	@RequestMapping("/index.do")
	public void index(HttpServletRequest request, HttpServletResponse response,
			HttpSession session) throws ServletException, IOException {
		wxMpServiceInstance.doResponse(request, response);
	}

3、WxMpServiceInstance

public class WxMpServiceInstance{
private static WxMpService wxMpService; // API 服务接口对象
	private WxMpConfigStorage wxMpConfigStorage; // 配置信息存储对象
	public static WxMpMessageRouter wxMpMessageRouter; // 微信消息路由器对象
	private WechatSendInformationService sendInformationService;
	@Resource
	private WechatManagementService wechatManagementService;
	@Resource
	private WechatRedreceiveRecordService wechatRedreceiveRecordService;
	private WxMpServiceInstance() {
		try {
			WxMpXMLInMemoryConfigStorage config = WxMpXMLInMemoryConfigStorage
					.fromXml();
			//微信公众号相关
			wxMpConfigStorage = config;
			wxMpService = new WxMpServiceImpl();
			wxMpService.setWxMpConfigStorage(config);
			wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
			
			this.addEvtRouterRule();
			
		} catch (JAXBException e) {
			throw new RuntimeException(e);
		}
	}

	public WxMpService getWxMpService() {
		return wxMpService;
	}

	public void setWxMpService(WxMpService wxMpService) {
		this.wxMpService = wxMpService;
	}

	public WxMpConfigStorage getWxMpConfigStorage() {
		return wxMpConfigStorage;
	}

	public void setWxMpConfigStorage(WxMpConfigStorage wxMpConfigStorage) {
		this.wxMpConfigStorage = wxMpConfigStorage;
	}

	public WxMpMessageRouter getWxMpMessageRouter() {
		return wxMpMessageRouter;
	}

	public void setWxMpMessageRouter(WxMpMessageRouter wxMpMessageRouter) {
		this.wxMpMessageRouter = wxMpMessageRouter;
	}

public void doResponse(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String signature = request.getParameter("signature");
		String nonce = request.getParameter("nonce");
		String timestamp = request.getParameter("timestamp");


		response.setContentType("text/html;charset=utf-8");
		response.setStatus(HttpServletResponse.SC_OK);


		if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
			// 消息签名不正确,说明不是公众平台发过来的消息
			response.getWriter().println("非法请求");
			return; // 非法
		}
		// 合法
		String echostr = request.getParameter("echostr");
		if (StringUtils.isNotBlank(echostr)) {
			// 说明是一个仅仅用来验证的请求,回显echostr
			response.getWriter().println(echostr);
			return;
		}
		
		// 获取消息加密类型
		String encryptType = StringUtils.isBlank(request
				.getParameter("encrypt_type")) ? "raw" : request
				.getParameter("encrypt_type");


		WxMpXmlMessage inMessage = null; // 输入消息


		if ("raw".equals(encryptType)) {
			// 明文传输的消息
			try {
				inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		} else if ("aes".equals(encryptType)) {
			// 是aes加密的消息
			String msgSignature = request.getParameter("msg_signature");
			inMessage = WxMpXmlMessage.fromEncryptedXml(
					request.getInputStream(), wxMpConfigStorage, timestamp,
					nonce, msgSignature);
		} else {
			response.getWriter().println("不可识别的加密类型");
			return;
		}
		// 通过微信消息路由器处理输入消息inMessage,得到返回消息 outMessage
		WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
		if (outMessage != null) {
			if ("raw".equals(encryptType)) {
				response.getWriter().write(outMessage.toXml());
			} else if ("aes".equals(encryptType)) {
				response.getWriter().write(
						outMessage.toEncryptedXml(wxMpConfigStorage));
			}
			return;
		}
	}

/**
	 * 关注自动回复路由规则
	 * 
	 */
	private void addEvtRouterRule(){
		WxMpMessageHandler handler = new WxMpMessageHandler() {
			@Override
			public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
					Map<String, Object> context, WxMpService wxMpService,
					WxSessionManager sessionManager) throws WxErrorException {
				String strOut = "欢迎你的关注"; 
				WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT()
						.content(strOut).fromUser(wxMessage.getToUser())
						.toUser(wxMessage.getFromUser()).build();
				return m;
			}
		};
		wxMpMessageRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SUBSCRIBE).handler(handler).end();
	}}



4、WxMpXMLInMemoryConfigStorage

class WxMpXMLInMemoryConfigStorage extends WxMpInMemoryConfigStorage {



  // 将微信配置文件 /weixin.config.xml 解析为 WxMpXMLInMemoryConfigStorage对象返回
  public static WxMpXMLInMemoryConfigStorage fromXml(InputStream is) throws JAXBException {
   
	  //微信配置参数
	  WxMpXMLInMemoryConfigStorage cfg = new WxMpXMLInMemoryConfigStorage();
	  cfg.setAppId("appid");
	  cfg.setSecret("随机数");
	  cfg.setToken("token");
	 // cfg.setAesKey("密钥,测试号不用填写");
	  
	  return cfg;
  }
}

5、运行项目,配置测试号中的url,token




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值