舒大少博客

一个95后少年的个人博客

当前时间为:
欢迎大家来到舒大少博客https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

java编写微信支付

2022-05-07 19:55:20
swq1822677238
  1. 注册微信商户
  2. 下载微信支付的 SDK
  3. 打开idea打开微信支付的sdk复制到自己的项目中
  4. 在项目里创建配置类,继承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;
        }
    }
  5. 在项目中创建一个类实现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;
    }
  6. 编写场景类支付
    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();
            }
        }
    }
  7. 内网穿透
    网址 natapp.cn,注册登录完成实名,然后购买免费隧道,复制token,下载客户端,在exe当前目录打开cmd,输入 natapp -authtoken=token
  8. 回应消息给微信后台
    @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>");
    }
  9. 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>
  10. 绘制二维码
    // 绘制二维码
    @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();
        }
    }
  11. 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>

文件上传

2022-04-28 16:57:59
swq1822677238

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;
    }
}

(更多…)

仓库 “MySQL 5.7 Community Server” 的 GPG 密钥已安装,但是不适用于此软件包。请检查仓库的公 钥 URL 是否配置正确

2022-04-27 22:30:08
swq1822677238

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

Java微服务架构:RabbitMQ

2022-04-26 17:40:57
swq1822677238

一、RabbitMQ 介绍

1.1 引言

  1. 模块之间的耦合过高,导致一个模块宕机后,全部功能都不能用了
  2. 同步通讯的成本偏高

 

1.2 RabbitMQ的介绍

市面上比较火爆的几款MQ:
ActiveMQ,RocketMQ,Kafka,RabbitMQ。

  1. 语言的支持:ActiveMQ,RocketMQ只支持Java语言,Kafka可以支持多门语言,RabbitMQ支持多种语言
  2. 效率问题:ActiveMQ,RocketMQ,Kafka效率都是毫秒级别的,RabbitMQ是微秒级别的
  3. 消息丢失,消息重复问题:RabbitMQ针对消息的持久化,和重复问题都有比较成熟的解决方案
  4. 学习成本:RabbitMQ非常简单

RabbitMQ 是由Rabbit公司去研发和维护的,最终是在Pivotal。

RabbitMQ 严格遵循AMQP协议,高级消息队列协议,帮助我们在进程之间传递异步消息。 (更多…)

springboot分页

2022-04-18 19:32:32
swq1822677238

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解决方案

2021-03-29 15:11:42
swq1822677238

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连接池--> (更多…)

SpringBoot文件上传下载

2021-03-29 15:08:00
swq1822677238

控制层:

@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项目

2021-02-21 09:38:25
swq1822677238

Idea之没有网络的情况下创建SpringBoot项目

一丶创建SpringBoot有两个方式
1.没有网络的情况下使用Maven创建
1.1:用Idea创建maven项目 不要勾选 next (更多…)

2020java微服务架构之SpringBoot整合mybatis和ElasticSearch

2021-02-12 13:25:35
swq1822677238

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教程

2021-02-05 14:30:22
swq1822677238

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全文搜索引擎教程

2021-02-04 16:38:10
swq1822677238

2020java微服务架构五之ES全文搜索引擎教程

一、ElasticSearch 介绍

1.1 引言

1.在海量数据中执行搜索功能时,如果使用mysql,效率太低
2.如果关键字输入的不准确,一样可以搜索到想要的数据。
3.将搜索关键字,以红色的字体展示。

1.2 ES的介绍 (更多…)

2020java微服务架构四之Redis教程

2021-01-28 15:08:55
swq1822677238

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反向代理

2021-01-13 12:24:01
swq1822677238

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容器化技术

2021-01-12 14:33:08
swq1822677238

2020java微服务架构二之Docker容器化技术

Docker的思想

1.集装箱:
会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。

2.标准化:
a.运输的标准化:docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接派大海豚去搬运这个集装箱就可以了。
b.命令的标准化:docker提供了一些列的命令,帮助我们去获取集装箱等操作。
c.提供REST的API:衍生出了很多的图形化界面,Rancher (更多…)

Docker里面新建容器出现错误的解决方法

2021-01-09 19:59:11
swq1822677238

Docker里面新建容器出现错误的解决方法

对于初学者而言, Docker里面新建容器的时候可能会出现下面这个错误:

错误提示意思是, myubuntu已经被使用了, 就是本机内部已经有了一个名字为 myubuntu 容器, 我们可以用命令 sudo docker container ls 看下本机正在运⾏的容器, 果不其然:

解决方法:

(1) 给容器换一个名字, 比如说 docker run -it –name=myubuntu2 ubuntu /bin/bash, 可以解决问题.

(2) 将原来的容器删除, docker container rm myubuntu (提示: 这一步要确定删除容器没问题的情况下, 才可以做)

2020java微服务架构一之Linux

2021-01-08 14:14:31
swq1822677238

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逐渐成为功能完善、稳定的操作系统,并被广泛使用。 (更多…)