基于Vue+SpringCloudAlibaba微服务电商项目实战-技术选型-004:快速整合微信公众号开发
004:快速整合微信公众号开发
- 1 微信公众号开发项目演示
- 2 微信公众号开发设计原理
- 3 基于natapp将本地项目发布到外网
- 4 对接微信公众号测试平台
- 5 第三方微信框架快速实现微信开发
- 6 微信公众号数据库关键词表设计
- 7 调用天气预报接口查询当前城市实时天气
1 微信公众号开发项目演示
今日课程任务
- 微信公众号架构设计原理
- 微信公众号如何本地开发测试
- 快速构建微信公众号服务项目
- 构建微信关键字回复内容
- 实现微信公众号实时查询城市温度
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:快速整合微信公众号开发相关推荐
- 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-011:基于Vue快速整合会员服务接口
011:基于Vue快速整合会员服务接口 1 构建前端Vue项目调用后端接口实现联合登录效果演示 2 什么是微服务前后端分离开发的模式 3 联合登录接口接口简单回顾 4 前后端分离解决跨域的问题 5 V ...
- 基于Vue+SpringCloudAlibaba微服务电商项目实战-商品服务-015:亿万级别商品详情页面实现动态优化
015:亿万级别商品详情页面实现动态优化 1 亿万级别商品详情页面如何设计 2 使用Nginx缓存商品详情页面 3 使用FreeMarker生成静态化模板页面 4 openresty+lua实现亿级别 ...
- 蚂蚁课堂-第四期-基于springcloud构建微服务电商项目_阿里巴巴29个屌炸天的开源项目,你用过几个?附编程资料!!!...
1. 分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务 ...
- 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目
简介: 技术架构 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建.分布式解决方 案.互联 ...
- 新零售微服务电商项目SpringBoot/SpringCloudAlibaba
技术架构–项目地址-新零售微服务电商项目 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建 ...
- 从零开始实现基于go-zero框架的微服务电商项目(三)——gorm、redis、腾讯云SMS、validate、md5加密、日志输入到kafka的添加
从零开始实现基于go-zero框架的微服务电商项目(三)--gorm.redis.腾讯云SMS.validate.md5加密.日志输入到kafka的添加 项目地址:liuxianloveqiqi/Xi ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...
目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录: 一.通过Dapr实现一个简单的 ...
最新文章
- linux下遇到的小问题与解决方法
- centos 7 php mysql apache_CentOS 7 搭建 Apache+MySQL+PHP
- Vmware安装与使用
- LSMW批处理使用方法(03)_步骤2
- 百天搞懂Java(一) - JDK环境配置
- python语音分割_Python 牺牲性能以提升程序员的工作效率
- iOS 跨平台开发,该用 Flutter 还是 Swift?
- 阿里HBase的GC优化实践,能够降低java垃圾回收时间!
- visio mysql使用教程_Visio技巧篇之一些常用小技巧
- 地理探测器GeoDetector
- 普通话/汉语的语音识别:DFSMN-CTC-SMBR模型
- win7系统如何加速计算机启动,怎么使win7系统开机加速
- ESP8266烧录选项中的QIO 和 DIO解释
- 免费比对工具DiffMerge
- VMware Workstation虚拟机备份及磁盘空间回收
- 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
- 集团审计BI项目的特点
- [转]计算机编程语言的入门学习
- intoduction linux services
- 【字符串处理】文明的复兴 words.pas/c/cpp/in/out
热门文章
- python 继续第七天
- 计算机键盘基本操作技能,高手必备,电脑键盘操作技巧
- 零基础学Java基础培训还是自学
- 看完这篇博客如果你还不知道怎么用charles连接手机算我输
- GitLab企业版和社区版的功能对比
- 梦泪的服务器是qq还是微信,微信区水有多深?偶遇演员,梦泪国服曜被打哭,三个字透露心酸!...
- 分享5 个最受欢迎的机器学习平台,免费又高级
- 网络变压器国产替代:国家安可计划与PULSE网络变压器产品国产化替代成果
- Linux虚拟化平台检测
- Php实现rdp协议,RDPY - Twisted Python 实现的RDP协议(Windows 远程桌面)