004:快速整合微信公众号开发

  • 1 微信公众号开发项目演示
  • 2 微信公众号开发设计原理
  • 3 基于natapp将本地项目发布到外网
  • 4 对接微信公众号测试平台
  • 5 第三方微信框架快速实现微信开发
  • 6 微信公众号数据库关键词表设计
  • 7 调用天气预报接口查询当前城市实时天气

1 微信公众号开发项目演示

今日课程任务

  1. 微信公众号架构设计原理
  2. 微信公众号如何本地开发测试
  3. 快速构建微信公众号服务项目
  4. 构建微信关键字回复内容
  5. 实现微信公众号实时查询城市温度

2 微信公众号开发设计原理

微信公众号开发的原理

当我们在微信客户端中,关注某个微信公众号之后,发出任何行为操作都会上传到微信公众号服务器端,再转发给开发者服务器。

3 基于natapp将本地项目发布到外网

外网映射工具的使用
目前有很多外网映射工具,比如NatApp、花生壳、ngrok等。
NatApp的使用
https://natapp.cn/ 购买域名、隧道,下载客户端
进入客户端下载解压目录,输入:natapp -authtoken=752cca064ce33a9b
测试效果:

4 对接微信公众号测试平台

微信公众号测试平台
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login&token=579271486&lang=zh_CN

微信开发接口框架
微信开发的框架:weixin-java-mp
微信开发接口的验证
http://maplefire.natapp1.cc/wx/portal/wx84fa688175f78964
相关技术文档:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

打开项目weixin-java-mp-demo-springboot-master,配置参数信息

5 第三方微信框架快速实现微信开发

6 微信公众号数据库关键词表设计

微服务整合微信开发框架
Maven依赖

<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>3.3.0</version>
</dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

数据库表结构

