- 注册微信商户
- 下载微信支付的 SDK
- 打开idea打开微信支付的sdk复制到自己的项目中
- 在项目里创建配置类,继承WXPayConfig类,在里面添加商户信息
public class MyWxPayConfig extends WXPayConfig{ @Override String getAppID() { return "商户appid"; } @Override String getMchID() { return "商户号"; } @Override String getKey() { return "证书秘钥"; } @Override InputStream getCertStream() { return null; } @Override IWXPayDomain getWXPayDomain() { MyWXPayDomain domain=new MyWXPayDomain(); return domain; } }
- 在项目中创建一个类实现IWXPayDomain接口
@Override public void report(String domain, long elapsedTimeMillis, Exception ex) { } @Override public DomainInfo getDomain(WXPayConfig config) { DomainInfo info=new DomainInfo("api.mch.weixin.qq.com",true); return info; }
- 编写场景类支付
public class TestPay { public static void main(String[] args) throws Exception { MyWxPayConfig config = new MyWxPayConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("body", "腾讯充值中心-QQ会员充值"); data.put("out_trade_no", "2022050719401100000012"); data.put("device_info", ""); data.put("fee_type", "CNY"); data.put("total_fee", "1"); data.put("spbill_create_ip", "123.12.12.123"); data.put("notify_url", "http://www.example.com/wxpay/notify"); data.put("trade_type", "NATIVE"); // 此处指定为扫码支付 data.put("product_id", "12"); try { Map<String, String> resp = wxpay.unifiedOrder(data); System.out.println(resp); } catch (Exception e) { e.printStackTrace(); } } }
- 内网穿透
网址 natapp.cn,注册登录完成实名,然后购买免费隧道,复制token,下载客户端,在exe当前目录打开cmd,输入 natapp -authtoken=token - 回应消息给微信后台
@RequestMapping("/notify_url") public void doPayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStream inputStream = request.getInputStream(); byte[] buffer=new byte[1024]; int len=0; while( (len= inputStream.read(buffer))!=-1 ){ System.out.println(new String(buffer,0,len)); } response.getWriter().write("<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>"); }
- zxing二维码生成
<!--zxing二维码生成--> <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <!--zxing二维码生成--> <!-- https://mvnrepository.com/artifact/com.google.zxing/javase --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.0</version> </dependency>
- 绘制二维码
// 绘制二维码 @RequestMapping("/qrcode") public void qrcode(HttpServletResponse response)throws URISyntaxException, IOException { //二维码需要包含的文本内容 String uri ="http://www.baidu.com"; HashMap<EncodeHintType,Object> hints=new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET,"UTF-8"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); hints.put(EncodeHintType.MARGIN,2); try { BitMatrix bitMatrix=new MultiFormatWriter().encode(uri, BarcodeFormat.QR_CODE,200,200,hints); MatrixToImageWriter.writeToStream(bitMatrix,"PNG",response.getOutputStream()); System.out.println("创建二维码完成");} catch(Exception e){ e.printStackTrace(); } }
- goeasy异步调用
goeasy:网址:https://www.goeasy.io/
加依赖<!-- goeasy 异步 --> <dependency> <groupId>io.goeasy</groupId> <artifactId>goeasy-sdk</artifactId> <version>0.3.16</version> </dependency>
在 goeasy创建应用,获取Common key及hangzhou.goeasy.io
在微信支付通知的控制层新增
GoEasy goEasy = new GoEasy( "http://rest-hangzhou.goeasy.io/v2/pubsub/publish", "BC-3d456eb942cc4926b807cdb77dfb5216"); goEasy.publish("wxpay", "success");
下单页面
<script src="http://hangzhou.goeasy.io/goeasy.js"></script> <script> //初始化 var goeasy = new GoEasy({ host:"hangzhou.goeasy.io", //若是新加坡区域:singapore.goeasy.io appkey:"BC-3d456eb942cc4926b807cdb77dfb5216", modules:['pubsub']//根据需要,传入‘pubsub’或'im’,或数组方式同时传入 }) var pubsub = goeasy.pubsub; goeasy.subscribe({ channel: "wxpay",//替换为您自己的channel onMessage: function (message) { alert("收到:"+message.content); console.log("Channel:" + message.channel + " content:" + message.content); } }); </script>
upload工具类
public class UploadUtils { // 生成带有UUID新的文件名 public static String newFileName(String filename){ return UUID.randomUUID().toString().replaceAll("-","")+"_"+filename; } // 生成二级、三级目录 public static String newFilePath(String basePath,String fileName){ int hashCode = fileName.hashCode(); int path1=hashCode&15; int path2=(hashCode>>4)&15; String newPath=basePath+ File.separator+path1+File.separator+path2; File file=new File(newPath); if (!file.exists()) { file.mkdirs(); } return newPath; } }
rpm –checksig package_name.rpm
rpm –checksig mysql-community-server-5.7.38-1.el8.x86_64.rpm
gpg –export -a 3a79bd29 > 3a79bd29.asc
rpm –import 3a79bd29.asc
rpm –import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
一、RabbitMQ 介绍
1.1 引言
- 模块之间的耦合过高,导致一个模块宕机后,全部功能都不能用了
- 同步通讯的成本偏高
1.2 RabbitMQ的介绍
市面上比较火爆的几款MQ:
ActiveMQ,RocketMQ,Kafka,RabbitMQ。
- 语言的支持:ActiveMQ,RocketMQ只支持Java语言,Kafka可以支持多门语言,RabbitMQ支持多种语言
- 效率问题:ActiveMQ,RocketMQ,Kafka效率都是毫秒级别的,RabbitMQ是微秒级别的
- 消息丢失,消息重复问题:RabbitMQ针对消息的持久化,和重复问题都有比较成熟的解决方案
- 学习成本:RabbitMQ非常简单
RabbitMQ 是由Rabbit公司去研发和维护的,最终是在Pivotal。
RabbitMQ 严格遵循AMQP协议,高级消息队列协议,帮助我们在进程之间传递异步消息。 (更多…)
Springboot版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
依赖
<!--分页助手--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>
控制层
// 帖子管理 @RequestMapping("/posts") public String posts(String pageIndex,String pageSize,HttpServletRequest request){ // 判断页码和页大小 int pageNum=0,pageSizes=0; if(pageIndex==null)pageNum=1; else pageNum=Integer.parseInt(pageIndex); if(pageSize==null)pageSizes=10; else pageSizes=Integer.parseInt(pageSize); BbsPostMapper postMapper = ss.getMapper(BbsPostMapper.class); // 设置分页 PageHelper.startPage(pageNum,pageSizes); // 查询所有 List<BbsPost> bbsPost = postMapper.getAllBbsPost2(); BbsItemMapper itemMapper = ss.getMapper(BbsItemMapper.class); HashSet<BbsItem> itemHashSet=new HashSet<>(); // 封装数据 PageInfo<BbsPost> pageInfo=new PageInfo<>(bbsPost); for (BbsPost bbsPosts : pageInfo.getList()) { BbsItem bbsItem = itemMapper.selectByPrimaryKey(bbsPosts.getItemid()); itemHashSet.add(bbsItem); } request.setAttribute("itemHashSet",itemHashSet); request.setAttribute("bbsPost",bbsPost); request.setAttribute("pageInfo",pageInfo); return "admin/posts"; }
页面分页
<div class="pages"> <nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> <li class="page-item"> <a class="page-link" href="/bbsServer/posts">首页</a> </li> <c:if test="${requestScope.pageInfo.isFirstPage!=true}"> <li class="page-item"> <a class="page-link" href="/bbsServer/posts?pageIndex=${requestScope.pageInfo.prePage}">上一页</a> </li> </c:if> <c:forEach var="i" begin="1" end="${requestScope.pageInfo.pages}" > <li class="page-item"> <a class="page-link" href="/bbsServer/posts?pageIndex=${i}">${i}</a> </li> </c:forEach> <c:if test="${requestScope.pageInfo.isLastPage!=true}"> <li class="page-item"> <a class="page-link" href="/bbsServer/posts?pageIndex=${requestScope.pageInfo.nextPage}">下一页</a> </li> <li class="page-item"> <a class="page-link" href="/bbsServer/posts?pageIndex=${requestScope.pageInfo.navigateLastPage}">尾页</a> </li> </c:if> <li class="page-item"> <a class="page-link">共计${requestScope.pageInfo.total} 条数据</a> </li> </ul> </nav> </div>
Linux运行SpringBoot项目出现404解决方案
修改项目的 pom.xml文件,依赖请根据自身项目情况进行摘选
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> <!--druid连接池--> (更多…)
控制层:
@Controller @RequestMapping("/") public class UploadController { @RequestMapping("/") public String index(){return "upload";} // 得到一个新的文件路径 public String realPath(String path){ SimpleDateFormat y=new SimpleDateFormat("yyyy"); SimpleDateFormat m=new SimpleDateFormat("MM"); SimpleDateFormat d=new SimpleDateFormat("dd"); Date date=new Date(System.currentTimeMillis()); String year = y.format(date); String month = m.format(date); String day = d.format(date); String realPath=path+ File.separator+year+File.separator+month+File.separator+day; File file=new File(realPath); if(!file.exists()) file.mkdirs(); return realPath; } (更多…)
Idea之没有网络的情况下创建SpringBoot项目
一丶创建SpringBoot有两个方式
1.没有网络的情况下使用Maven创建
1.1:用Idea创建maven项目 不要勾选 next (更多…)
SpringBoot整合mybatis和ElasticSearch
1.创建客户模块和搜索模块
2.准备客户模块的静态资源(页面,实体类,数据库)
3.准备搜索模块的资源(在ES中创建客户模块的索引)
3.1 导入ES的依赖
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.5.4</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.5.4</version> </dependency>
3.2 编写连接ES的config配置类(搜索模块) (更多…)
2020java微服务架构六之springboot教程
一、SpringBoot介绍
SpringBoot是由pivotal团队研发的,SpringBoot不是一门新技术,只是将之前的Spring,SpringMVC,data-jpa等常用的框架封装到了一起,帮助你隐藏这些框架的整合细节,实现敏捷开发。
SpringBoot就是一个工具集。
SpringBoot的特点:
1.SpringBoot项目不需要模板化的配置
2.SpringBoot中整合第三方框架时,只需要导入相应的starter依赖包,就自动整合了
3.SpringBoot默认只有一个.properties的配置文件,不推荐使用xml,后期会采用.java文件去编写配置信息
4.SpringBoot工程在部署时,采用的是jar包方式,内部自动依赖Tomcat容器,提供了多环境的配置
5.后期要学习的微服务框架SpringClound需要建立在SpringBoot的基础上 (更多…)
2020java微服务架构五之ES全文搜索引擎教程
一、ElasticSearch 介绍
1.1 引言
1.在海量数据中执行搜索功能时,如果使用mysql,效率太低
2.如果关键字输入的不准确,一样可以搜索到想要的数据。
3.将搜索关键字,以红色的字体展示。
1.2 ES的介绍 (更多…)
2020java微服务架构四之Redis教程
一、Redis介绍
1.NoSQL介绍
Redis就是一款NoSQL
NoSQL->非关系型数据库–>Not Only SQL
key-value:Redis
文档型:ElasticSearch,Solr,Mongdb
面向列:Hbase,Cassandra
图形化:Neo4j
除了关系型数据库都是非关系型数据库
noSQL只是一种概念,泛指非关系型数据库,和关系型数据库做一个区分
2.Redis介绍
有一位意大利人,在开发一款LLOOGG的统计页面,因为MySQL的性能不好,自己研发了一款非关系型数据库,并命名为Redis。Salvatore。 (更多…)
2020java微服务架构三之NGINX反向代理
1.NGINX安装
1.安装NGINX:
mkdir /opt/docker_nginx
cd /opt/docker_nginx
vi docker-compose.yml
docker-compose up -d
docker-compose.xml
version: '3.1' services: nginx: restart: always image: daocloud.io/library/nginx:latest container_name: nginx ports: - 80:80
2020java微服务架构二之Docker容器化技术
Docker的思想
1.集装箱:
会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。
2.标准化:
a.运输的标准化:docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接派大海豚去搬运这个集装箱就可以了。
b.命令的标准化:docker提供了一些列的命令,帮助我们去获取集装箱等操作。
c.提供REST的API:衍生出了很多的图形化界面,Rancher (更多…)
Docker里面新建容器出现错误的解决方法
对于初学者而言, Docker里面新建容器的时候可能会出现下面这个错误:
错误提示意思是, myubuntu已经被使用了, 就是本机内部已经有了一个名字为 myubuntu 容器, 我们可以用命令 sudo docker container ls 看下本机正在运⾏的容器, 果不其然:
解决方法:
(1) 给容器换一个名字, 比如说 docker run -it –name=myubuntu2 ubuntu /bin/bash, 可以解决问题.
(2) 将原来的容器删除, docker container rm myubuntu (提示: 这一步要确定删除容器没问题的情况下, 才可以做)
2020java微服务架构一之Linux
Linux介绍:
Linux操作系统出现之前,还有一个操作系统叫Minix,该操作系统是由Andrew的大学教授研发出来的,名为MINIX,为了向学生讲述操作系统内部工作原理。MINIX虽然很好,但只是一个用于教学目的的简单操作系统,而不是一个强有力的实用操作系统,然而最大的好处就是公开源代码。
全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统,芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个,在吸收了MINIX精华的基础上,Linus于1991年写出了属于自己的Linux操作系统,版本为Linux0.01,是Linux时代开始的标志。他利用Unix的核心,去除繁杂的核心程序,改写成适用于一般计算机的x86系统,并放在网络上供大家下载,1994年推出完整的核心Version1.0,至此,Linux逐渐成为功能完善、稳定的操作系统,并被广泛使用。 (更多…)