一,本文目的:
为了研究对支付宝和微信支付的统一路口管理(一张二维码同时支持微信和支付宝扫码支付);本文不将对支付宝和微信的支付开发进行讲解,主要是二维码的生成和解析;
步骤:
1,准备jar包,在java中用到了两个jar包;一个用于生成二维码,一个用户解析二维码;
a,生成二维码jar包路径:http:// www.swetake.com/qr/java/qr_java.html(注意:下载qrcode_java0.50beta10.tar.gz,解压后在lib目录下的qrcode.jar即为用于生成二维码的库)
b,解析二维码jar包路径:http://sourceforge.jp/projects/qrcode/releases/(注意:解压qrcode包后lib目录下的qrcode.jar包,把其重命名,避免与生成二维码jar包冲突即可)
2,java代码
a,TwoDimensionCodeImage类:二维码图片对象
- 包 com.ppfuns.aaa.entity;
- import jp.sourceforge.qrcode.data.QRCodeImage;
- import java.awt.image.BufferedImage;
- / **
- *创建IntelliJ IDEA。
- *用户:jony
- *日期:2017/9/26
- *时间:9:53
- *要更改此模板,请使用File | 设置| 文件模板
- * /
- public class TwoDimensionCodeImage 实现 QRCodeImage {
- BufferedImage bufImg;
- public TwoDimensionCodeImage(BufferedImage bufImg){
- 这个.bufImg = bufImg;
- }
- @覆盖
- public int getHeight(){
- return bufImg.getHeight();
- }
- @覆盖
- public int getPixel(int x, int y){
- return bufImg.getRGB(x,y);
- }
- @覆盖
- public int getWidth(){
- return bufImg.getWidth();
- }
- }
B,CommonUtils类:二维码操作核心类
- 包 com.ppfuns.aaa.common;
- import com.ppfuns.aaa.entity.TwoDimensionCodeImage;
- import com.swetake.util.Qrcode;
- import jp.sourceforge.qrcode.QRCodeDecoder;
- import jp.sourceforge.qrcode.exception.DecodingFailedException;
- import javax.imageio.ImageIO;
- import java.awt。*;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- / **
- *创建IntelliJ IDEA。
- *用户:简德群
- *日期:2017/9/26
- *时间:9:54
- *要更改此模板,请使用File | 设置| 文件模板
- * /
- public class CommonUtils {
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param imgPath图片路径
- * /
- public static void encoderQRCode(String content,String imgPath){
- encoderQRCode(content,imgPath, “png” , 7 );
- }
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param输出输出流
- * /
- public static void encoderQRCode(String content,OutputStream output){
- encoderQRCode(内容,输出, “png” , 7 );
- }
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param imgPath图片路径
- * @param imgType图片类型
- * /
- public static void encoderQRCode(String content,String imgPath,String imgType){
- encoderQRCode(content,imgPath,imgType, 7 );
- }
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param输出输出流
- * @param imgType图片类型
- * /
- public static void encoderQRCode(String content,OutputStream output,String imgType){
- encoderQRCode(content,output,imgType, 7 );
- }
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param imgPath图片路径
- * @param imgType图片类型
- * @param size二维码尺寸
- * /
- public static void encoderQRCode(String content,String imgPath,String imgType, int size){
- 尝试 {
- BufferedImage bufImg = qRCodeCommon(content,imgType,size);
- File imgFile = new File(imgPath);
- //生成二维码QRCode图片
- ImageIO.write(bufImg,imgType,imgFile);
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- / **
- *生成二维码(QRCode)图片
- * @param content存储内容
- * @param输出输出流
- * @param imgType图片类型
- * @param size二维码尺寸
- * /
- public static void encoderQRCode(String content,OutputStream output,String imgType, int size){
- 尝试 {
- BufferedImage bufImg = qRCodeCommon(content,imgType,size);
- //生成二维码QRCode图片
- ImageIO.write(bufImg,imgType,output);
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- / **
- *生成二维码(QRCode)图片的公共方法
- * @param content存储内容
- * @param imgType图片类型
- * @param size二维码尺寸
- * @返回
- * /
- private static BufferedImage qRCodeCommon(String content,String imgType, int size){
- BufferedImage bufImg = null ;
- 尝试 {
- Qrcode qrcodeHandler = new Qrcode();
- //设置二维码排错率,可选L(7%),M(15%),Q(25%),H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
- qrcodeHandler.setQrcodeErrorCorrect('M' );
- qrcodeHandler.setQrcodeEncodeMode('B' );
- //设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
- qrcodeHandler.setQrcodeVersion(大小);
- //获得内容的字节数组,设置编码格式
- byte [] contentBytes = content.getBytes(“utf-8” );
- //图片尺寸
- int imgSize = 67 + 12 *(size- 1 );
- bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB);
- Graphics2D gs = bufImg.createGraphics();
- //设置背景颜色
- gs.setBackground(Color.WHITE);
- gs.clearRect(0 , 0 ,imgSize,imgSize);
- //设定图像颜色>黑色
- gs.setColor(Color.BLACK);
- //设置偏移量,不设置可能导致解析出错
- int pixoff = 2 ;
- //输出内容>二维码
- if (contentBytes.length> 0 && contentBytes.length < 800 ){
- 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 {
- 抛出新 的异常(“QRCode的内容的字节长度=” + contentBytes.length + “不是在[0,800]。” );
- }
- gs.dispose();
- bufImg.flush();
- } catch (Exception e){
- e.printStackTrace();
- }
- 返回 bufImg;
- }
- / **
- *解析二维码(QRCode)
- * @param imgPath图片路径
- * @返回
- * /
- public static String decoderQRCode(String imgPath){
- // QRCode二维码图片的文件
- 文件imageFile = new File(imgPath);
- BufferedImage bufImg = null ;
- String content = null ;
- 尝试 {
- bufImg = ImageIO.read(imageFile);
- QRCodeDecoder decoder = new QRCodeDecoder();
- content = new String(decode.decode(new TwoDimensionCodeImage(bufImg)), “utf-8” );
- } catch (IOException e){
- System.out.println(“Error:” + e.getMessage());
- e.printStackTrace();
- } catch (DecodingFailedException dfe){
- System.out.println(“Error:” + dfe.getMessage());
- dfe.printStackTrace();
- }
- 返回 内容;
- }
- / **
- *解析二维码(QRCode)
- * @param input输入流
- * @返回
- * /
- public String decoderQRCode(InputStream input){
- BufferedImage bufImg = null ;
- String content = null ;
- 尝试 {
- bufImg = ImageIO.read(input);
- QRCodeDecoder decoder = new QRCodeDecoder();
- content = new String(decode.decode(new TwoDimensionCodeImage(bufImg)), “utf-8” );
- } catch (IOException e){
- System.out.println(“Error:” + e.getMessage());
- e.printStackTrace();
- } catch (DecodingFailedException dfe){
- System.out.println(“Error:” + dfe.getMessage());
- dfe.printStackTrace();
- }
- 返回 内容;
- }
- public static void main(String [] args){
- String content = “https://k.87.re/2014/07/150724ix4.jpg” ;
- //图片要求是已存在的二维码图片,这里的生成二维码只是对二维码图片中内容的更新
- encoderQRCode(content,“C:\\ Users \\ lenovo \\ Desktop \\ 121.jpg” );
- String path = “C:\\ Users \\ lenovo \\ Desktop \\ 121.jpg” ;
- String content1 = decodeQRCode(path);
- 的System.out.println(内容1);
- //
- }
- }