支付模块-下单接口

This commit is contained in:
2024-12-24 17:39:49 +08:00
parent b7eec65e6d
commit 27eac91d1c
21 changed files with 658 additions and 1 deletions

View File

@ -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);
}
}
}

View File

@ -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-----

View File

@ -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();
}
// 这里可以添加其他与微信支付相关的配置方法
}