一、微信公众号项目
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自己定义,本地要与线上是一致的。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cc3eb6521654eae104272e9b1cec45b3.png)
六、 获取微信客户端发来的信息并且回复。(接入机器人)
/**
* 微信动作推送
* @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
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/19c6392e8fc88f79165d3fb7f86a9df8.png)
解决方案:
1、将已经消费过的消息id存放在redis中,当消息再次传来的时候,
如果redis中存放了该消息id,就不再重复消费了。