Jelajahi Sumber

缓存管理

lianghanqiang 4 tahun lalu
induk
melakukan
006ebbc2e4

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

@@ -2,8 +2,12 @@ package org.springblade.common.cache;
 
 
 import com.alibaba.fastjson.JSON;
+import org.springblade.common.enums.ResCode;
+import org.springblade.common.exception.BizException;
+import org.springblade.common.utils.RSASecretUtil;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.modules.ldt.billrecord.entity.BillRecord;
 import org.springframework.data.redis.core.RedisTemplate;
 import java.util.concurrent.TimeUnit;
 
@@ -18,6 +22,9 @@ public class PaymentCache {
 	public static final String BAR_CODE = "barcode:";
 	public static final String PAY_INFO = "payinfo:";
 
+	private static final String PRIVATEKEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVj9vx7e6z+5kD43EnxZvfIZ299SwYxYzjAgIfweu/Ot73mRzAzVbbCsbUuWGYgqpN9otzjHze3hGOys61SA8hCUhg4yuzkZu/C7F5pgN9AkUOhcS2qgOyuwlWnxn8QyyyZGnIBH1Juua0UUi6oRKK7geOmGViXuoYUGoX1rLv2TQLVSOe1vf377BmPmtjForS8OgGWJ1bO5zo8V6yGGV2g8dj2A1Q+xbUKPVsU+0xCVSrJbLWgJx7apKkX+E9xoh8J01T3hE6/m1SSQePcDZsjOoy93CeCLNY0tmw5F93gpwlO4L+oxGVQHWtku6dHW8TVP7t9DAW+UcDwsaVaNk5AgMBAAECggEAH52/ow7nLQj8ucO0wfGWF78ld2iCn+Hy/HIKPOhji5NIWxL07xT5TWijy4g8x16n3b9Gj3CdXQeYspTQyaWn/RXXRRQAwv7+643vQIYFqsF2E7HXeb3K9ldvi+4qMheJNVTgv7WjPpjR+EBOnZU7ND9JPa2dkQP7fJRTOSLbxLPTa3pIBQqsuNZyPI3h3XxIyXya24ncenVLRJNsYUgA63KOS79sft3kqPuEVDOWrenvAEeby4bCbx31Z3pPlXiA/5O4vDQrb3GxCj6qKs3CJ9mqVItQg0W1GJALC9NMwOUVgv5CNKGfhwByfgit2/ODGceRkuirnj9u9VXq1cUVYQKBgQDt2EOWUFDQg8pFj6yzi6nkhq6k/DYTOXi9jX7HEg6YPTb0ah5DOvL0/q9zFvDNZyNbmJ0KQye3Ep9teTkTQ3S63T6AsXuMWa7hy5gUAstRZIcKbwIxdBQHb7gNSX9sugrr5uuYCXNMo29uPcVvxsoPSe+VWvqSDafGfgezCGcvXQKBgQCg+nTKVcE3K1tH0lElk/m1dFTOzsTai0b2FowcnqnukaxvqreavS4rY7feNqQBDL3uiSdsdnlFY3bpMrIvqKSwT/5D+CUafRAePvak87fV9c548pqlYCrX69GFMMQHBputSRIkCiTwIrX8ainjt7yuhJH1E81VU0lZaGhmmT2fjQKBgB3jy7qcJUvPBCBxydZWeudJNbFuMK2Bz3aizYfe8Q6Ywss8eskgI2A+kXX5MBHgIEVmjHW5ssgDAx4S2eVd2NGS9EPgChK9QokFuPrqzvpPk9jv0mq8l7fHhm3FCspzJuQ2hOz6Yw8CiwJjqOg/Jy18sSsn381zAd6j//uz1qPRAoGAGV29/5ApxR7A4H1kqg46P/yXzIrKfEGMKgT9iRj7YAt2Z5Y4HlsHJnEtLQfhKgUu/KKCItY8X9G/kBmb+GSTpvDD+UPl3NmuK4XyaaW55y43ndlkwwB3X9TaDCnWCeFhsJmeES3ECk797EtyVF7EjZ94PG0lYvefzEXmhZxKGJUCgYBQqWaku95MIkn7KpJfWNEMgATPobFd2eQhONsEM+7THzuCqQxuSZPuFZGJMtBHwmHj13m5MUiL9rz1XJmybdA9UL5HOab2OSJGd2DanTLRz99bK5zo5rLIuZW2nRvscFH0H7lhS8sROykKz0yvyFO0Ww05vYQCD/Uvb/v2zZxTfQ==";
+	private static final String PUBLICKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlY/b8e3us/uZA+NxJ8Wb3yGdvfUsGMWM4wICH8Hrvzre95kcwM1W2wrG1LlhmIKqTfaLc4x83t4RjsrOtUgPIQlIYOMrs5GbvwuxeaYDfQJFDoXEtqoDsrsJVp8Z/EMssmRpyAR9SbrmtFFIuqESiu4HjphlYl7qGFBqF9ay79k0C1Ujntb39++wZj5rYxaK0vDoBlidWzuc6PFeshhldoPHY9gNUPsW1Cj1bFPtMQlUqyWy1oCce2qSpF/hPcaIfCdNU94ROv5tUkkHj3A2bIzqMvdwngizWNLZsORfd4KcJTuC/qMRlUB1rZLunR1vE1T+7fQwFvlHA8LGlWjZOQIDAQAB";
+
 	private static RedisTemplate redisTemplate;
 
 	static   {
@@ -55,4 +62,35 @@ public class PaymentCache {
 	public static void putCodeInfoWithEx(String md5Str,Object object,Long expireTime) {
 		redisTemplate.opsForValue().set(CacheNames.PAYMENT+":"+PAY_INFO+md5Str,JSON.toJSONString(object),expireTime, TimeUnit.SECONDS);
 	}
+
+
+	/**
+	 * 	缓存付款码订单信息
+	 * @param billRecord 订单信息
+	 * */
+	public static void putOrderInfo(BillRecord billRecord,String userId){
+		String text = JSON.toJSONString(billRecord);
+		String secret = null;
+		try {
+			secret = RSASecretUtil.privateEncrypt(text,RSASecretUtil.getPrivateKey(PRIVATEKEY));
+		} catch (Exception e) {
+			throw new BizException(ResCode.ENCODE_FAIL);
+		}
+		CacheUtil.put(CacheNames.PAYMENT, ":" + PAY_INFO, userId,secret);
+	}
+
+	/**
+	 * 	获取付款码订单信息
+	 * @param
+	 * */
+	public static BillRecord getOrderInfo(String userId ){
+		 String secret = (String) CacheUtil.get(CacheNames.PAYMENT, ":" + PAY_INFO, userId);
+		String text = null;
+		try {
+			text = RSASecretUtil.publicDecrypt(secret,RSASecretUtil.getPublicKey(PUBLICKEY));
+		} catch (Exception e) {
+			throw new BizException(ResCode.DECODE_FAIL);
+		}
+		return JSON.parseObject(text,BillRecord.class);
+	}
 }

+ 26 - 3
src/main/java/org/springblade/common/enums/ResCode.java

@@ -13,8 +13,7 @@ import lombok.Getter;
 public enum ResCode {
 
 
-	/*  通用   */
-	FAIL(500,"系统异常!"),
+
 
 
 	/*  支付模块  */
@@ -24,7 +23,31 @@ public enum ResCode {
 
 
 	/*	动态密码	*/
-	ID_NOT_NULL(521,"ID串不能为空");
+	ID_NOT_NULL(521,"ID串不能为空"),
+
+
+	/*	加密,解密模块	*/
+	ENCODE_FAIL(501,"加密失败"),
+	DECODE_FAIL(502,"解密失败"),
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	/*  通用   */
+	FAIL(500,"系统异常!");
+
 
 
 	Integer status;

+ 1 - 4
src/main/java/org/springblade/yeePay/util/OtpUtils.java → src/main/java/org/springblade/common/utils/OtpUtils.java

@@ -1,11 +1,8 @@
-package org.springblade.yeePay.util;
+package org.springblade.common.utils;
 
-import cn.hutool.core.codec.Base32;
 import cn.hutool.core.lang.Assert;
 import org.springblade.common.enums.ResCode;
 import org.springblade.common.exception.BizException;
-import org.springblade.core.tool.utils.StringUtil;
-
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import java.lang.reflect.UndeclaredThrowableException;

+ 141 - 0
src/main/java/org/springblade/common/utils/RSASecretUtil.java

@@ -0,0 +1,141 @@
+package org.springblade.common.utils;
+
+import cn.hutool.core.codec.Base64;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.crypto.Cipher;
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+
+/**
+ * @author: lianghanqiang
+ * @description: 秘钥工具
+ * @since: 8/2/21 -- 9:40 AM
+ */
+@Slf4j
+public class RSASecretUtil {
+
+	public static final String CHARSET = "UTF-8";
+	public static final String RSA_ALGORITHM = "RSA";
+
+	/**
+	 * 	生成秘钥对
+	 * */
+	private static void generateKeyPair() throws NoSuchAlgorithmException {
+		KeyPairGenerator keyTools = KeyPairGenerator.getInstance("RSA");
+		KeyPair keyPair = keyTools.generateKeyPair();
+		System.out.println(Base64.encode(keyPair.getPrivate().getEncoded()));
+		System.out.println(Base64.encode(keyPair.getPublic().getEncoded()));
+	}
+
+	/**
+	 * 得到公钥
+	 * @param publicKey 密钥字符串(经过base64编码)
+	 * @throws Exception
+	 */
+	public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
+		//通过X509编码的Key指令获得公钥对象
+		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
+		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decode(publicKey));
+		RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
+		return key;
+	}
+
+	/**
+	 * 得到私钥
+	 * @param privateKey 密钥字符串(经过base64编码)
+	 * @throws Exception
+	 */
+	public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
+		//通过PKCS#8编码的Key指令获得私钥对象
+		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
+		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
+		RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
+		return key;
+	}
+
+	/**
+	 * 公钥加密
+	 * @param data
+	 * @param publicKey
+	 * @return
+	 */
+	public static String publicEncrypt(String data, RSAPublicKey publicKey){
+		return encode(data, publicKey);
+	}
+
+
+
+	/**
+	 * 私钥解密
+	 * @param data
+	 * @param privateKey
+	 * @return
+	 */
+
+	public static String privateDecrypt(String data, RSAPrivateKey privateKey){
+		return decode(data,privateKey);
+	}
+
+	/**
+	 * 私钥加密
+	 * @param data
+	 * @param privateKey
+	 * @return
+	 */
+
+	public static String privateEncrypt(String data, RSAPrivateKey privateKey){
+		return encode(data, privateKey);
+	}
+
+	/**
+	 * 公钥解密
+	 * @param data
+	 * @param publicKey
+	 * @return
+	 */
+
+	public static String publicDecrypt(String data, RSAPublicKey publicKey){
+		return decode(data, publicKey);
+	}
+
+
+
+	private static String decode(String data, Key key ) {
+		try{
+			Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
+			cipher.init(Cipher.DECRYPT_MODE, key);
+			return new String(cipher.doFinal(Base64.decode(data)),CHARSET);
+		}catch(Exception e){
+			throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);
+		}
+	}
+
+
+	private static String encode(String data, Key key) {
+		try{
+			Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
+			cipher.init(Cipher.ENCRYPT_MODE, key);
+			return Base64.encode(cipher.doFinal(data.getBytes()));
+		}catch(Exception e){
+			throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);
+		}
+	}
+
+
+	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
+		String PRIVATEKEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVj9vx7e6z+5kD43EnxZvfIZ299SwYxYzjAgIfweu/Ot73mRzAzVbbCsbUuWGYgqpN9otzjHze3hGOys61SA8hCUhg4yuzkZu/C7F5pgN9AkUOhcS2qgOyuwlWnxn8QyyyZGnIBH1Juua0UUi6oRKK7geOmGViXuoYUGoX1rLv2TQLVSOe1vf377BmPmtjForS8OgGWJ1bO5zo8V6yGGV2g8dj2A1Q+xbUKPVsU+0xCVSrJbLWgJx7apKkX+E9xoh8J01T3hE6/m1SSQePcDZsjOoy93CeCLNY0tmw5F93gpwlO4L+oxGVQHWtku6dHW8TVP7t9DAW+UcDwsaVaNk5AgMBAAECggEAH52/ow7nLQj8ucO0wfGWF78ld2iCn+Hy/HIKPOhji5NIWxL07xT5TWijy4g8x16n3b9Gj3CdXQeYspTQyaWn/RXXRRQAwv7+643vQIYFqsF2E7HXeb3K9ldvi+4qMheJNVTgv7WjPpjR+EBOnZU7ND9JPa2dkQP7fJRTOSLbxLPTa3pIBQqsuNZyPI3h3XxIyXya24ncenVLRJNsYUgA63KOS79sft3kqPuEVDOWrenvAEeby4bCbx31Z3pPlXiA/5O4vDQrb3GxCj6qKs3CJ9mqVItQg0W1GJALC9NMwOUVgv5CNKGfhwByfgit2/ODGceRkuirnj9u9VXq1cUVYQKBgQDt2EOWUFDQg8pFj6yzi6nkhq6k/DYTOXi9jX7HEg6YPTb0ah5DOvL0/q9zFvDNZyNbmJ0KQye3Ep9teTkTQ3S63T6AsXuMWa7hy5gUAstRZIcKbwIxdBQHb7gNSX9sugrr5uuYCXNMo29uPcVvxsoPSe+VWvqSDafGfgezCGcvXQKBgQCg+nTKVcE3K1tH0lElk/m1dFTOzsTai0b2FowcnqnukaxvqreavS4rY7feNqQBDL3uiSdsdnlFY3bpMrIvqKSwT/5D+CUafRAePvak87fV9c548pqlYCrX69GFMMQHBputSRIkCiTwIrX8ainjt7yuhJH1E81VU0lZaGhmmT2fjQKBgB3jy7qcJUvPBCBxydZWeudJNbFuMK2Bz3aizYfe8Q6Ywss8eskgI2A+kXX5MBHgIEVmjHW5ssgDAx4S2eVd2NGS9EPgChK9QokFuPrqzvpPk9jv0mq8l7fHhm3FCspzJuQ2hOz6Yw8CiwJjqOg/Jy18sSsn381zAd6j//uz1qPRAoGAGV29/5ApxR7A4H1kqg46P/yXzIrKfEGMKgT9iRj7YAt2Z5Y4HlsHJnEtLQfhKgUu/KKCItY8X9G/kBmb+GSTpvDD+UPl3NmuK4XyaaW55y43ndlkwwB3X9TaDCnWCeFhsJmeES3ECk797EtyVF7EjZ94PG0lYvefzEXmhZxKGJUCgYBQqWaku95MIkn7KpJfWNEMgATPobFd2eQhONsEM+7THzuCqQxuSZPuFZGJMtBHwmHj13m5MUiL9rz1XJmybdA9UL5HOab2OSJGd2DanTLRz99bK5zo5rLIuZW2nRvscFH0H7lhS8sROykKz0yvyFO0Ww05vYQCD/Uvb/v2zZxTfQ==";
+		String PUBLICKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlY/b8e3us/uZA+NxJ8Wb3yGdvfUsGMWM4wICH8Hrvzre95kcwM1W2wrG1LlhmIKqTfaLc4x83t4RjsrOtUgPIQlIYOMrs5GbvwuxeaYDfQJFDoXEtqoDsrsJVp8Z/EMssmRpyAR9SbrmtFFIuqESiu4HjphlYl7qGFBqF9ay79k0C1Ujntb39++wZj5rYxaK0vDoBlidWzuc6PFeshhldoPHY9gNUPsW1Cj1bFPtMQlUqyWy1oCce2qSpF/hPcaIfCdNU94ROv5tUkkHj3A2bIzqMvdwngizWNLZsORfd4KcJTuC/qMRlUB1rZLunR1vE1T+7fQwFvlHA8LGlWjZOQIDAQAB";
+		RSAPrivateKey privateKey = getPrivateKey(PRIVATEKEY);
+		RSAPublicKey publicKey = getPublicKey(PUBLICKEY);
+		String text = "123456789";
+		String secret = privateEncrypt(text,privateKey);
+		System.out.println(secret);
+		System.out.println(publicDecrypt(secret,publicKey));
+	}
+}

