支付模块-下单接口
This commit is contained in:
@ -0,0 +1,50 @@
|
||||
package com.fastbee.common.utils.pay;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Base64;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.spec.GCMParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* @author xy-peng
|
||||
*/
|
||||
public class AesUtil {
|
||||
|
||||
private static final String TRANSFORMATION = "AES/GCM/NoPadding";
|
||||
|
||||
private static final int KEY_LENGTH_BYTE = 32;
|
||||
private static final int TAG_LENGTH_BIT = 128;
|
||||
|
||||
private final byte[] aesKey;
|
||||
|
||||
public AesUtil(byte[] key) {
|
||||
if (key.length != KEY_LENGTH_BYTE) {
|
||||
throw new IllegalArgumentException("无效的ApiV3Key,长度必须为32个字节");
|
||||
}
|
||||
this.aesKey = key;
|
||||
}
|
||||
|
||||
public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
|
||||
throws GeneralSecurityException {
|
||||
try {
|
||||
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
|
||||
GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
|
||||
|
||||
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
|
||||
cipher.init(Cipher.DECRYPT_MODE, key, spec);
|
||||
cipher.updateAAD(associatedData);
|
||||
return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8);
|
||||
|
||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
|
||||
throw new IllegalStateException(e);
|
||||
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAAj3TYp1jmmC1
|
||||
Lc6H3aFVm1tiSkDGfQlGg6y87FVUUd1m56FVB4hXBF3/KXK5/rICognPP5l8Uu7o
|
||||
fk9+i1nuRo3kXcJsaC+zq1hbIGb06JClB+xS436HOL3WNa9EtqVbLFSeEBLEq0qX
|
||||
BibiNkn5NoEAddfG3C1r3YFg2zt8xKmfV8b6TvqSBKEWVu7fHpF4oeaYqPil6nKJ
|
||||
Q6ZY5RBsm+AbkKzKjpdrYlWC6T0S7AZwzDjm63LANT4OZqi5OMB7Oy5NY1tTJdUW
|
||||
JXTkFGUWRiyy8/ecAz01p+Vx93y3NVbpM0L+67TF2iQ3Sr8/WMLGegV2cRzcrrl0
|
||||
IDzCiSCfAgMBAAECggEAUMkgpi3Ztqyff9t0CCox1Uj2XBaNxnWZT3fbV+m/xShk
|
||||
lQVkFdiDfskxm0gfIy6MSxtOMUq7E1n5dwyd+co73ksFLE5enSoA2AGBvWWWq/il
|
||||
0ynQPtfExrQS+2u/AJQwYnn2aEKvAtxnF7/Y4FijKx3JjR4H2X2OBtI9uzjCgK2q
|
||||
hHEmRqM7rSAj/iq0TKe9JVg843cPa97MrYQ3bgRyiVtzEsN/LcAfS2ZgU6iPUG6f
|
||||
OQGh9fwQ7/lcmKgBW6lnN/2CVysSF0caVj7xvzT+7eyaK5VzuMVupACUUlst+9zg
|
||||
QSa+5BA6mnfa0DGpKjnRt6zhy6o0ct7I1R0eseadkQKBgQD1QBYeSQ3wkmXI0lAK
|
||||
rMWkcnU3T0Lf48tlr2PZocLsaWTlqFSQMUiqVb/WuC+DQ2JLWK4Jf8Agf+BCNRZK
|
||||
HB2cjOyUvMIq8PgFZm5Bi3OAfD6AVFaDxsNmQWxJykZZuEreOmYVAbWDVB06DUEl
|
||||
geVtPRewXGFlwyhPmEZ4pZUWywKBgQDIbL13FIF3xT5kHmH205fpPqVugUVjzWih
|
||||
hhrM+SA9178nU9lnUv+6glYNbr+23iIa1dvLePBSTn8qXLJyX5UbVuUhG010BjfS
|
||||
uBP3qqMs9BcVhQlEF5B349gnVcYKlmMuq25s9wlhwJfI8fnEjzTfBTqCLiu3DXZ8
|
||||
F/5Y5AeO/QKBgQCmlwqvNcaPRJJ5MEsIhUWXp9vxXxi5Bn4yK0ozGctTVWAhFA+l
|
||||
BqUqdybhjqlPi6UoMyu87hcuvE40CuWCH8kJfzxw6Csoihifam24fiZN/5dhCmje
|
||||
CFTQj94j3Y+eAC5y985BtLB8bdWQilJXTP3wDxCZTpcmTcODFZfA+hDkswKBgCqz
|
||||
mE5lrQvil19nZcHb5RLJyR9ZJXqVCgTX+J/ROEBU1iI/6CLueRO4rzLfdLM2cpe7
|
||||
FsAsPS+cD9XruA1MNg2EHv9FvOPKa1xW4dIzpd5vBvgLxySdzKbugWAoEzCwR+Nq
|
||||
nPVUUMhl6zDh9TAevsoBaCzSP3gZwzO/PO6dbsrVAoGBAK6weNT8OfvNyVQOLTp9
|
||||
6iTYT1eHnxQyWI7jxU64KYhect6KbdrhUYMMs3AcorU4QmzzAeIidNwVLTe0FBjw
|
||||
1hQhnoLA8LeLdjXkfeo0LzfRwVIBJUKdXv8BLtJVVgQmy2qTaHfGAldVEBGoz7j+
|
||||
gKivYhI5cYoUTpaSPpSODTM3
|
||||
-----END PRIVATE KEY-----
|
@ -0,0 +1,51 @@
|
||||
package com.fastbee.common.utils.pay;
|
||||
|
||||
import java.io.*;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
import java.util.Base64;
|
||||
|
||||
public class wxPayConfig {
|
||||
|
||||
|
||||
|
||||
// 获取商户私钥
|
||||
public static PrivateKey getPrivateKey(String privateKeyPath) {
|
||||
try {
|
||||
// 读取私钥文件内容
|
||||
String privateKeyContent = readFile(privateKeyPath);
|
||||
// 去除私钥文件中的头尾信息
|
||||
privateKeyContent = privateKeyContent.replace("-----BEGIN PRIVATE KEY-----", "")
|
||||
.replace("-----END PRIVATE KEY-----", "")
|
||||
.replaceAll("\\s+", "");
|
||||
// 使用Base64解码
|
||||
byte[] keyBytes = Base64.getDecoder().decode(privateKeyContent);
|
||||
// 通过PKCS#8EncodedKeySpec指定者来构造PrivateKey对象
|
||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
|
||||
// 获取RSA KeyFactory对象
|
||||
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
||||
// 从PKCS#8EncodedKeySpec指定者中构造出PrivateKey对象
|
||||
return keyFactory.generatePrivate(keySpec);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 读取文件内容为字符串
|
||||
private static String readFile(String filePath) {
|
||||
StringBuilder fileContent = new StringBuilder("");
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
fileContent.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return fileContent.toString();
|
||||
}
|
||||
|
||||
// 这里可以添加其他与微信支付相关的配置方法
|
||||
}
|
Reference in New Issue
Block a user