CREATE TABLE `wechat_keywords` (`id` int(11) NOT NULL AUTO_INCREMENT,`keyword_name` varchar(255) DEFAULT NULL,`keyword_value` varchar(255) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`version` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of wechat_keywords
-- ----------------------------
INSERT INTO `wechat_keywords` VALUES ('1', '蚂蚁课堂', '蚂蚁课堂专注于java微服务开发网站www.mayikt.com', '2020-03-10 17:32:15', '2020-03-11 17:32:18', '1');
INSERT INTO `wechat_keywords` VALUES ('2', '余胜军', '蚂蚁课堂创始人', '2020-03-10 17:32:45', '2020-03-10 17:32:49', '2');
INSERT INTO `wechat_keywords` VALUES ('3', '枫火', '蚂蚁课堂小菜鸟', '2020-04-09 17:32:45', '2020-03-10 17:32:49', '3');

核心代码

@Data
public class WechatKeyword {private Long id;private String keywordName;private String keywordValue;private Date createTime;private Date updateTime;private Long version;
}
@Mapper
public interface KeywordMapper {@Select("SELECT id as id ,keyword_name as keywordname,\n" +"keyword_value as keywordvalue,create_time as createtime,\n" +"update_time as updatetime ,version  as version\n" +"  FROM wechat_keywords where keyword_name=#{keyword};")WechatKeyword findByKeyword(String keyword);
}
@Component
@RefreshScope
public class MsgHandler extends AbstractHandler {@Value("${mayikt.wx.defaultMsg}")private String defaultMsg;@Value("${mayikt.wx.rpcWeatherUrl}")private String rpcWeatherUrl;@Resourceprivate KeywordMapper keywordMapper;@Overridepublic WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,Map<String, Object> context, WxMpService weixinService,WxSessionManager sessionManager) {if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) {//TODO 可以选择将消息保存到本地}String content = wxMessage.getContent();//1.先匹配数据库WechatKeyword wechatKeyword = keywordMapper.findByKeyword(content);if (wechatKeyword != null) {String keywordValue = wechatKeyword.getKeywordValue();return new TextBuilder().build(StringUtils.isEmpty(keywordValue) ? defaultMsg: keywordValue, wxMessage, weixinService);}//2.调用第三方天气预报接口查询String replaceRpcWeatherUrl = rpcWeatherUrl.replace("####", content);JSONObject resultJsonObject = HttpClientUtils.httpGet(replaceRpcWeatherUrl);if (resultJsonObject != null) {JSONArray results = resultJsonObject.getJSONArray("results");JSONObject resultsZeroJSONObject = results.getJSONObject(0);JSONObject locationJSONObject = resultsZeroJSONObject.getJSONObject("location");// 地址String path = locationJSONObject.getString("path");JSONObject nowJSONObject = resultsZeroJSONObject.getJSONObject("now");String text = nowJSONObject.getString("text");String temperature = nowJSONObject.getString("temperature");String lastUpdate = resultsZeroJSONObject.getString("last_update");String resultMsg = "您当前查询的城市" + content + ",天气为" + text + "天、实时温度为:" + temperature + "℃," +"最后更新的时间为:" + lastUpdate;return new TextBuilder().build(resultMsg, wxMessage, weixinService);}//3.回复默认消息return new TextBuilder().build(defaultMsg, wxMessage, weixinService);}}

新增配置文件

logging:level:org.springframework.web: INFOcom.github.binarywang.demo.wx.mp: DEBUGme.chanjar.weixin: DEBUG
wx:mp:configs:- appId: wx84fa688175f78964secret: 3cb04d764a6da943c61f79fde98a0a09token: mayiktmayikt:wx:defaultMsg: 您的消息已经收到,后期会给您回复!rpcWeatherUrl: http://api.seniverse.com/v3/weather/now.json?key=S2f6L62SpD0ivVO6j&location=####&language=zh-Hans&unit=c

测试效果:

7 调用天气预报接口查询当前城市实时天气

整合第三方天气预报接口
https://www.seniverse.com/ 心知天气接口

新建项目mt-shop-common
----mt-shop-common-core

/*** HttpClientUtils工具类*/
public class HttpClientUtils {private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录public static RequestConfig getRequestConfig(){RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).setConnectionRequestTimeout(5000).build();return requestConfig;}/*** post请求传输json参数** @param url  url地址* @return*/public static JSONObject httpPost(String url, JSONObject jsonParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);// 设置请求和传输超时时间httpPost.setConfig(getRequestConfig());try {if (null != jsonParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发送成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数据str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** post请求传输String参数 例如:name=Jack&sex=1&type=2* Content-type:application/x-www-form-urlencoded** @param url      url地址* @param strParam 参数* @return*/public static JSONObject httpPost(String url, String strParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);httpPost.setConfig(getRequestConfig());try {if (null != strParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(strParam, "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/x-www-form-urlencoded");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发送成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数据str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** 发送get请求** @param url 路径* @return*/public static JSONObject httpGet(String url) {// get请求返回结果JSONObject jsonResult = null;CloseableHttpClient client = HttpClients.createDefault();// 发送get请求HttpGet request = new HttpGet(url);request.setConfig(getRequestConfig());try {CloseableHttpResponse response = client.execute(request);// 请求发送成功,并得到响应if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 读取服务器返回过来的json字符串数据HttpEntity entity = response.getEntity();String strResult = EntityUtils.toString(entity, "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(strResult);} else {logger.error("get请求提交失败:" + url);}} catch (IOException e) {logger.error("get请求提交失败:" + url, e);} finally {request.releaseConnection();}return jsonResult;}}

微信服务引入mt-shop-common-core依赖
测试效果:

基于Vue+SpringCloudAlibaba微服务电商项目实战-技术选型-004:快速整合微信公众号开发相关推荐

  1. 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-011:基于Vue快速整合会员服务接口

    011:基于Vue快速整合会员服务接口 1 构建前端Vue项目调用后端接口实现联合登录效果演示 2 什么是微服务前后端分离开发的模式 3 联合登录接口接口简单回顾 4 前后端分离解决跨域的问题 5 V ...

  2. 基于Vue+SpringCloudAlibaba微服务电商项目实战-商品服务-015:亿万级别商品详情页面实现动态优化

    015:亿万级别商品详情页面实现动态优化 1 亿万级别商品详情页面如何设计 2 使用Nginx缓存商品详情页面 3 使用FreeMarker生成静态化模板页面 4 openresty+lua实现亿级别 ...

  3. 蚂蚁课堂-第四期-基于springcloud构建微服务电商项目_阿里巴巴29个屌炸天的开源项目,你用过几个?附编程资料!!!...

    1. 分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务 ...

  4. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目

    简介: 技术架构 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建.分布式解决方 案.互联 ...

  5. 新零售微服务电商项目SpringBoot/SpringCloudAlibaba

    技术架构–项目地址-新零售微服务电商项目 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建 ...

  6. 从零开始实现基于go-zero框架的微服务电商项目(三)——gorm、redis、腾讯云SMS、validate、md5加密、日志输入到kafka的添加

    从零开始实现基于go-zero框架的微服务电商项目(三)--gorm.redis.腾讯云SMS.validate.md5加密.日志输入到kafka的添加 项目地址:liuxianloveqiqi/Xi ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...

    目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录: 一.通过Dapr实现一个简单的 ...

最新文章

  1. linux下遇到的小问题与解决方法
  2. centos 7 php mysql apache_CentOS 7 搭建 Apache+MySQL+PHP
  3. Vmware安装与使用
  4. LSMW批处理使用方法(03)_步骤2
  5. 百天搞懂Java(一) - JDK环境配置
  6. python语音分割_Python 牺牲性能以提升程序员的工作效率
  7. iOS 跨平台开发,该用 Flutter 还是 Swift?
  8. 阿里HBase的GC优化实践,能够降低java垃圾回收时间!
  9. visio mysql使用教程_Visio技巧篇之一些常用小技巧
  10. 地理探测器GeoDetector
  11. 普通话/汉语的语音识别:DFSMN-CTC-SMBR模型
  12. win7系统如何加速计算机启动,怎么使win7系统开机加速
  13. ESP8266烧录选项中的QIO 和 DIO解释
  14. 免费比对工具DiffMerge
  15. VMware Workstation虚拟机备份及磁盘空间回收
  16. 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
  17. 集团审计BI项目的特点
  18. [转]计算机编程语言的入门学习
  19. intoduction linux services
  20. 【字符串处理】文明的复兴 words.pas/c/cpp/in/out

热门文章

  1. python 继续第七天
  2. 计算机键盘基本操作技能,高手必备,电脑键盘操作技巧
  3. 零基础学Java基础培训还是自学
  4. 看完这篇博客如果你还不知道怎么用charles连接手机算我输
  5. GitLab企业版和社区版的功能对比
  6. 梦泪的服务器是qq还是微信,微信区水有多深?偶遇演员,梦泪国服曜被打哭,三个字透露心酸!...
  7. 分享5 个最受欢迎的机器学习平台,免费又高级
  8. 网络变压器国产替代:国家安可计划与PULSE网络变压器产品国产化替代成果
  9. Linux虚拟化平台检测
  10. Php实现rdp协议,RDPY - Twisted Python 实现的RDP协议(Windows 远程桌面)