Java架构学习(五十一)微信公众号开发&混合开发技术流程&微信推送原理&外网映射工具使用&微信公众号接口认证代码&获取微信客户端信息&解决微信消息幂等问题

一、微信公众号项目

SOA架构:面向接口开发,也就是相当于把传统的那种ssh项目的业务逻辑层抽取出来
做成接口。
SSH架构与分布式架构的区别
SSH架构是整个项目的任何模块都在一个项目里面
分布式架构相当于把一个项目,拆分成n个子项目

二、混合开发技术流程

混合开发技术:原生态+H5 
什么是原生态:原生态软件,可以理解成桌面应用程序。
混合开发就是客户端技术啊+网站这种模式开发。

三、微信消息退送原理

用户在微信客户端点击发送,消息发送到了微信服务端,微信服务端再以
通讯保温的格式退送到你开发的那个平台。当你的平台受到消息后。代码判断后,对返回消息
进行封装推送到微信服务器端。微信服务器端,再推送给微信客户端。

四、外网映射工具

	natapp 收费
	ngrok 免费

五、微信公众号接口认证

接口认证方法:
	//服务器验证接口地址
	@RequestMapping(value = "/dispatcher",method=RequestMethod.GET)
	public String dispatcherGet(String signature,String timestamp,String nonce, String echostr ) {
		
		//1.验证参数
        Boolean checkSignature = CheckUtil.checkSignature(signature, timestamp, nonce);
		//2.如果返回true就返回随机数
        if(!checkSignature) {
        	
        	return null;
        }
		return echostr;
	}

将上面的地址填在微信接口配置上,加密的token自己定义,本地要与线上是一致的。

在这里插入图片描述


六、 获取微信客户端发来的信息并且回复。(接入机器人)

/**
	 * 微信动作推送
	 * @return
	 * @throws Exception 
	 */
	@RequestMapping(value = "/dispatcher",method=RequestMethod.POST)
	public void dispatcherPost(HttpServletRequest request,HttpServletResponse response) throws Exception {
		//编码格式
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		//1.将xml转换成map格式  获取到微信端发送给我们的信息
		Map<String, String> resultMap = XmlUtils.parseXml(request);
		log.info("####收到来之微信消息"+resultMap+"####");
		//2.判断消息类型
		String msgType = resultMap.get("MsgType");
		//3.判断该消息是什么类型的返回结果给微信服务端
		PrintWriter writer = response.getWriter();//响应消息给微信客户端
		switch (msgType) {
		case "text":
			//如果是文本类型获取该内容
			String fromUserName = resultMap.get("FromUserName");//从那个用户发过来的
			String toUserName = resultMap.get("ToUserName");//从那个微信公众号接受过来的
			String content = resultMap.get("Content");//接受到的内容
			String msg  = null;
			if(content.contains("学习")) {
				msg=  setText("要学习,就感觉学习还玩微信", toUserName, fromUserName);  //回复这里是反过来
			}if(content.contains("李月")) {
				msg=  setText("李月是我的开发者", toUserName, fromUserName);  //回复这里是反过来
			}else {
				String resultJson = HttpClientUtil.doGet(REQESTURL+content);
				JSONObject jsonObject = JSONObject.parseObject(resultJson);
				Integer resultCode = jsonObject.getInteger("result");
				if(resultCode == 0) {
					String resultContent = jsonObject.getString("content");
					msg = setText(resultContent, toUserName,fromUserName);
				}else {
					msg = setText("我现在很忙,稍后再回复您吧!", toUserName, fromUserName);
				}
			}
			writer.println(msg);
			log.info("####发送给微信的消息"+msg+"####");
			break;
		default:
			break;
		}
		//走完这个流程过后就关闭流 
		writer.close();
		
	}
//将信息实体转换成xml发送到其他客户端
	/**
	 * 
	 * @param content  回复内容
	 * @param fromUserName 从那个公众号发送
	 * @param toUserName 发送给那个用户
	 * @return
	 */
	public String setText(String content,String fromUserName,String toUserName) {
		TextMessage textMessage = new TextMessage();
		textMessage.setContent(content);
		textMessage.setCreateTime(new Date().getTime());
		textMessage.setFromUserName(fromUserName);
		textMessage.setToUserName(toUserName);
		textMessage.setMsgType("text");
		//将实体类转换成xml格式
		return XmlUtils.messageToXml(textMessage);
	}

七、解决微信消息幂等问题

微信官方接受到的消息都有一个唯一不重复的消息id

在这里插入图片描述

	解决方案:
	1、将已经消费过的消息id存放在redis中,当消息再次传来的时候,
	如果redis中存放了该消息id,就不再重复消费了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值