主题
AES 加/解密示例
java
package com.saudipays.utils;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* RSA签名工具类
*/
public class RSAUtils {
/**
* 私钥签名
* @param data
* @param privateKey
* @return
*/
public static String sign(String data, String privateKey){
try {
byte[] keyBytes = Base64.getDecoder().decode(privateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKeyObj = keyFactory.generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKeyObj);
signature.update(data.getBytes());
byte[] signedBytes = signature.sign();
return Base64.getEncoder().encodeToString(signedBytes);
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException("signature failed");
}
}
/**
* 验证签名
* @param data
* @param signature
* @param publicKey
* @return
*/
public static boolean verify(String data, String signature, String publicKey) {
try {
byte[] keyBytes = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKeyObj = keyFactory.generatePublic(keySpec);
Signature signatureObj = Signature.getInstance("SHA256withRSA");
signatureObj.initVerify(publicKeyObj);
signatureObj.update(data.getBytes());
byte[] signatureBytes = Base64.getDecoder().decode(signature);
return signatureObj.verify(signatureBytes);
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}
package com.saudipays.request;
import com.alibaba.fastjson.JSONObject;
import com.saudipays.entity.InqTranOrderEntity;
import com.saudipays.utils.AESUtils;
import com.saudipays.utils.RSAUtils;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class InqTranOrderDemo {
private static RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
String url= "https://openapi-uat.saudipays.cn/pay/merchant/inquiryTransactions";
ResponseEntity<String> response = null;
try {
InqTranOrderEntity inqTranOrder = new InqTranOrderEntity();
inqTranOrder.setMerCode("M96620240924161327000862");
inqTranOrder.setMerOrderId("");
inqTranOrder.setTrdOrderId("TRD20241231131545000358");
HttpHeaders headers = new HttpHeaders();
// 商户私钥,公钥需要配置到管理平台
String privateKey="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC55Y3+nuJilZMrpN5l9fk4neHn3BmDOhPbWtOP/OLdDBni7b0EF5Pwp12ggKXbjNyXvX46aEExnGmLtPySHNxomH4wQqA57R0oW5fx2iY8XO8XD+2yEqoHmTdONQ2llF0nUlLmpGh/b6RafKKBH0XrIV76ACLlFL6CuyQGJ1qVSN1Y4NbUPURGBcfGO8Hz+3shOLLGlppTSqPLP0K6+x6eSWXDCbCmKZybJoMmhYzi0fdeAf3kgmROxwVCpL6SynxTN7zyujZdcDE5+HFupiVfCPFDp68DzdYGIfMPz1YMLIh9SNOPTQqVaXmtjNx+PaSYqCiJzmxvBjPbwezw60gfAgMBAAECggEADn7Cz37a6JSaZCw35Aifa6jyWFHGP4BEBulFikdN9uFRrdGbcnoJx0yvNUVMXLRwIvjb1d9GB7Tj85VwnrTXaH4Z7aNt7cMto3VfTk5HVJLRv24Dh8yCxSyCSBV4Jr6AQQFFuF9+snXyTjsq5LMBxBYKQafIqmCV6YjnUMxSxavfaLcTZDg/txoTYEKB07niS8dA9sUDVWk23A1E1E5YioOzSeEYWfEEE17xe6su+V5KmhBITqHtEuSRkccxWMvptbKObXQKIV2fx1brobQt5yzJviVUqiu0moi3haOs3VBgXq32wBO9bq72dpZTbGQ9n5qOBvfbuSfewzLbHm6VkQKBgQDcqmj8JYwJ5RNx2Ar5gO1T7mlG7QEJUY4M5InotJ0zXuYU3eTyKMo0BFUlt77ZJ6lR2PyCW554nV6Zg6awNbHsKHOvNBJ4jlY+KnOYFchLQ4HeOSsnA9OO5XPl3oiIZsI5TItIoD4PclU3jsUBNhUwUeQxspzM2n0mBkvXDez2CQKBgQDXqeKabLQ3jkYaI6OCHPcHGps+isO4OHvsEie3bMYtFzLu6JdIJDGR6KxufBkthEAaWwG8ojJ0p3oNMA+LF8pRbSts4FirwREYZNZYsI3MZMDUO+raFPq1v1ZpNfc3PSI1Bws9bGTXAbcsOxhuJaimGX1q6qglSRI9nzJMxHCW5wKBgGRzxvsR9KAEgkeO+9/9CwzsOUyqU5B0aeAAoa8nmXBrQP46zSBX5USsvD5BWUXtwiyaRMjrAEcUDJ6Byf3pU6eX+qHFaKss0KHYHWscb2OjxZjuGXDXUxV36ry4Axtk/AGtkLJtEBNkDtsNySz1+8tVXDYrgynWRKZss1Wg50BRAoGACniXJgRNI71mrfI5CCI75D5odzrpkdI8QhQHlaJUZPARawQkBD6toXX4mUyxNEKNkjoE9ZGyfXN8O5OvzYMUMavpRdoGtCAloleTCK9Z0yi5LBTUrE4EdjqaCXWzUR1IweZbp1nR85aDvEQKRZ7Sd24ZZs2J6HWJyzAlkxCentUCgYEAmAOHIQI6V8aNYT0xOjKOWIAqyI3pPruQ51K43yoo/XhrRLygfDj7ikQdFYd+gN1W3mlsT3EN2Qjz3XhczVOqE1RCn15v3WTydikzXn8pEFmYf9kV2GS11eMTTKYv2UoLqN7j3a74fzfv67xsm5cJlbO6Dt3goBFZMerHdHSf7vY=";
String signature = RSAUtils.sign(JSONObject.toJSONString(inqTranOrder), privateKey);
headers.set("merKeyId", "12345678901");
long currentTime = new Date().getTime()/1000;
headers.set("timeStamp", String.valueOf(currentTime));
headers.set("signature", signature);
headers.set("Content-Type", "application/json");
//平台提供的aeskey
String aeskey="1af9206a4d0bd6becdbe188379a5f65d";
String encrypt = AESUtils.encrypt(JSONObject.toJSONString(inqTranOrder), aeskey);
Map<String,String> map = new HashMap<>();
map.put("aesBuffer",encrypt);
HttpEntity<String> entity = new HttpEntity<>(JSONObject.toJSONString(map),headers);
response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
HttpStatus statusCode = response.getStatusCode();
System.out.println("resp statusCode:"+statusCode.value());
JsonObject responseJSON = new Gson().fromJson(response.getBody(), JsonObject.class);
if("10000".equals(responseJSON.get("code").getAsString())){
String data = responseJSON.get("data").getAsString();
String decrypt = AESUtils.decrypt(data, aeskey);
System.out.println("resp decData:"+ decrypt );
HttpHeaders responseHeaders = response.getHeaders();
//平台提供的公钥
String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueWN/p7iYpWTK6TeZfX5OJ3h59wZgzoT21rTj/zi3QwZ4u29BBeT8KddoICl24zcl71+OmhBMZxpi7T8khzcaJh+MEKgOe0dKFuX8domPFzvFw/tshKqB5k3TjUNpZRdJ1JS5qRof2+kWnyigR9F6yFe+gAi5RS+grskBidalUjdWODW1D1ERgXHxjvB8/t7ITiyxpaaU0qjyz9CuvsenkllwwmwpimcmyaDJoWM4tH3XgH95IJkTscFQqS+ksp8Uze88ro2XXAxOfhxbqYlXwjxQ6evA83WBiHzD89WDCyIfUjTj00KlWl5rYzcfj2kmKgoic5sbwYz28Hs8OtIHwIDAQAB";
boolean signatureStatus = RSAUtils.verify(decrypt, responseHeaders.get("signature").get(0), publicKey);
if(signatureStatus){
System.out.println("sign:验签成功");
}else{
System.out.println("sign:验签失败");
}
};
System.out.println("resp:"+response.getBody());
}catch (Exception e){
e.printStackTrace();
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