+ 0 - 6
src/main/java/org/springblade/modules/payment/controller/PaymentController.java

@@ -10,7 +10,6 @@ import org.springblade.core.tool.api.R;
 import org.springblade.modules.payment.entity.PayParam;
 import org.springblade.modules.payment.plugin.Payment;
 import org.springblade.modules.payment.plugin.PaymentBuilder;
-import org.springblade.yeePay.util.OtpUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -62,10 +61,5 @@ public class PaymentController {
 	}
 
 
-	@GetMapping("/fetchCode")
-	@ApiOperation("获取动态密码")
-	public R fetchCode(String id){
-		return R.data(OtpUtils.generateMyTOTP(id));
-	}
 
 }

+ 0 - 35
src/main/java/org/springblade/yeePay/util/SecretUtil.java

@@ -1,35 +0,0 @@
-package org.springblade.yeePay.util;
-
-import cn.hutool.core.codec.Base64;
-import cn.hutool.crypto.SecureUtil;
-import cn.hutool.crypto.digest.HMac;
-
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-
-/**
- * @author: lianghanqiang
- * @description: 秘钥工具
- * @since: 8/2/21 -- 9:40 AM
- */
-public class SecretUtil {
-
-
-	/**
-	 * 	生成秘钥对
-	 * */
-	private static void generateKeyPair() throws NoSuchAlgorithmException {
-		KeyPairGenerator keyTools = KeyPairGenerator.getInstance("RSA");
-		KeyPair keyPair = keyTools.generateKeyPair();
-		System.out.println(Base64.encode(keyPair.getPrivate().getEncoded()));
-		System.out.println(Base64.encode(keyPair.getPublic().getEncoded()));
-	}
-
-
-	public static void main(String[] args) {
-		HMac hMac = SecureUtil.hmacSha1();
-		System.out.println(hMac.digestHex(new Date().getTime() + ""));
-	}
-}