瀏覽代碼

付款码,收款码

lianghanqiang 4 年之前
父節點
當前提交
b80f44c1c1

+ 6 - 0
pom.xml

@@ -236,6 +236,12 @@
             <artifactId>esdk-obs-java</artifactId>
             <version>3.20.6.2</version>
         </dependency>
+        <!--  PKCS7Padding -->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15to18</artifactId>
+            <version>1.68</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 0
src/main/java/org/springblade/Application.java

@@ -20,6 +20,7 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.launch.BladeApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
@@ -32,6 +33,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableAsync
 @EnableConfigurationProperties
 @SpringBootApplication
+@EnableCaching
 public class Application {
 
 	public static void main(String[] args) {

+ 3 - 0
src/main/java/org/springblade/common/cache/CacheNames.java

@@ -25,4 +25,7 @@ public interface CacheNames {
 
 	String CAPTCHA_KEY = "blade:auth::blade:captcha:";
 
+	/* 支付模块  */
+	String PAYMENT = "payment";
+
 }

+ 40 - 0
src/main/java/org/springblade/common/cache/PaymentCache.java

@@ -0,0 +1,40 @@
+package org.springblade.common.cache;
+
+
+import com.alibaba.fastjson.JSON;
+import org.springblade.core.cache.utils.CacheUtil;
+
+/**
+ * @author: lianghanqiang
+ * @description: 支付模块缓存
+ * @since: 7/30/21 -- 9:37 AM
+ */
+public class PaymentCache {
+
+	public static final String QR_CODE = "qrcode:";
+	public static final String BAR_CODE = "barcode:";
+	public static final String PAY_INFO = "payinfo:";
+
+
+
+	/**
+	 * MD5串获取二维码信息,key:MD5 ,value: JSON
+	 *
+	 * @param md5Str MD5
+	 * @return T 信息实体
+	 */
+	public static <T> T getCodeInfo(String md5Str,Class<T> clazz) {
+		String content = (String) CacheUtil.get(CacheNames.PAYMENT,":"+PAY_INFO,md5Str);
+		return JSON.parseObject(content,clazz);
+	}
+
+	/**
+	 * MD5 缓存 二维码信息 key:MD5 ,value: JSON
+	 *
+	 * @param md5Str MD5
+	 * @return
+	 */
+	public static void putCodeInfp(String md5Str,Object object) {
+		CacheUtil.put(CacheNames.PAYMENT,":"+PAY_INFO,md5Str,JSON.toJSONString(object));
+	}
+}

+ 6 - 1
src/main/java/org/springblade/modules/QRCode/controller/QRCodeController.java

@@ -2,6 +2,7 @@ package org.springblade.modules.QRCode.controller;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springblade.common.cache.PaymentCache;
 import org.springblade.core.tool.api.R;
 import org.springblade.modules.QRCode.entity.PayCodeVO;
 import org.springblade.modules.QRCode.entity.SingleCodeDto;
@@ -27,16 +28,20 @@ public class QRCodeController {
 	@Autowired
 	private QRCodeService qrCodeService;
 
+
+
 	@ApiOperation("获取商家/个人收款二维码")
 	@PostMapping("fetch")
 	public R fetchQRCode(@RequestBody @Validated SingleCodeDto singleCodeDto){
+		PaymentCache.putCodeInfp(qrCodeService.encodeMD5(singleCodeDto),singleCodeDto);
 		return R.data(qrCodeService.fetchQRCode(singleCodeDto,singleCodeDto.getLogo()));
 	}
 
 	@ApiOperation("获取商家/个人收款付款码")
 	@PostMapping("payCode")
 	public R payCode(@RequestBody @Validated SingleCodeDto singleCodeDto){
-		String bar = "";
+		PaymentCache.putCodeInfp(qrCodeService.encodeMD5(singleCodeDto),singleCodeDto);
+		String bar = qrCodeService.fetchBar(singleCodeDto);
 		String code = qrCodeService.fetchQRCode(singleCodeDto,null);
 		return R.data(PayCodeVO.builder().code(code).bar(bar).build());
 	}

+ 4 - 0
src/main/java/org/springblade/modules/QRCode/entity/SingleCodeDto.java

@@ -26,4 +26,8 @@ public class SingleCodeDto {
 	@NotBlank
 	@ApiModelProperty(value = "商家logo或个人头像",required = true)
 	String logo;
+
+	@NotBlank
+	@ApiModelProperty(value = "类型:收款码:Charge_Code,付款码Payment_Code",required = true)
+	String type;
 }

+ 58 - 3
src/main/java/org/springblade/modules/QRCode/service/QRCodeService.java

@@ -1,22 +1,77 @@
 package org.springblade.modules.QRCode.service;
 
 
+import cn.hutool.crypto.digest.DigestAlgorithm;
+import cn.hutool.crypto.digest.Digester;
+import cn.hutool.crypto.symmetric.AES;
+import com.alibaba.fastjson.JSON;
+import org.springblade.common.cache.CacheNames;
+import org.springblade.common.cache.PaymentCache;
 import org.springblade.modules.QRCode.entity.SingleCodeDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springblade.modules.QRCode.utils.CodeUtils;
 
 
+
 /**
  * @author: lianghanqiang
- * @description:
+ * @description: 二维码服务层
  * @since: 7/29/21 -- 10:35 AM
  */
 @Service
 public class QRCodeService {
+	
+	@Autowired
+	private CacheManager cacheManager;
+
+	private static AES aes;
+	private static Digester md5;
+
+	public static final String QR_CODE = PaymentCache.QR_CODE;
+	public static final String BAR_CODE = PaymentCache.BAR_CODE;
+
+	private static final String PRIVATE_KEY = "DYgj5EIMVrj2W9xN";
+	private static final String IV = "eLPO4EIMVrj2W9xN";
 
-	@Cacheable(value = "QRCode",key = "#content.id")
+	 static  {
+		 aes = new AES("CBC", "PKCS7Padding",
+			 PRIVATE_KEY.getBytes(),
+			 // iv加盐,按照实际需求添加
+			 IV.getBytes());
+		  md5 = new Digester(DigestAlgorithm.MD5);
+	}
+
+	@Cacheable(cacheNames = {CacheNames.PAYMENT},key ="#root.target.QR_CODE + #content.id",unless = "#content.type!='Charge_Code'")
 	public String fetchQRCode(SingleCodeDto content, String logo){
-		return CodeUtils.createCode(logo,content);
+		return CodeUtils.createCode(logo,md5.digestHex(JSON.toJSONString(content)));
+	}
+
+	@Cacheable(cacheNames = {CacheNames.PAYMENT},key ="#root.target.BAR_CODE + #content.id",unless = "#content.type!='Charge_Code'")
+	public String fetchBar(SingleCodeDto content){
+		return CodeUtils.createBar(md5.digestHex(JSON.toJSONString(content)));
+	}
+
+	public String enCode(Object content){
+		return aes.encryptHex(JSON.toJSONString(content));
+	}
+
+	public String encodeMD5(Object content){
+		return md5.digestHex(JSON.toJSONString(content));
+	}
+
+	public <T> T  deCode(String content,Class<T> clazz) {
+		return JSON.parseObject(aes.decryptStr(content), clazz);
+	}
+
+	public static void main(String[] args) {
+		System.out.println(PRIVATE_KEY.getBytes().length);
+		String content = "123465asdf";
+		String encryptHex = aes.encryptHex(content);
+		String decryptStr = aes.decryptStr(encryptHex);
+		System.out.println(encryptHex);
+		System.out.println(decryptStr);
 	}
 }

+ 12 - 71
src/main/java/org/springblade/modules/QRCode/utils/CodeUtils.java

@@ -5,7 +5,9 @@ import com.alibaba.fastjson.JSON;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.EncodeHintType;
 import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
+import com.google.zxing.oned.Code128Writer;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 import lombok.extern.slf4j.Slf4j;
@@ -34,7 +36,7 @@ public class CodeUtils {
 	 * @param logoUrl logo图片路径
 	 * @param content 二维码内容
 	 * */
-	public static String createCode(String logoUrl,Object content){
+	public static String createCode(String logoUrl,String content){
 		// 二维码大小
 		int width = 500, height = 500;
 		// 二维码参数
@@ -55,7 +57,7 @@ public class CodeUtils {
 		BitMatrix bm = null;
 
 		try {
-			bm = writer.encode(JSON.toJSONString(content), BarcodeFormat.QR_CODE, style.getWidth(), style.getHeight(), hints);
+			bm = writer.encode(content, BarcodeFormat.QR_CODE, style.getWidth(), style.getHeight(), hints);
 		} catch (WriterException e) {
 			log.error("二维码生成异常:"+e.getMessage());
 		}
@@ -118,20 +120,7 @@ public class CodeUtils {
 			qrcodeBuffImg.flush();
 		}
 
-
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
-		try {
-			ImageIO.write(qrcodeBuffImg, "png", baos);//写入流中
-		} catch (IOException e) {
-			log.error("二维码生成异常:"+e.getMessage());
-		}
-		byte[] bytes = baos.toByteArray();//转换成字节
-		BASE64Encoder encoder = new BASE64Encoder();
-		String png_base64 =  encoder.encodeBuffer(bytes).trim();//转换成base64串
-		png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除
-
-
-		return PRE_FIX+png_base64;
+		return toBase64(qrcodeBuffImg);
 	}
 
 
@@ -139,59 +128,13 @@ public class CodeUtils {
 	 * 	生成条形码
 	 * @param content 条形码内容
 	 * */
-	public static String createBar(Object content){
-		// 二维码大小
-		int width = 500, height = 500;
-		// 二维码参数
-		CodeStyle style = new CodeStyle();
-		style.setWidth(width);
-		style.setHeight(height);
-
-		Map<EncodeHintType, Object> hints = new HashMap<>();
-		//内容编码格式
-		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
-		// 指定纠错等级
-		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
-		//设置二维码边的空度,非负数
-		hints.put(EncodeHintType.MARGIN, 1);
-
-		// 生成二维码图片
-		QRCodeWriter writer = new QRCodeWriter();
-		BitMatrix bm = null;
-
-		try {
-			bm = writer.encode(JSON.toJSONString(content), BarcodeFormat.QR_CODE, style.getWidth(), style.getHeight(), hints);
-		} catch (WriterException e) {
-			log.error("二维码生成异常:"+e.getMessage());
-		}
-
-		int margin = style.getMargin();
-		int tempM = margin*2;
-		int[] rec = bm.getEnclosingRectangle();   //获取二维码图案的属性
-		int resWidth = rec[2] + tempM;
-		int resHeight = rec[3] + tempM;
-		BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); // 按照自定义边框生成新的BitMatrix
-		resMatrix.clear();
-		for (int i = margin; i < resWidth - margin; i++) {   //循环,将二维码图案绘制到新的bitMatrix中
-			for (int j = margin; j < resHeight - margin; j++){
-				if (bm.get(i - margin + rec[0], j - margin + rec[1])){
-					resMatrix.set(i, j);
-				}
-			}
-		}
-		bm = resMatrix;
-
-		int w = bm.getWidth();
-		int h = bm.getHeight();
-		BufferedImage qrcodeBuffImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
-
-		// 开始利用二维码数据创建Bitmap图片
-		for (int x = 0; x < w; x++) {
-			for (int y = 0; y < h; y++) {
-				qrcodeBuffImg.setRGB(x, y, bm.get(x, y) ? style.getCodeColor() : style.getBackgroundColor());
-			}
-		}
+	public static String createBar(String content){
+		BitMatrix bitMatrix = new Code128Writer().encode(content, BarcodeFormat.CODE_128, 300, 80, null);
+		BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
+		return toBase64(bufferedImage);
+	}
 
+	private static String toBase64(BufferedImage qrcodeBuffImg){
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
 		try {
 			ImageIO.write(qrcodeBuffImg, "png", baos);//写入流中
@@ -201,9 +144,7 @@ public class CodeUtils {
 		byte[] bytes = baos.toByteArray();//转换成字节
 		BASE64Encoder encoder = new BASE64Encoder();
 		String png_base64 =  encoder.encodeBuffer(bytes).trim();//转换成base64串
-		png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除
-
-
+		png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");
 		return PRE_FIX+png_base64;
 	}