SpringMVC+Mybatis二维码实现多平台付款(附源码)

目录
  • 整体思路:
  • 基本流程和思路:
  • 1.整体架构:
  • 2.配置编译的文件目录
  • 3.pom.xml
  • 4.二维码相关属性(Model)
  • 5.二维码生成代码
  • 6.Controller相关代码
  • 7.二维码相关参数初始化
  • 总结:

今天,这篇文章就带你们简单实现多平台支付!

整体思路:

实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis框架,maven管理。其实如果支付,不需要mybatis也能实现,代码和本人见解还需大神指教。

基本流程和思路:

  • 用户点击支付
  • 出现一次支付密码,并且带有时间限制
  • 扫描二维码跳转后台
  • 后台判断是微信支付还是支付宝支付

1.整体架构:

2.配置编译的文件目录

3.pom.xml

其中qrcode.qrcode、qrcode.swetake是从本地编译到maven库中,因为网络maven中没有。


<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>fanghuai</groupId>
        <artifactId>nbt</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.nbt.qrcoder</groupId>
    <artifactId>nbt-qrcode</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>nbt-qrcode Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.1.3.RELEASE</spring.version>
        <mybatis.version>3.2.8</mybatis.version>
        <mybatis.spring.version>1.2.2</mybatis.spring.version>
        <mybatis.paginator.version>1.2.15</mybatis.paginator.version>
        <mysql.version>5.1.32</mysql.version>
        <slf4j.version>1.6.4</slf4j.version>
        <jackson.version>2.4.2</jackson.version>
        <druid.version>1.0.9</druid.version>
        <jstl.version>1.2</jstl.version>
        <servlet-api.version>2.5</servlet-api.version>
        <jsp-api.version>2.0</jsp-api.version>
        <commons-lang3.version>3.3.2</commons-lang3.version>
        <commons-io.version>1.3.2</commons-io.version>
        <commons-net.version>3.3</commons-net.version>
        <pagehelper.version>4.0.0</pagehelper.version>

    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- qrcode -->
        <dependency>
            <groupId>qrcode.qrcode</groupId>
            <artifactId>qrcode</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>qrcode.swetake</groupId>
            <artifactId>swetake</artifactId>
            <version>1.0</version>
        </dependency>

        <!-- 日志处理 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.miemiedev</groupId>
            <artifactId>mybatis-paginator</artifactId>
            <version>${mybatis.paginator.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>
        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- 连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- JSP相关 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>${servlet-api.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${jsp-api.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>nbt-qrcode</finalName>
    </build>
</project>

4.二维码相关属性(Model)


package com.nbt.util;
import java.awt.image.BufferedImage;
import jp.sourceforge.qrcode.data.QRCodeImage;

 public   class J2SEImage implements QRCodeImage {
        BufferedImage bufImg;
        public J2SEImage(BufferedImage bufImg) {
            this.bufImg = bufImg;
        }
        public int getWidth() {
            return bufImg.getWidth();
        }
        public int getHeight() {
            return bufImg.getHeight();
        }
        public int getPixel(int x, int y) {
            return bufImg.getRGB(x, y);
        }
    }

5.二维码生成代码

package com.nbt.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

public class QRCode {

     /**
     * 生成二维码(QRCode)图片
     * @param content  二维码内容
     * @param imgPath 存放二维位置
     */
    public static  void encoderQRCode(BuildQRCode bc) { 

        try {
            Qrcode qrcodeHandler = new Qrcode();
            qrcodeHandler.setQrcodeErrorCorrect('M');
            qrcodeHandler.setQrcodeEncodeMode('B');
            qrcodeHandler.setQrcodeVersion(7);
            System.out.println(bc.getContent());
            byte[] contentBytes = bc.getContent().getBytes("gb2312");
            BufferedImage bufImg = new BufferedImage(140, 140,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, 140, 140);
            // 设定图像颜色> BLACK
            gs.setColor(Color.BLACK);
            // 设置偏移量 不设置可能导致解析出错
            int pixoff = 2;
            // 输出内容> 二维码
            if (contentBytes.length > 0 && contentBytes.length < 120) {
                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            } else {
                System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. ");
            }
            gs.dispose();
            bufImg.flush();
            File imgFile = new File(bc.getImgPath());
            // 生成二维码QRCode图片
            ImageIO.write(bufImg, "png", imgFile); 

        } catch (Exception e) { 

            e.printStackTrace();
        }
    } 

    /**
     * 解码二维码
     * @param imgPath
     * @return String
     */
    public static  String decoderQRCode(String imgPath) {
        // QRCode 二维码图片的文件
        File imageFile = new File(imgPath);
        BufferedImage bufImg = null;
        String decodedData = null;
        try {
            bufImg = ImageIO.read(imageFile);
            QRCodeDecoder decoder = new QRCodeDecoder();
            decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
            // try {
            // System.out.println(new String(decodedData.getBytes("gb2312"),
            // "gb2312"));
            // } catch (Exception e) {
            // // TODO: handle exception
            // }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
        } catch (DecodingFailedException dfe) {
            System.out.println("Error: " + dfe.getMessage());
            dfe.printStackTrace();
        }
        return decodedData;
    } 

    public static void main(String[] args) {

    //生成二维码
         String imgPath = "D:/test/Michael_QRCode.png";
         String content = "http://www.baidu.com";
         BuildQRCode bc = new BuildQRCode(imgPath,content);
         encoderQRCode(bc);
         System.out.println("encoder QRcode success"); 

     //解读二维码
         String decoderContent =decoderQRCode(imgPath);
         System.out.println("解析结果如下:");
         System.out.println(decoderContent);
         System.out.println("========decoder success!!!");
     }
}

6.Controller相关代码

(jsp页面要通过流的形式放在页面上,不然二维码显示不出来。)

package com.nbt.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.mysql.jdbc.StringUtils;
import com.nbt.util.BuildQRCode;
import com.nbt.util.QRCode;
@Controller
@RequestMapping("/qr")
public class QRCodeController {

    private static Logger log = Logger.getLogger(QRCodeController.class);

    /**
     * 跳转到二维码页面
     * @param request
     * @return
     */
    @RequestMapping("/toShowQRCode.do")
    public String showQRCode(HttpServletRequest request){
        log.info("跳转到二维码页面...");
        return "qr";
    }

    /**
     * 通过流的形式实现在jsp上面显示二维码
     * @param model
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/readImage")
    public void readImage(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException{
        BuildQRCode bc = new BuildQRCode();//调用无参构造方法
        bc.initParam(bc);//对参数进行初始化
        QRCode.encoderQRCode(bc);//生成二维码

        String filePath =  bc.getImgPath();
        File filePic = new File(filePath);
        if(filePic.exists()){
           FileInputStream is = new FileInputStream(filePic);
           int i = is.available(); // 得到文件大小
           byte data[] = new byte[i];
           is.read(data); // 读数据
           is.close();
           response.setContentType("image/*"); // 设置返回的文件类型
           OutputStream toClient = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
           toClient.write(data); // 输出数据
           toClient.close();
        }
    }  

    /**
     * 预支付接口
     * @param timeout
     * @param orderNo
     * @return
     */
    @RequestMapping("/toPay.do")
    public String toPay(@RequestParam("timeout") String timeout,@RequestParam("orderNo")String orderNo){
        log.info("开始进行支付");
        if(StringUtils.isNullOrEmpty(orderNo)||StringUtils.isNullOrEmpty(timeout)){
            log.info("订单号或者时间超时为空");
            return "faile";
        }

        Calendar ca = Calendar.getInstance();
        String afterTime = new SimpleDateFormat("yyyyMMddHHmmssSS").format(ca.getTime());

        if(!afterTime.equals(timeout)){
            log.info(afterTime+"---->"+timeout);
            log.info("二维码已失效,请重新支付");
            return "faile";
        }
        /**
         * ..... 这段可以根据二维码参数不一样,去相关支付平台进行支付,
         * 具体代码可以根据支付平台的api文档进行支付操作
         */
        log.info("支付成功");
        return "success";
    }
}

7.二维码相关参数初始化

(我目前二维码存放在本地,你们可以把二维码放在程序目录下)。


package com.nbt.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class BuildQRCode {

    /**
     * 二维码存放地址
     */
    private   String imgPath ;

    /**
     * 二维码内容
     */
    private  String content ;

    /**
     * 无参构造方法
     */
    public BuildQRCode() {

    }

    /**
     * 有参构造方法
     * @param imgPath
     * @param content
     */
    public BuildQRCode(String imgPath, String content) {
        super();
        this.imgPath = imgPath;
        this.content = content;
    }

    public void initParam(BuildQRCode bqrc){

    //  生成临时订单号和有效时间
        Calendar ca = Calendar.getInstance();
        Date date  = ca.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
        System.out.println(sdf.format(date));
        String orderNo = sdf.format(date)+(int)Math.random()*1000;//生成订单号
        //生成有效时间五分钟
        ca.add(Calendar.MINUTE,5);
        System.out.println(sdf.format(ca.getTime()));
        String timeout = sdf.format(ca.getTime());

    //对参数进行初始化
        bqrc.setImgPath( "D:/test/Michael_QRCode.png");
        bqrc.setContent( "http://localhost:8080/nbt-qrcode/qr/toPay.do?orderNo="+orderNo+"&timeout="+timeout);
    }

    public static void main(String[] args) {
        BuildQRCode qc = new BuildQRCode();
        qc.initParam(qc);//设置参数
        QRCode.encoderQRCode(qc);
    }

    public  String getImgPath() {
        return imgPath;
    }

    public  void setImgPath(String imgPath) {
        this.imgPath = imgPath;
    }

    public  String getContent() {
        return content;
    }

    public  void setContent(String content) {
        this.content = content;
    }
}

总结:

到此这篇关于SpringMVC+Mybatis二维码实现多平台付款(附源码)的文章就介绍到这了,更多相关SpringMVC Mybatis二维码付款内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)

    1. 什么是支付宝接口(沙箱环境)? 记录时间:2020年10月15日3:55 现如今,手机支付已相当普遍,而作为开发人员应该对手机支付操作有所了解.而支付宝接口是支付宝提供的一个接口,用来对接软件应用程序在进行金钱交易使用.然后对于编程爱好者而言,想学习这一点就有点难,因为要想使用支付宝接口,必须前提是使用软件应用程序,软件应用程序需要向支付宝申请,提交一系列资料,这一点是实现不了的.这就对开发者增加了一定的难度,因为产品没有上线,然后需要对接支付宝接口就是很大的问题,所以出现了沙箱环境,具有

  • SpringBoot生成二维码的实现

    效果图 步骤 maven依赖 <!-- 生成二维码--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency> 工具类 package com.bennyrhys.mall.util; import com.goog

  • SpringMVC+Mybatis二维码实现多平台付款(附源码)

    目录 整体思路: 基本流程和思路: 1.整体架构: 2.配置编译的文件目录 3.pom.xml 4.二维码相关属性(Model) 5.二维码生成代码 6.Controller相关代码 7.二维码相关参数初始化 总结: 今天,这篇文章就带你们简单实现多平台支付! 整体思路: 实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis框架,maven管理.其实如果支付,不需要mybatis也能实现,代码和本人见解还需大神

  • Spring Boot + Thymeleaf + Activiti 快速开发平台项目 附源码

    项目介绍 基于Layui的后台管理系统模板,扩展Layui原生UI样式,整合第三方开源组件,提供便捷快速的开发方式,延续LayuiAdmin的设计风格,持续完善的样式与组件的维护,基于异步Ajax的菜单构建,相对完善的多标签页,单标签页的共存,为使用者提供相对完善的开发方案,只为成为更好的轮子,项目不定时更新,建议 Star watch 一份 如果你需要无组件整合 与 示例页面 的基础框架,请前往 Pear Admin Layui 基础版本 项目结构 Pear Admin Layui │ ├─a

  • 最优雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企业级应用(附源码)

    这里使用 Maven 项目管理工具构建项目 初始化项目 打开 Intellij IDEA,点击 Create New Project 选择 Maven 构建项目 选择 JDK 版本 选择 maven-archetype-webapp 模板(Java Web 项目) 填写项目在 Maven 仓库中的坐标(在 Maven 仓库中根据这个坐标才能找到该项目) 选择 Maven 路径 选择 Maven 配置文件路径 选择 Maven 本地仓库路径 填写项目名 选择工作目录 创建目录 在 src > ma

  • 快速搭建Spring Boot+MyBatis的项目IDEA(附源码下载)

    如何快速构建一个Spring Boot的项目工具 ideaJDK版本 1.8Spring Boot 版本 1.5.9环境搭建实现:最基础前端可以访问到数据库内的内容 开始 1.IDEA 内部新建一个项目,项目类型选择Spring Initializr,Project SDK选择适合你当前环境的版本,这里我选择的是1.8(Spring Boot 2.0以上的版本,JDK选择请选择1.8即以上版本),构建服务选择默认就好,点击Next 2.填写Group和Artifact(此处我使用的是默认,请根据

  • jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)

    今天我们继续内容滑动切换效果的第二部分讲解.如今我们的web开发都要适应移动设备,就是说我们的web页面要在移动设备如手机端也能正常访问,所以我将第一部分的基本切换效果做了加强,增加了响应式和触控滑动效果. 效果展示    源码下载 本文是hwSlider-内容滑动切换效果的第二部分,演示DEMO都是基于第一部分内容的基础上的,所以,如果您还没阅读过第一部分的话,请先移步参阅:基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一) 响应式 什么是响应式设计,这里我就不描述了.

  • 基于jQuery实现交互体验社会化分享代码附源码下载

    先给大家展示下效果图,看看是不是亲想要的效果,如果满足您的要求请继续往下阅读. 效果展示       源码下载 基于jQuery交互体验社会化分享代码.这是一款鼠标点击分享按钮向右滑出腾讯微博,新浪微博,QQ空间,豆瓣,微信,二维码分享等分享平台. html代码: <div style="text-align:center;font:normal 14px/24px 'MicroSoft YaHei';clear:both;width:160px;margin:0 auto;"&

  • ssm+vue前后端分离框架整合实现(附源码)

    前言 本文针对Spring+SpringMVC+Mybatis后台开发框架(基于maven构建)与vue前端框架(基于webpack构建)的项目整合进行介绍,对于ssm和vue单独项目的搭建不作为本文的重点,而着重介绍两者之间交互的要点. SSM 项目结构 说明 项目有service和web两个子项目组成,web依赖于service,其中web主要是control层内容,service则对应service层,而MyBatis内容放在了service项目中,spring配置文件放在了web项目中.

  • 10分钟学会使用python实现人脸识别(附源码)

    前言 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确性比较高的一种. 一.首先 梳理一下实现人脸识别需要进行的步骤: 流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花的时间. 既然用的是python,那自然少不了包的使用了,在

  • 使用Python实现简单的人脸识别功能(附源码)

    目录 前言 一.首先 二.接下来 1.对照人脸获取 2. 通过算法建立对照模型 3.识别 前言 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确性比较高的一种. 一.首先 梳理一下实现人脸识别需要进行的步骤: 流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比

  • C# 实现俄罗斯方块(附源码)

    概述 俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫发明的休闲游戏,帕基特诺夫爱玩拼图,从拼图游戏里得到灵感,设计出了俄罗斯方块.由于上手简单.老少皆宜,从而家喻户晓,风靡世界.本文简述如何通过C#来实现俄罗斯方块,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 BackgroundWorker 在单独的线程上执行操作(主要执行比较耗时的操作). Action .NetFramework自带的一个委托方法. TableLayoutPanel  表示一个面板,它可以在一个由

随机推荐